From 10b7307141b1f48d069bd3f5a7644e95b03b4fc7 Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Tue, 25 Jan 2022 10:36:42 +0400 Subject: [PATCH] Build --- .env | 4 ++-- ...7f00ae75e442.chunk.js => 0.8d087bcb865339158351.chunk.js} | 4 ++-- ...e442.chunk.js.map => 0.8d087bcb865339158351.chunk.js.map} | 2 +- ...01f9ca3e3cf5.chunk.js => 1.99b84ec019c74ae469a1.chunk.js} | 4 ++-- ...3cf5.chunk.js.map => 1.99b84ec019c74ae469a1.chunk.js.map} | 2 +- ...735d3f9b2f9.chunk.js => 12.28d471f14ee77650d243.chunk.js} | 4 ++-- ...2f9.chunk.js.map => 12.28d471f14ee77650d243.chunk.js.map} | 2 +- ...22f5893ae52.chunk.js => 13.6f53ed67b434abfeb8b3.chunk.js} | 4 ++-- ...e52.chunk.js.map => 13.6f53ed67b434abfeb8b3.chunk.js.map} | 2 +- public/14.6aa9cb644edbb8b0e00a.chunk.js | 2 -- public/14.6aa9cb644edbb8b0e00a.chunk.js.map | 1 - public/14.e0b3ee5569e2564c790f.chunk.js | 2 ++ public/14.e0b3ee5569e2564c790f.chunk.js.map | 1 + ...f679564532a.chunk.js => 15.b14001265d6da1e62429.chunk.js} | 4 ++-- ...32a.chunk.js.map => 15.b14001265d6da1e62429.chunk.js.map} | 2 +- ...f3f32baf9f1.chunk.js => 16.1587e222e41a6d3aa087.chunk.js} | 4 ++-- ...9f1.chunk.js.map => 16.1587e222e41a6d3aa087.chunk.js.map} | 2 +- ...0f53609fdd3.chunk.js => 18.33a13d3129fb705afcd7.chunk.js} | 4 ++-- ...dd3.chunk.js.map => 18.33a13d3129fb705afcd7.chunk.js.map} | 2 +- ...3a93b466714.chunk.js => 19.577567d0b0e7b3f9570b.chunk.js} | 4 ++-- ...714.chunk.js.map => 19.577567d0b0e7b3f9570b.chunk.js.map} | 2 +- ...c1179401e843.chunk.js => 2.53fa88cb7bccd9cf2f74.chunk.js} | 4 ++-- ...e843.chunk.js.map => 2.53fa88cb7bccd9cf2f74.chunk.js.map} | 2 +- ...3e77acba97b.chunk.js => 25.ba804e71a7bf44cd8cd0.chunk.js} | 4 ++-- ...97b.chunk.js.map => 25.ba804e71a7bf44cd8cd0.chunk.js.map} | 2 +- ...4ad3195165a3.chunk.js => 5.4c631eb421e5df7ab421.chunk.js} | 4 ++-- ...65a3.chunk.js.map => 5.4c631eb421e5df7ab421.chunk.js.map} | 2 +- ...ca587373fceb.chunk.js => 6.02b679f962719848ba99.chunk.js} | 4 ++-- ...fceb.chunk.js.map => 6.02b679f962719848ba99.chunk.js.map} | 2 +- public/8.08583f871c38d9c5a426.chunk.js.map | 1 - ...1c38d9c5a426.chunk.js => 8.f871e2581e2cce7ecaef.chunk.js} | 4 ++-- public/8.f871e2581e2cce7ecaef.chunk.js.map | 1 + public/index.html | 4 ++-- public/main.624478a518e31a4f8433.css | 5 ----- public/main.624478a518e31a4f8433.css.map | 1 - public/main.9c67b3d788e233efd43d.css | 5 +++++ public/main.9c67b3d788e233efd43d.css.map | 1 + ...f214638.bundle.js => main.e6c3f7635c825540f276.bundle.js} | 4 ++-- ...bundle.js.map => main.e6c3f7635c825540f276.bundle.js.map} | 2 +- ... => mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js} | 4 ++-- ...mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map} | 2 +- public/sw.js | 2 +- public/version | 1 + 43 files changed, 60 insertions(+), 59 deletions(-) rename public/{0.374e7aee7f00ae75e442.chunk.js => 0.8d087bcb865339158351.chunk.js} (98%) rename public/{0.374e7aee7f00ae75e442.chunk.js.map => 0.8d087bcb865339158351.chunk.js.map} (99%) rename public/{1.492b807a01f9ca3e3cf5.chunk.js => 1.99b84ec019c74ae469a1.chunk.js} (99%) rename public/{1.492b807a01f9ca3e3cf5.chunk.js.map => 1.99b84ec019c74ae469a1.chunk.js.map} (99%) rename public/{12.88ffeed61735d3f9b2f9.chunk.js => 12.28d471f14ee77650d243.chunk.js} (99%) rename public/{12.88ffeed61735d3f9b2f9.chunk.js.map => 12.28d471f14ee77650d243.chunk.js.map} (99%) rename public/{13.20324e79c22f5893ae52.chunk.js => 13.6f53ed67b434abfeb8b3.chunk.js} (99%) rename public/{13.20324e79c22f5893ae52.chunk.js.map => 13.6f53ed67b434abfeb8b3.chunk.js.map} (99%) delete mode 100644 public/14.6aa9cb644edbb8b0e00a.chunk.js delete mode 100644 public/14.6aa9cb644edbb8b0e00a.chunk.js.map create mode 100644 public/14.e0b3ee5569e2564c790f.chunk.js create mode 100644 public/14.e0b3ee5569e2564c790f.chunk.js.map rename public/{15.e99c07b61f679564532a.chunk.js => 15.b14001265d6da1e62429.chunk.js} (99%) rename public/{15.e99c07b61f679564532a.chunk.js.map => 15.b14001265d6da1e62429.chunk.js.map} (99%) rename public/{16.1fd991b3cf3f32baf9f1.chunk.js => 16.1587e222e41a6d3aa087.chunk.js} (98%) rename public/{16.1fd991b3cf3f32baf9f1.chunk.js.map => 16.1587e222e41a6d3aa087.chunk.js.map} (99%) rename public/{18.25e70e3100f53609fdd3.chunk.js => 18.33a13d3129fb705afcd7.chunk.js} (99%) rename public/{18.25e70e3100f53609fdd3.chunk.js.map => 18.33a13d3129fb705afcd7.chunk.js.map} (99%) rename public/{19.5ca6388c23a93b466714.chunk.js => 19.577567d0b0e7b3f9570b.chunk.js} (94%) rename public/{19.5ca6388c23a93b466714.chunk.js.map => 19.577567d0b0e7b3f9570b.chunk.js.map} (97%) rename public/{2.db718300c1179401e843.chunk.js => 2.53fa88cb7bccd9cf2f74.chunk.js} (99%) rename public/{2.db718300c1179401e843.chunk.js.map => 2.53fa88cb7bccd9cf2f74.chunk.js.map} (99%) rename public/{25.92c7213c63e77acba97b.chunk.js => 25.ba804e71a7bf44cd8cd0.chunk.js} (96%) rename public/{25.92c7213c63e77acba97b.chunk.js.map => 25.ba804e71a7bf44cd8cd0.chunk.js.map} (99%) rename public/{5.65a3414c4ad3195165a3.chunk.js => 5.4c631eb421e5df7ab421.chunk.js} (95%) rename public/{5.65a3414c4ad3195165a3.chunk.js.map => 5.4c631eb421e5df7ab421.chunk.js.map} (99%) rename public/{6.e3732f1eca587373fceb.chunk.js => 6.02b679f962719848ba99.chunk.js} (98%) rename public/{6.e3732f1eca587373fceb.chunk.js.map => 6.02b679f962719848ba99.chunk.js.map} (99%) delete mode 100644 public/8.08583f871c38d9c5a426.chunk.js.map rename public/{8.08583f871c38d9c5a426.chunk.js => 8.f871e2581e2cce7ecaef.chunk.js} (56%) create mode 100644 public/8.f871e2581e2cce7ecaef.chunk.js.map delete mode 100644 public/main.624478a518e31a4f8433.css delete mode 100644 public/main.624478a518e31a4f8433.css.map create mode 100644 public/main.9c67b3d788e233efd43d.css create mode 100644 public/main.9c67b3d788e233efd43d.css.map rename public/{main.057ba0ad34ac8f214638.bundle.js => main.e6c3f7635c825540f276.bundle.js} (88%) rename public/{main.057ba0ad34ac8f214638.bundle.js.map => main.e6c3f7635c825540f276.bundle.js.map} (98%) rename public/{mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js => mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js} (99%) rename public/{mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js.map => mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map} (99%) create mode 100644 public/version diff --git a/.env b/.env index 3c07a249a..35a5ed278 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 VERSION=1.0.4 -VERSION_FULL=1.0.4 (77) -BUILD=77 +VERSION_FULL=1.0.4 (81) +BUILD=81 diff --git a/public/0.374e7aee7f00ae75e442.chunk.js b/public/0.8d087bcb865339158351.chunk.js similarity index 98% rename from public/0.374e7aee7f00ae75e442.chunk.js rename to public/0.8d087bcb865339158351.chunk.js index 71e60af6c..7500f9219 100644 --- a/public/0.374e7aee7f00ae75e442.chunk.js +++ b/public/0.8d087bcb865339158351.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[0,22],{119:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"e",(function(){return l})),r.d(t,"d",(function(){return h}));const s="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,n="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!s,i=n||s,o=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(r=>{r.length&&r.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},c=(...e)=>{self.postMessage(...e)},a=()=>{},l=s?o.bind(null,!1):n?c:a,h=s?o.bind(null,!0):n?c:a},128:function(e,t,r){"use strict";t.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},15:function(e,t,r){"use strict";r.r(t),r.d(t,"RootScope",(function(){return o}));var s=r(47),n=r(48),i=r(29);class o extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof s.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;i.a.rootScope=c,t.default=c},151:function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var s=r(63),n=r(98),i=r(31),o=r(37);class c{constructor(e,t){this.storageIsAvailable=!0,Object(i.g)(this,e),s.a.test&&(this.name+="_test"),this.storeName=t,this.log=Object(o.b)("IDB-"+this.storeName),this.openDatabase(!0),c.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const r=t.db;r&&(r.onclose=()=>{},r.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let r=!1;return setTimeout(()=>{r||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,s)=>{t.onsuccess=n=>{r=!0;const i=t.result;let o=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},i.onclose=e=>{this.log.error("closed:",e),!o&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(o=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{r=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},t.onupgradeneeded=e=>{r=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var r;const s=e.createObjectStore(t.name);if(null===(r=t.indexes)||void 0===r?void 0:r.length)for(const e of t.indexes)s.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",r=>e.map((e,s)=>r.put(t[s],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Object(n.a)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,r,s=this.storeName){let n;return r&&(n=performance.now(),this.log(r+": start")),this.openDatabase().then(i=>new Promise((o,c)=>{const a=i.transaction([s],e);a.onerror=e=>{clearTimeout(l),c(a.error)},a.oncomplete=e=>{clearTimeout(l),r&&this.log(r+": end",performance.now()-n);const t=d.map(e=>e.result);o(u?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",a)},1e4),h=t(a.objectStore(s)),u=Array.isArray(h),d=u?h:[].concat(h)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}c.STORAGES=[]},29:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));const s=r(63).a.debug,n="undefined"!=typeof window?window:self;t.b=s},31:function(e,t,r){"use strict";function s(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){return e.map(e=>s(e))}let t=new e.constructor;for(var r in e)e.hasOwnProperty(r)&&(t[r]=s(e[r]));return t}function n(e,t){const r=Object.keys,s=typeof e;return e&&t&&"object"===s&&s===typeof t?r(e).length===r(t).length&&r(e).every(r=>n(e[r],t[r])):e===t}function i(e,t){const r={writable:!0,configurable:!0},s={};t.forEach(t=>{e.hasOwnProperty(t)||(s[t]=r)}),Object.defineProperties(e,s)}function o(e,t="asc"){if(!e)return[];const r=e instanceof Map?[...e.keys()]:Object.keys(e).map(e=>+e);return"asc"===t?r.sort((e,t)=>e-t):r.sort((e,t)=>t-e)}function c(e,t){if(!e)return t;for(var r in e)t.hasOwnProperty(r)||delete e[r];for(var r in t)e[r]=t[r];return e}function a(e,t,r){"byteLength"in r[e]&&(r[e]=[...r[e]]),t&&t[e]!==r[e]&&(t[e].length=r[e].length,r[e].forEach((r,s)=>{t[e][s]=r}),r[e]=t[e])}function l(e){return"object"==typeof e&&null!==e}function h(e,t){const r=t.split(".");let s=e;return r.forEach(e=>{e&&(s=s[e])}),s}function u(e,t,r){const s=t.split(".");h(e,s.slice(0,-1).join("."))[s.pop()]=r}function d(e,t,r,n){for(const i in e)typeof t[i]!=typeof e[i]?(t[i]=s(e[i]),r&&r(n||i)):l(e[i])&&d(e[i],t[i],r,n||i)}function f(e,t){if(t)for(let r in t)void 0!==t[r]&&(e[r]=t[r]);return e}r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"e",(function(){return o})),r.d(t,"i",(function(){return c})),r.d(t,"h",(function(){return a})),r.d(t,"f",(function(){return l})),r.d(t,"d",(function(){return h})),r.d(t,"j",(function(){return u})),r.d(t,"k",(function(){return d})),r.d(t,"g",(function(){return f}))},37:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return v}));var s,n=r(29),i=r(0),o=r(119);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(s||(s={}));const c=[s.None,s.Error,s.Warn,s.Log,s.Debug],a=Date.now();function l(){return"["+((Date.now()-a)/1e3).toFixed(3)+"]"}let h;const u=i.IS_SAFARI||i.IS_FIREFOX;h=u?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const d=!u,f=u?2:3;function g(){const e=(new Error).stack.split("\n"),t=e[f]||e[e.length-1];return"["+(h(t)||"")+"]"}const m={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},p=[["debug",s.Debug],["info",s.Log],["warn",s.Warn],["error",s.Error],["assert",s.Error],["trace",s.Log]];function v(e,t=s.Log|s.Warn|s.Error,r=!1,i=""){let a;n.b||r||(t=s.Error),d?i||(o.a?i=m.yellow:o.b&&(i=m.cyan)):i="";let h=i;i=i?`%s ${i}%s`:"%s";const u=function(...r){return t&s.Log&&console.log(i,l(),e,g(),...r)};return p.forEach(([r,s])=>{u[r]=function(...n){return t&s&&console[r](i,l(),e,g(),...n)}}),u.setPrefix=function(t){a=t,e="["+t+"]"},u.setPrefix(e),u.setLevel=function(e){t=c.slice(0,e+1).reduce((e,t)=>e|t,0)},u.bindPrefix=function(e){return v(`${a}] [${e}`,t,r,h)},u}},45:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var s=r(76);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((r,s)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,r(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,s(...e))}});return t.catch(s.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},47:function(e,t,r){"use strict";r.d(t,"c",(function(){return s})),r.d(t,"d",(function(){return n})),r.d(t,"e",(function(){return i})),r.d(t,"b",(function(){return o})),r.d(t,"a",(function(){return c}));const s=0,n=1271266957,i=777e3,o=2147483647,c=""},48:function(e,t,r){"use strict";r.d(t,"a",(function(){return s}));class s{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,r){var s,n;(null!==(s=this.listeners[e])&&void 0!==s?s:this.listeners[e]=[]).push({callback:t,options:r}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=r)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,r){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...r){this.reuseResults&&(this.listenerResults[e]=r);const s=t&&[],n=this.listeners[e];if(n){n.slice().forEach(t=>{var i;if(-1===n.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...r)}catch(e){console.error(e)}s&&s.push(o),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return s}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},61:function(e,t,r){"use strict";r.d(t,"a",(function(){return n})),r.d(t,"b",(function(){return i}));const s={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function n(e){const t=s[e];return crypto.getRandomValues(t),t[0]}function i(){return""+n(32)+n(32)%16777215}},62:function(e,t,r){"use strict";var s=r(29),n=r(63),i=r(119);class o{constructor(){this.prefix="",this.cache={},this.useStorage=!0,n.a.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];if(this.cache[r]=s,this.useStorage&&!t)try{const e=JSON.stringify(s);localStorage.setItem(this.prefix+r,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class c{constructor(){this.taskId=0,this.tasks={},c.STORAGES.push(this),i.c||(this.storage=new o)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((r,s)=>{if(i.c){const s=this.taskId++;this.tasks[s]=r;const n={type:"localStorageProxy",id:s,payload:{type:e,args:t}};Object(i.e)(n)}else{t=Array.prototype.slice.call(t);r(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}c.STORAGES=[];const a=new c;s.a.appStorage=a;t.a=a},63:function(e,t,r){"use strict";const s={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};s.http=location.search.indexOf("http=1")>0,s.http&&(s.transport="https"),t.a=s},76:function(e,t,r){"use strict";function s(){}r.d(t,"a",(function(){return s}))},87:function(e,t,r){"use strict";var s=r(29),n=r(92),i=r(128);const o=new n.a(i.a,"session");s.a.stateStorage=o,t.a=o},92:function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var s=r(45),n=r(97),i=r(151),o=function(e,t,r,s){return new(r||(r=Promise))((function(n,i){function o(e){try{a(s.next(e))}catch(e){i(e)}}function c(e){try{a(s.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,c)}a((s=s.apply(e,t||[])).next())}))};function c(){}class a{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(s.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(s.a)(),this.storage=new i.a(e,t),a.STORAGES.length?this.useStorage=a.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,a.STORAGES.push(this),this.saveThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=Object(s.a)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map(e=>this.cache[e]);yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=Object(s.a)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then(t=>{for(let r=0,s=e.length;r{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(r)||(this.useStorage=!1,console.error("[AS]: get error:",r,e,t));for(let t=0,r=e.length;t{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return o(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const r=Object(s.a)();return this.getPromises.set(e,r),this.getThrottled(),r}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(e,t=!1){const r=this.useStorage&&!t&&!this.savingFreezed;for(const t in e)if(e.hasOwnProperty(t)){const s=e[t];this.setToCache(t,s),r&&(this.keysToSet.add(t),this.keysToDelete.delete(t),this.saveThrottled())}return r?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(c)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach(e=>e.resolve(void 0)),t.getPromises.clear(),t.clear(!0))))).catch(c)}static freezeSaving(e,t){this.STORAGES.forEach(e=>e.savingFreezed=!0);try{e()}catch(e){}this.STORAGES.forEach(e=>e.savingFreezed=!1)}}a.STORAGES=[]},97:function(e,t,r){"use strict";function s(e,t,r=!0){let s,n,i=null;return(...o)=>{s=!0,n=o,i||(r&&(s=!1,e(...n)),i=setInterval(()=>{if(!s)return clearInterval(i),void(i=null);s=!1,e(...n)},t))}}r.d(t,"a",(function(){return s}))},98:function(e,t,r){"use strict";function s(e,t){return new Promise(r=>{const s=new FileReader;s.addEventListener("loadend",e=>r(e.target.result)),s[t](e)})}function n(e){return s(e,"readAsText")}function i(e){return s(e,"readAsDataURL")}function o(e){return function(e){return s(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function c(e,t=""){let r;const s=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{r=new Blob(e,{type:s})}catch(t){let n=new BlobBuilder;e.forEach(e=>{n.append(e)}),r=n.getBlob(s)}return r}r.d(t,"c",(function(){return n})),r.d(t,"b",(function(){return i})),r.d(t,"d",(function(){return o})),r.d(t,"a",(function(){return c}))}}]); -//# sourceMappingURL=0.374e7aee7f00ae75e442.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[0,22],{119:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"e",(function(){return l})),r.d(t,"d",(function(){return h}));const s="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,n="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!s,i=n||s,o=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(r=>{r.length&&r.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},c=(...e)=>{self.postMessage(...e)},a=()=>{},l=s?o.bind(null,!1):n?c:a,h=s?o.bind(null,!0):n?c:a},128:function(e,t,r){"use strict";t.a={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},15:function(e,t,r){"use strict";r.r(t),r.d(t,"RootScope",(function(){return o}));var s=r(47),n=r(48),i=r(29);class o extends n.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof s.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;i.a.rootScope=c,t.default=c},151:function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var s=r(63),n=r(98),i=r(31),o=r(37);class c{constructor(e,t){this.storageIsAvailable=!0,Object(i.g)(this,e),s.a.test&&(this.name+="_test"),this.storeName=t,this.log=Object(o.b)("IDB-"+this.storeName),this.openDatabase(!0),c.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const r=t.db;r&&(r.onclose=()=>{},r.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let r=!1;return setTimeout(()=>{r||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,s)=>{t.onsuccess=n=>{r=!0;const i=t.result;let o=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},i.onclose=e=>{this.log.error("closed:",e),!o&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(o=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{r=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),s(e)},t.onupgradeneeded=e=>{r=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var r;const s=e.createObjectStore(t.name);if(null===(r=t.indexes)||void 0===r?void 0:r.length)for(const e of t.indexes)s.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",r=>e.map((e,s)=>r.put(t[s],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Object(n.a)([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,r,s=this.storeName){let n;return r&&(n=performance.now(),this.log(r+": start")),this.openDatabase().then(i=>new Promise((o,c)=>{const a=i.transaction([s],e);a.onerror=e=>{clearTimeout(l),c(a.error)},a.oncomplete=e=>{clearTimeout(l),r&&this.log(r+": end",performance.now()-n);const t=d.map(e=>e.result);o(u?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",a)},1e4),h=t(a.objectStore(s)),u=Array.isArray(h),d=u?h:[].concat(h)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}c.STORAGES=[]},29:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));const s=r(63).a.debug,n="undefined"!=typeof window?window:self;t.b=s},31:function(e,t,r){"use strict";function s(e){if(null===e||"object"!=typeof e)return e;if(e instanceof Date)return new Date(e.getTime());if(Array.isArray(e)){return e.map(e=>s(e))}let t=new e.constructor;for(var r in e)e.hasOwnProperty(r)&&(t[r]=s(e[r]));return t}function n(e,t){const r=Object.keys,s=typeof e;return e&&t&&"object"===s&&s===typeof t?r(e).length===r(t).length&&r(e).every(r=>n(e[r],t[r])):e===t}function i(e,t){const r={writable:!0,configurable:!0},s={};t.forEach(t=>{e.hasOwnProperty(t)||(s[t]=r)}),Object.defineProperties(e,s)}function o(e,t="asc"){if(!e)return[];const r=e instanceof Map?[...e.keys()]:Object.keys(e).map(e=>+e);return"asc"===t?r.sort((e,t)=>e-t):r.sort((e,t)=>t-e)}function c(e,t){if(!e)return t;for(var r in e)t.hasOwnProperty(r)||delete e[r];for(var r in t)e[r]=t[r];return e}function a(e,t,r){"byteLength"in r[e]&&(r[e]=[...r[e]]),t&&t[e]!==r[e]&&(t[e].length=r[e].length,r[e].forEach((r,s)=>{t[e][s]=r}),r[e]=t[e])}function l(e){return"object"==typeof e&&null!==e}function h(e,t){const r=t.split(".");let s=e;return r.forEach(e=>{e&&(s=s[e])}),s}function u(e,t,r){const s=t.split(".");h(e,s.slice(0,-1).join("."))[s.pop()]=r}function d(e,t,r,n){for(const i in e)typeof t[i]!=typeof e[i]?(t[i]=s(e[i]),r&&r(n||i)):l(e[i])&&d(e[i],t[i],r,n||i)}function f(e,t){if(t)for(let r in t)void 0!==t[r]&&(e[r]=t[r]);return e}r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return n})),r.d(t,"c",(function(){return i})),r.d(t,"e",(function(){return o})),r.d(t,"i",(function(){return c})),r.d(t,"h",(function(){return a})),r.d(t,"f",(function(){return l})),r.d(t,"d",(function(){return h})),r.d(t,"j",(function(){return u})),r.d(t,"k",(function(){return d})),r.d(t,"g",(function(){return f}))},37:function(e,t,r){"use strict";r.d(t,"a",(function(){return s})),r.d(t,"b",(function(){return v}));var s,n=r(29),i=r(0),o=r(119);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(s||(s={}));const c=[s.None,s.Error,s.Warn,s.Log,s.Debug],a=Date.now();function l(){return"["+((Date.now()-a)/1e3).toFixed(3)+"]"}let h;const u=i.IS_SAFARI||i.IS_FIREFOX;h=u?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const d=!u,f=u?2:3;function g(){const e=(new Error).stack.split("\n"),t=e[f]||e[e.length-1];return"["+(h(t)||"")+"]"}const m={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},p=[["debug",s.Debug],["info",s.Log],["warn",s.Warn],["error",s.Error],["assert",s.Error],["trace",s.Log]];function v(e,t=s.Log|s.Warn|s.Error,r=!1,i=""){let a;n.b||r||(t=s.Error),d?i||(o.a?i=m.yellow:o.b&&(i=m.cyan)):i="";let h=i;i=i?`%s ${i}%s`:"%s";const u=function(...r){return t&s.Log&&console.log(i,l(),e,g(),...r)};return p.forEach(([r,s])=>{u[r]=function(...n){return t&s&&console[r](i,l(),e,g(),...n)}}),u.setPrefix=function(t){a=t,e="["+t+"]"},u.setPrefix(e),u.setLevel=function(e){t=c.slice(0,e+1).reduce((e,t)=>e|t,0)},u.bindPrefix=function(e){return v(`${a}] [${e}`,t,r,h)},u}},45:function(e,t,r){"use strict";r.d(t,"a",(function(){return n}));var s=r(70);function n(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((r,s)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,r(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,s(...e))}});return t.catch(s.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},47:function(e,t,r){"use strict";r.d(t,"c",(function(){return s})),r.d(t,"d",(function(){return n})),r.d(t,"e",(function(){return i})),r.d(t,"b",(function(){return o})),r.d(t,"a",(function(){return c}));const s=0,n=1271266957,i=777e3,o=2147483647,c=""},48:function(e,t,r){"use strict";r.d(t,"a",(function(){return s}));class s{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,r){var s,n;(null!==(s=this.listeners[e])&&void 0!==s?s:this.listeners[e]=[]).push({callback:t,options:r}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(n=r)||void 0===n?void 0:n.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,r){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...r){this.reuseResults&&(this.listenerResults[e]=r);const s=t&&[],n=this.listeners[e];if(n){n.slice().forEach(t=>{var i;if(-1===n.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...r)}catch(e){console.error(e)}s&&s.push(o),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return s}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},61:function(e,t,r){"use strict";r.d(t,"a",(function(){return n})),r.d(t,"b",(function(){return i}));const s={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function n(e){const t=s[e];return crypto.getRandomValues(t),t[0]}function i(){return""+n(32)+n(32)%16777215}},62:function(e,t,r){"use strict";var s=r(29),n=r(63),i=r(119);class o{constructor(){this.prefix="",this.cache={},this.useStorage=!0,n.a.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const r in e)if(e.hasOwnProperty(r)){const s=e[r];if(this.cache[r]=s,this.useStorage&&!t)try{const e=JSON.stringify(s);localStorage.setItem(this.prefix+r,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class c{constructor(){this.taskId=0,this.tasks={},c.STORAGES.push(this),i.c||(this.storage=new o)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((r,s)=>{if(i.c){const s=this.taskId++;this.tasks[s]=r;const n={type:"localStorageProxy",id:s,payload:{type:e,args:t}};Object(i.e)(n)}else{t=Array.prototype.slice.call(t);r(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}c.STORAGES=[];const a=new c;s.a.appStorage=a;t.a=a},63:function(e,t,r){"use strict";const s={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};s.http=location.search.indexOf("http=1")>0,s.http&&(s.transport="https"),t.a=s},70:function(e,t,r){"use strict";function s(){}r.d(t,"a",(function(){return s}))},87:function(e,t,r){"use strict";var s=r(29),n=r(92),i=r(128);const o=new n.a(i.a,"session");s.a.stateStorage=o,t.a=o},92:function(e,t,r){"use strict";r.d(t,"a",(function(){return a}));var s=r(45),n=r(97),i=r(151),o=function(e,t,r,s){return new(r||(r=Promise))((function(n,i){function o(e){try{a(s.next(e))}catch(e){i(e)}}function c(e){try{a(s.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(o,c)}a((s=s.apply(e,t||[])).next())}))};function c(){}class a{constructor(e,t){this.db=e,this.storeName=t,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=Object(s.a)(),this.keysToDelete=new Set,this.deleteDeferred=Object(s.a)(),this.storage=new i.a(e,t),a.STORAGES.length?this.useStorage=a.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,a.STORAGES.push(this),this.saveThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=this.saveDeferred;this.saveDeferred=Object(s.a)();const t=this.keysToSet;if(t.size){const e=Array.from(t.values());t.clear();try{const t=e.map(e=>this.cache[e]);yield this.storage.save(e,t)}catch(t){console.error("[AS]: set error:",t,e)}}e.resolve(),t.size&&this.saveThrottled()})),16,!1),this.deleteThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=this.deleteDeferred;this.deleteDeferred=Object(s.a)();const t=this.keysToDelete;if(t.size){const e=Array.from(t.values());t.clear();try{yield this.storage.delete(e)}catch(t){console.error("[AS]: delete error:",t,e)}}e.resolve(),t.size&&this.deleteThrottled()})),16,!1),this.getThrottled=Object(n.a)(()=>o(this,void 0,void 0,(function*(){const e=Array.from(this.getPromises.keys());this.storage.get(e).then(t=>{for(let r=0,s=e.length;r{["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(r)||(this.useStorage=!1,console.error("[AS]: get error:",r,e,t));for(let t=0,r=e.length;t{this.getPromises.size&&this.getThrottled()})})),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(e){return this.cache[e]}setToCache(e,t){return this.cache[e]=t}get(e,t=!0){return o(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(e)&&t)return this.getFromCache(e);if(this.useStorage){const t=this.getPromises.get(e);if(t)return t;const r=Object(s.a)();return this.getPromises.set(e,r),this.getThrottled(),r}}))}getAll(){return this.storage.getAll().catch(()=>[])}set(e,t=!1){const r=this.useStorage&&!t&&!this.savingFreezed;for(const t in e)if(e.hasOwnProperty(t)){const s=e[t];this.setToCache(t,s),r&&(this.keysToSet.add(t),this.keysToDelete.delete(t),this.saveThrottled())}return r?this.saveDeferred:Promise.resolve()}delete(e,t=!1){return e=""+e,t||delete this.cache[e],this.useStorage&&(this.keysToSet.delete(e),this.keysToDelete.add(e),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(e=!1){if(!e)for(const e in this.cache)delete this.cache[e];return this.storage.clear().catch(c)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>(t.useStorage=e,e?t.set(t.cache):(t.keysToSet.clear(),t.keysToDelete.clear(),t.getPromises.forEach(e=>e.resolve(void 0)),t.getPromises.clear(),t.clear(!0))))).catch(c)}static freezeSaving(e,t){this.STORAGES.forEach(e=>e.savingFreezed=!0);try{e()}catch(e){}this.STORAGES.forEach(e=>e.savingFreezed=!1)}}a.STORAGES=[]},97:function(e,t,r){"use strict";function s(e,t,r=!0){let s,n,i=null;return(...o)=>{s=!0,n=o,i||(r&&(s=!1,e(...n)),i=setInterval(()=>{if(!s)return clearInterval(i),void(i=null);s=!1,e(...n)},t))}}r.d(t,"a",(function(){return s}))},98:function(e,t,r){"use strict";function s(e,t){return new Promise(r=>{const s=new FileReader;s.addEventListener("loadend",e=>r(e.target.result)),s[t](e)})}function n(e){return s(e,"readAsText")}function i(e){return s(e,"readAsDataURL")}function o(e){return function(e){return s(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function c(e,t=""){let r;const s=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{r=new Blob(e,{type:s})}catch(t){let n=new BlobBuilder;e.forEach(e=>{n.append(e)}),r=n.getBlob(s)}return r}r.d(t,"c",(function(){return n})),r.d(t,"b",(function(){return i})),r.d(t,"d",(function(){return o})),r.d(t,"a",(function(){return c}))}}]); +//# sourceMappingURL=0.8d087bcb865339158351.chunk.js.map \ No newline at end of file diff --git a/public/0.374e7aee7f00ae75e442.chunk.js.map b/public/0.8d087bcb865339158351.chunk.js.map similarity index 99% rename from public/0.374e7aee7f00ae75e442.chunk.js.map rename to public/0.8d087bcb865339158351.chunk.js.map index 47326da1d..e81d978ac 100644 --- a/public/0.374e7aee7f00ae75e442.chunk.js.map +++ b/public/0.8d087bcb865339158351.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/context.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/lib/idb.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/logger.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/random.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/lib/storage.ts","webpack:///./src/helpers/schedulers/throttle.ts","webpack:///./src/helpers/blob.ts"],"names":["IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","args","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","notifySomeone","bind","notifyAll","name","version","stores","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","IDBStorage","db","storeName","storageIsAvailable","test","log","openDatabase","STORAGES","push","preserve","storage","onclose","close","createNew","openDbPromise","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","event","result","calledNew","e","onabort","transaction","target","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","Array","isArray","concat","getObjectStore","objectStore","map","delete","clear","idx","put","fileName","blob","Blob","save","get","mode","perf","performance","now","clearTimeout","timeout","oncomplete","results","r","requests","getAll","DEBUG","debug","MOUNT_CLASS_TO","copy","obj","Date","getTime","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","Object","keys","tx","every","key","defineNotNumerableProperties","names","props","writable","configurable","out","defineProperties","getObjectKeysAndSort","object","sort","ids","Map","i","a","b","safeReplaceObject","wasObject","newObject","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","join","pop","validateInitObject","initObject","currentObject","onReplace","previousKey","safeAssign","fromObject","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","bindPrefix","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","callback","addNotifyListener","deferred","catch","finally","cancel","assign","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listenerResults","options","once","findAndSplice","l","collectResults","arr","findIndex","removeEventListener","_dispatchEvent","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","cache","useStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","enabled","set","taskId","tasks","task","payload","prototype","call","apply","proxy","sessionStorage","appStorage","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","stateStorage","AppStorage","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","size","from","values","deleteThrottled","getThrottled","includes","getFromCache","p","canUseStorage","setToCache","add","throttle","fn","ms","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","readBlobAs","reader","FileReader","readBlobAsText","readBlobAsDataURL","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","append","getBlob"],"mappings":"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","file":"0.374e7aee7f00ae75e442.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\n// import type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: any/* CallInstance */},\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj) {\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/context.ts","webpack:///./src/config/databases/state.ts","webpack:///./src/lib/rootScope.ts","webpack:///./src/lib/idb.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/logger.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/random.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/lib/stateStorage.ts","webpack:///./src/lib/storage.ts","webpack:///./src/helpers/schedulers/throttle.ts","webpack:///./src/helpers/blob.ts"],"names":["IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","args","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","listener","postMessage","notifyWorker","noop","notifySomeone","bind","notifyAll","name","version","stores","RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","IDBStorage","db","storeName","storageIsAvailable","test","log","openDatabase","STORAGES","push","preserve","storage","onclose","close","createNew","openDbPromise","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","event","result","calledNew","e","onabort","transaction","target","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","store","objectStoreNames","contains","os","createObjectStore","indexes","index","createIndex","indexName","keyPath","objectParameters","entryName","Array","isArray","concat","getObjectStore","objectStore","map","delete","clear","idx","put","fileName","blob","Blob","save","get","mode","perf","performance","now","clearTimeout","timeout","oncomplete","results","r","requests","getAll","DEBUG","debug","MOUNT_CLASS_TO","copy","obj","Date","getTime","el","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","Object","keys","tx","every","key","defineNotNumerableProperties","names","props","writable","configurable","out","defineProperties","getObjectKeysAndSort","object","sort","ids","Map","i","a","b","safeReplaceObject","wasObject","newObject","safeReplaceArrayInObject","v","isObject","getDeepProperty","splitted","split","o","setDeepProperty","join","pop","validateInitObject","initObject","currentObject","onReplace","previousKey","safeAssign","fromObject","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","_logTimer","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","trim","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","console","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","bindPrefix","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","callback","addNotifyListener","deferred","catch","finally","cancel","assign","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listenerResults","options","once","findAndSplice","l","collectResults","arr","findIndex","removeEventListener","_dispatchEvent","arrays","8","Uint8Array","16","Uint16Array","32","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","cache","useStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","enabled","set","taskId","tasks","task","payload","prototype","call","apply","proxy","sessionStorage","appStorage","Modes","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","stateStorage","AppStorage","getPromises","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","size","from","values","deleteThrottled","getThrottled","includes","getFromCache","p","canUseStorage","setToCache","add","throttle","fn","ms","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","readBlobAs","reader","FileReader","readBlobAsText","readBlobAsDataURL","readBlobAsUint8Array","readBlobAsArrayBuffer","buffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","bb","BlobBuilder","blobPart","append","getBlob"],"mappings":"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","file":"0.8d087bcb865339158351.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '.';\r\n\r\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\r\n name: 'tweb',\r\n version: 7,\r\n stores: [{\r\n name: 'session'\r\n }, {\r\n name: 'stickerSets'\r\n }, {\r\n name: 'users'\r\n }, {\r\n name: 'chats'\r\n }, {\r\n name: 'dialogs'\r\n }, {\r\n name: 'messages'\r\n }]\r\n};\r\n\r\nexport default DATABASE_STATE;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\n// import type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: any/* CallInstance */},\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj) {\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { ChatSavedPosition } from './appManagers/appImManager';\r\nimport type { State } from './appManagers/appStateManager';\r\nimport type { AppDraftsManager } from './appManagers/appDraftsManager';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport { LangPackDifference } from '../layer';\r\nimport AppStorage from './storage';\r\nimport DATABASE_STATE from '../config/databases/state';\r\n\r\nconst stateStorage = new AppStorage<{\r\n chatPositions: {\r\n [peerId_threadId: string]: ChatSavedPosition\r\n },\r\n langPack: LangPackDifference,\r\n drafts: AppDraftsManager['drafts'],\r\n user_auth: any, // support old webk format\r\n} & State, typeof DATABASE_STATE>(DATABASE_STATE, 'session');\r\nMOUNT_CLASS_TO.stateStorage = stateStorage;\r\nexport default stateStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from \"../config/databases\";\r\n//import DATABASE_SESSION from \"../config/databases/session\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n//import { WorkerTaskTemplate } from \"../types\";\r\nimport IDBStorage from \"./idb\";\r\n\r\nfunction noop() {}\r\n\r\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set',\r\n keys: string[],\r\n values: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'delete',\r\n keys: string[]\r\n }\r\n}; */\r\n\r\nexport default class AppStorage, T extends Database/* Storage extends {[name: string]: any} *//* Storage extends Record */> {\r\n private static STORAGES: AppStorage>[] = [];\r\n private storage: IDBStorage;//new CacheStorageController('session');\r\n\r\n //private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\r\n private cache: Partial = {};\r\n private useStorage: boolean;\r\n private savingFreezed: boolean;\r\n\r\n private getPromises: Map> = new Map();\r\n private getThrottled: () => void;\r\n\r\n private keysToSet: Set = new Set();\r\n private saveThrottled: () => void;\r\n private saveDeferred = deferredPromise();\r\n\r\n private keysToDelete: Set = new Set();\r\n private deleteThrottled: () => void;\r\n private deleteDeferred = deferredPromise();\r\n\r\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\r\n this.storage = new IDBStorage(db, storeName);\r\n\r\n if(AppStorage.STORAGES.length) {\r\n this.useStorage = AppStorage.STORAGES[0].useStorage;\r\n } else {\r\n this.useStorage = true;\r\n }\r\n\r\n this.savingFreezed = false;\r\n\r\n AppStorage.STORAGES.push(this);\r\n\r\n this.saveThrottled = throttle(async() => {\r\n const deferred = this.saveDeferred;\r\n this.saveDeferred = deferredPromise();\r\n\r\n const set = this.keysToSet;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n //console.log('setItem: will set', key/* , value */);\r\n //await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\r\n //await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\r\n\r\n const values = keys.map(key => this.cache[key]);\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'set',\r\n keys,\r\n values\r\n }\r\n } as LocalStorageProxySetTask);\r\n } */\r\n\r\n await this.storage.save(keys, values);\r\n //console.log('setItem: have set', key/* , value */);\r\n } catch(e) {\r\n //this.useCS = false;\r\n console.error('[AS]: set error:', e, keys/* , value */);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.saveThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.deleteThrottled = throttle(async() => {\r\n const deferred = this.deleteDeferred;\r\n this.deleteDeferred = deferredPromise();\r\n\r\n const set = this.keysToDelete;\r\n if(set.size) {\r\n const keys = Array.from(set.values()) as string[];\r\n set.clear();\r\n\r\n try {\r\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\r\n self.postMessage({\r\n type: 'localStorageProxy', \r\n payload: {\r\n type: 'delete',\r\n keys\r\n }\r\n } as LocalStorageProxyDeleteTask);\r\n } */\r\n\r\n await this.storage.delete(keys);\r\n } catch(e) {\r\n console.error('[AS]: delete error:', e, keys);\r\n }\r\n }\r\n\r\n deferred.resolve();\r\n\r\n if(set.size) {\r\n this.deleteThrottled();\r\n }\r\n }, 16, false);\r\n\r\n this.getThrottled = throttle(async() => {\r\n const keys = Array.from(this.getPromises.keys());\r\n\r\n // const perf = performance.now();\r\n this.storage.get(keys as string[]).then(values => {\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n // @ts-ignore\r\n deferred.resolve(this.cache[key] = values[i]);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n\r\n // console.log('[AS]: get time', keys, performance.now() - perf);\r\n }, (error) => {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(error)) {\r\n this.useStorage = false;\r\n console.error('[AS]: get error:', error, keys, storeName);\r\n }\r\n\r\n for(let i = 0, length = keys.length; i < length; ++i) {\r\n const key = keys[i];\r\n const deferred = this.getPromises.get(key);\r\n if(deferred) {\r\n //deferred.reject(error);\r\n deferred.resolve(undefined);\r\n this.getPromises.delete(key);\r\n }\r\n }\r\n }).finally(() => {\r\n if(this.getPromises.size) {\r\n this.getThrottled();\r\n }\r\n });\r\n }, 16, false);\r\n }\r\n\r\n public isAvailable() {\r\n return this.useStorage;\r\n }\r\n\r\n public getCache() {\r\n return this.cache;\r\n }\r\n\r\n public getFromCache(key: T) {\r\n return this.cache[key];\r\n }\r\n\r\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\r\n return this.cache[key] = value;\r\n }\r\n\r\n public async get(key: T, useCache = true): Promise {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.getFromCache(key);\r\n } else if(this.useStorage) {\r\n const r = this.getPromises.get(key);\r\n if(r) return r as any;\r\n\r\n const p = deferredPromise();\r\n this.getPromises.set(key, p as any);\r\n\r\n this.getThrottled();\r\n\r\n return p;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public getAll() {\r\n return this.storage.getAll().catch(() => []);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n //console.log('storageSetValue', obj, callback, arguments);\r\n\r\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.setToCache(key, value);\r\n\r\n // let perf = /* DEBUG */false ? performance.now() : 0;\r\n // value = JSON.stringify(value);\r\n\r\n // if(perf) {\r\n // let elapsedTime = performance.now() - perf;\r\n // if(elapsedTime > 10) {\r\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\r\n // }\r\n // }\r\n \r\n /* perf = performance.now();\r\n value = stringify(value);\r\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\r\n\r\n if(canUseStorage) {\r\n this.keysToSet.add(key);\r\n this.keysToDelete.delete(key);\r\n this.saveThrottled();\r\n }\r\n }\r\n }\r\n\r\n return canUseStorage ? this.saveDeferred : Promise.resolve();\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n /* if(!this.cache.hasOwnProperty(key)) {\r\n return;\r\n } */\r\n\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n if(this.useStorage) {\r\n this.keysToSet.delete(key);\r\n this.keysToDelete.add(key);\r\n this.deleteThrottled();\r\n }\r\n\r\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\r\n }\r\n\r\n public clear(saveLocal = false) {\r\n if(!saveLocal) {\r\n for(const i in this.cache) {\r\n delete this.cache[i];\r\n }\r\n }\r\n\r\n return this.storage.clear().catch(noop);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n storage.keysToSet.clear();\r\n storage.keysToDelete.clear();\r\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\r\n storage.getPromises.clear();\r\n return storage.clear(true);\r\n } else {\r\n return storage.set(storage.cache);\r\n }\r\n })).catch(noop);\r\n }\r\n\r\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\r\n this.STORAGES.forEach(storage => storage.savingFreezed = true);\r\n try {\r\n callback();\r\n } catch(err) {}\r\n this.STORAGES.forEach(storage => storage.savingFreezed = false);\r\n }\r\n\r\n /* public deleteDatabase() {\r\n return IDBStorage.deleteDatabase().catch(noop);\r\n } */\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyToVoidFunction } from \"../../types\";\r\n\r\nexport default function throttle(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n) {\r\n let interval: number | null = null;\r\n let isPending: boolean;\r\n let args: Parameters;\r\n\r\n return (..._args: Parameters) => {\r\n isPending = true;\r\n args = _args;\r\n\r\n if(!interval) {\r\n if(shouldRunFirst) {\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }\r\n\r\n interval = setInterval(() => {\r\n if (!isPending) {\r\n clearInterval(interval!);\r\n interval = null;\r\n return;\r\n }\r\n\r\n isPending = false;\r\n // @ts-ignore\r\n fn(...args);\r\n }, ms) as any;\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/1.492b807a01f9ca3e3cf5.chunk.js b/public/1.99b84ec019c74ae469a1.chunk.js similarity index 99% rename from public/1.492b807a01f9ca3e3cf5.chunk.js rename to public/1.99b84ec019c74ae469a1.chunk.js index 71381bd95..dfe43c1fa 100644 --- a/public/1.492b807a01f9ca3e3cf5.chunk.js +++ b/public/1.99b84ec019c74ae469a1.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{129:function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},130:function(f,e,d){"use strict";d.d(e,"a",(function(){return a}));var t=d(38);function a(f,e,d,a,s=!0){if(fd/a?n=e*d/f|0:(c=f*a/e|0,c>d&&(n=n*d/c|0,c=d)),s&&c>=f&&n>=e&&(c=f,n=e),Object(t.c)(c,n)}d(29).a.calcImageInBox=a},141:function(f,e,d){"use strict";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};e.a=t},142:function(f,e,d){"use strict";function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,"a",(function(){return t}))},143:function(f,e,d){"use strict";var t=d(29);const a={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0},LatinizeMap:{"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","Dz":"D","Dž":"D","Đ":"D","Ƌ":"D","DZ":"DZ","DŽ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","Lj":"L","Ł":"L","LJ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","Nj":"N","Ñ":"N","NJ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","ẞ":"SS","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","IJ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","dz":"dz","dž":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","lj":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","nj":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ß":"ss","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t","ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ff":"ff","ffi":"ffi","ffl":"ffl","fi":"fi","fl":"fl","ij":"ij","œ":"oe","st":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x","Ё":"YO","Й":"I","Ц":"TS","У":"U","К":"K","Е":"E","Н":"N","Г":"G","Ш":"SH","Щ":"SCH","З":"Z","Х":"H","Ъ":"","ё":"yo","й":"i","ц":"ts","у":"u","к":"k","е":"e","н":"n","г":"g","ш":"sh","щ":"sch","з":"z","х":"h","ъ":"","Ф":"F","Ы":"I","В":"V","А":"A","П":"P","Р":"R","О":"O","Л":"L","Д":"D","Ж":"ZH","Э":"E","ф":"f","ы":"i","в":"v","а":"a","п":"p","р":"r","о":"o","л":"l","д":"d","ж":"zh","э":"e","Я":"Ya","Ч":"CH","С":"S","М":"M","И":"I","Т":"T","Ь":"","Б":"B","Ю":"YU","я":"ya","ч":"ch","с":"s","м":"m","и":"i","т":"t","ь":"","б":"b","ю":"yu"},TLD:["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"],MediaSizes:d(38).b};t.a.Config=a,e.a=a},152:function(f,e,d){"use strict";d.d(e,"a",(function(){return t}));class t{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}},153:function(f,e,d){"use strict";d.d(e,"a",(function(){return c}));var t=d(37),a=d(63),s=d(48);class c extends s.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=a.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let s=t.a.Error|t.a.Log;return this.debug&&(s|=t.a.Debug),this.log=Object(t.b)("WS-"+f+d,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}},154:function(f,e,d){"use strict";var t=d(29),a=d(61),s=d(37),c=d(15),n=d(62),i=d(33);const r=new class{constructor(){this.log=Object(s.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),n.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};n.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time{const a=[];h(f.default,a),h(d.default,a);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:a,version:0,local:!0,countries:t.default})})}function b(e){return f.requestedServerLanguage=!0,Promise.all([c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:i.a.langPack}),c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(8).then(d.bind(null,156)),d.e(9).then(d.bind(null,157)),c.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(e){return f.lastRequestedLangCode=e,b(e).then(([f,e,d,t,a,s])=>{let c=[];[d,t].forEach(f=>{h(f.default,c)}),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=a,p(f)})}function p(f){return f.appVersion=i.a.langPackVersion,n.a.set({langPack:f}).then(()=>(m(f),f))}function m(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(r.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code);Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function k(f,e,d={i:0}){let t=[];let a=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,s,c,n,i,r,u)=>{if(t.push(u.slice(a,r)),s){let f;switch(s){case"**":f=document.createElement("b");break;case"__":f=document.createElement("i")}f.append(...k(c,e,d)),t.push(f)}else if(n)t.push(document.createElement("br"));else if(i){const f=i.lastIndexOf("]"),a=i.slice(1,f),s=i.slice(f+2,i.length-1);let c;if(s&&o.b.matchUrlProtocol(s)){c=document.createElement("a");const f=o.b.wrapUrl(s);c.href=f.url,f.onclick&&c.setAttribute("onclick",f.onclick),c.target="_blank"}else c=e[d.i++],c.textContent="";c.append(...k(a,e,d)),t.push(c)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return a=r+f.length,""}),a!==f.length&&t.push(f.slice(a)),t}function y(d,t=!1,a){const s=f.strings.get(d);let c;if(s)if("langPackStringPluralized"===s._&&(null==a?void 0:a.length)){let f=a[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));c=s[e.select(f)+"_value"]||s.other_value}else c="langPackString"===s._?s.value:d;else c=d;const n=k(c,a);return t?n.map(f=>f instanceof Node?f.textContent:f).join(""):n}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return u||(u=Promise.all([n.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),m(e),e):l()).finally(()=>{u=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof E&&d.update()})}},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return c.a.invokeApi("langpack.getStrings",{lang_pack:i.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(29).then(d.bind(null,173)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=m,f.superFormatter=k,f.format=y,f.weakMap=new WeakMap;class v{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class w extends v{update(f){if(Object(a.g)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}compareAndUpdate(f){if(this.key!==f.key||!Object(a.b)(this.args,f.args))return this.update(f)}}f.IntlElement=w;class E extends v{update(e){Object(a.g)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);this.element[this.property]=Object(s.a)(d.format(this.date))}}f.IntlDateElement=E,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({element:f,key:e,args:d,property:t}).element}}(h||(h={})),e.default=h;const g=h.i18n,p=h.i18n_,m=h._i18n;function k(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"WordDelimiterLast":"WordDelimiter";return d?h.format(t,!0):g(t)});return d?t.join(""):t}t.a.I18n=h},167:function(f,e,d){"use strict";function t(){return new Worker(d.p+"webp.worker.db1ce269f081e74b2c5a.bundle.worker.js")}var a=d(29),s=d(45),c=d(33);const n=new class{constructor(){this.convertPromises={}}init(){this.worker=new t,this.worker.addEventListener("message",f=>{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(s.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};a.a.webpWorkerController=n;e.a=n},24:function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(7),a=d(29),s=d(63),c=d(59),n=d(62);class i{constructor(){this.disabled=s.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return n.a.get("tgme_sync").then(e=>{const d=Object(c.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;n.a.set({tgme_sync:{canRedirect:f,ts:d}});const a=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,s=["//telegram.me/"+a,"//t.me/"+a].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(s)})}}const r=new i;a.a&&(a.a.telegramMeWebManager=r),e.default=r},26:function(f,e,d){"use strict";d.r(e),d.d(e,"WebPushApiManager",(function(){return u}));var t=d(29),a=d(31),s=d(37),c=d(15),n=d(33),i=d(16),r=d(0),o=d(141);class u{constructor(){this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=Object(s.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||c.default.idle&&c.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};n.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(a.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;n.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(n.a.addServiceWorkerTaskListener("push_click",f=>{c.default.idle&&c.default.idle.deactivated?o.a.reload():c.default.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),c.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),c.default.dispatchEvent("push_"+f,!1)}}const l=new u;t.a&&(t.a.webPushApiManager=l),e.default=l},32:function(f,e,d){"use strict";d.d(e,"a",(function(){return w}));var t=d(143);var a=d(99),s=d(88),c=d(0),n=d(29),i=d(10),r=d(31);const o=t.a.Emoji,u="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?(?:"+l+"{1,64}(?::"+l+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+b+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️?⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),p=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,k={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},y={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in y)v.add(y[f]);var w;!function(f){function e(f){let e=Object(a.b)(f).replace(/-?fe0f/g,"");return o.hasOwnProperty(e)?e:null}function d(f){let d,a=f;const s=[];let c,n=0;for(g.lastIndex=0;d=a.match(g);){if(c=n+d.index,d[3])s.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(p.test(d[4]))s.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const a=d[6];if(a){if(e||"xn--"!==a.substr(0,4)&&-1===t.a.TLD.indexOf(a.toLowerCase())||(e="http://"),e){const t=C(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});a=a.substr(d.index+d[0].length),n+=d.index+d[0].length}return s}function n(f,e){return f.find(f=>{if(!(e._===f._||!v.has(e._)&&!v.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function u(f,e){const d=e.filter(e=>!n(f,e));f.push(...d),E(f);for(let e=0;en(e,f)?a=!1:(t.push(f),a=!0),c=[];let i,r=0;for(;i=f.match(m);){const e=r+i.index;c.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(r-=d.length,r+=d.length,a=!1,d.match(/^`*$/))c.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},s(t)&&("\n"===i[5]&&(i[5]="",r-=1),c.push(i[1]+d+i[5]),r-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:y[i[7]],offset:e+(f?0:i[6].length),length:d.length},s(t)&&(f?c.push(d):c.push(i[6]+d+i[9]),r-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},s(t)&&(c.push(d),r-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},s(t)&&(c.push(d),r-=i[12].length-d.length));a||c.push(i[0]),f=f.substr(i.index+i[0].length),r+=i.index+i[0].length}c.push(f);let o=c.join("");o.replace(/\s+/g,"").length||(o=f,t.splice(0,t.length)),u(e,t),w(e);let l=o.length;if(!d){o=o.replace(/^\s*/,"");let f=l-o.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),o=o.replace(/\s*$/,""),f=l-o.length,l=o.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return o},f.findConflictingEntity=n,f.mergeEntities=u;const l=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function w(f){for(let e=0;el.has(f._)&&t!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function E(f){f.sort((f,e)=>f.offset-e.offset||e.length-f.length)}function A(f,e={}){if(!f)return"";const t=[],a=e.entities||d(f),n=e.passEntities||{},o=e.contextSite||"Telegram",u="Telegram"!==o,l=(f,e,d)=>{const a=f.offset,s=d?f.offset+f.length:void 0;let c,n;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===c&&a>=e&&(c=f+1),void 0!==s&&s<=e&&(n=f),a>e&&(void 0===s||s=h){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>h&&(t=Object(r.a)(t),t.length=t.offset+t.length-h);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityCode":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,"","");break;case"messageEntityPre":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,`
`,"
");break;case"messageEntityHighlight":l(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&n[t._]){let d,a,c=f.substr(t.offset,t.length).substr(1);-1!==(a=c.indexOf("@"))?(d=c.substr(a+1),c=c.substr(0,a)):d=e.fromBot,l(t,``,"")}break;case"messageEntityEmoji":i.a?e.wrappingDraft||l(t,'',""):l(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||n[t._]){const c=f.substr(t.offset,t.length);let n,i=t.url||c,r=!1;const o=P(i,!0);if(i=o.url,n=o.onclick,"messageEntityTextUrl"===t._){const f=a[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==c&&(r=!0)}const u=!!n;n||!r||u||(n="showMaskedAlert"),e.wrappingDraft&&(n=void 0);l(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){const e=f.substr(t.offset,t.length);l(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&k[o];if(d){const e=f.substr(t.offset,t.length).substr(1);l(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!n[t._]||l(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:a}=P("t.me/"+e);l(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),a=f.slice(t.offset+t.length);f=e+S(d)+a}else e.wrappingDraft?l(t,'',""):l(t,'',"")}}let g=t.length,p=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}g+=p;const m=[];let y=0;for(let d=0;dy){const d=f.slice(y,c);m.push(e.noEncoding?d:Object(s.d)(d)),y=c}m.push(a)}if(yd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function S(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let a=0;a"messageEntityEmoji"===f._),wrappingDraft:e})}function P(f,e){let d,t,a,s;if(D(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return s="joinchat",{url:f,onclick:s};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":case"voicechat":s=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){s="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(a=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+a[1]);return window[s]||(s=void 0),{url:f,onclick:s}}function D(f){return f?f.match(h):null}function L(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(a.e)(f).join("-").replace(/-?fe0f/g,"")}}f.combineSameEntities=w,f.sortEntities=E,f.wrapRichText=A,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?A(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=C,f.spoiler=S,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),A(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=T,f.wrapUrl=P,f.matchUrlProtocol=D,f.matchUrl=function(f){return f?f.match(b):null},f.matchEmail=function(f){return f?f.match(p):null},f.getAbbreviation=function(f,e=!1){if(!f)return"";const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?T(t):T(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=L,f.wrapSingleEmoji=function(f){return A(f,{entities:[L(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},33:function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js")}var a=d(31),s=d(152),c=d(37),n=d(15),i=d(167),r=d(29),o=d(153),u=d(154),l=d(62),b=d(26),h=d(92),g=d(141),p=d(24),m=d(81),k=d(129);class y extends s.a{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(c.b)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=r.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?n.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),u.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([h.a.toggleStorage(!1),l.a.clear(),Promise.race([p.default.setAuthorized(!1),Object(m.a)(3e3)]),b.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{g.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{n.default.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{i.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new o.a(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},a=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",a),f.removeEventListener("message",s),this.sockets.delete(d)},s=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",a),f.addEventListener("message",s),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),n.default.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=k.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}createTask(f,e,d){return{task:f,taskId:this.taskId++,type:e,args:d}}performTaskWorkerVoid(f,...e){const d=this.createTask(f,void 0,e);this.pending.push(d),this.releasePending()}performTaskWorkerNew(f,e,...d){return this.debug&&this.log.debug("start",f,d),new Promise((t,a)=>{const s=this.createTask(f,e,d);this.pending.push(s),this.awaiting[s.taskId]={resolve:t,reject:a,taskName:f},this.releasePending()})}performTaskWorker(f,...e){return this.performTaskWorkerNew(f,void 0,...e)}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeCrypto(f,...e){return this.performTaskWorkerNew(f,"crypto",...e)}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f){var e,d;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{params:t,options:a,method:s}=f,c=JSON.stringify(t);let n;return this.hashes[s]&&(n=this.hashes[s][c],n&&(t.hash=n.hash)),this.invokeApiSingleProcess({method:s,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",s,c),n.result;if(e.hash){const f=e.hash;this.hashes[s]||(this.hashes[s]={}),this.hashes[s][c]={hash:f,result:e}}return f.processResult?f.processResult(e):e},params:t,options:a})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),a=this.apiPromisesSingle;return a[t]?a[t]:a[t]=this.invokeApi(f,e,d).finally(()=>{delete a[t]})}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:a,processResult:s,processError:c,params:n,options:i}=f,r=this.apiPromisesSingleProcess,o=i.cacheKey||JSON.stringify(n),u=null!==(t=r[a])&&void 0!==t?t:r[a]=new Map,l=u.get(o);if(l)return l;const b=this.invokeApi(a,n,i).then(s,c).finally(()=>{u.delete(o),u.size||delete r[a]});return u.set(o,b),b}invokeApiCacheable(f,e={},d={}){var t;const a=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},s=JSON.stringify(e),c=a[s];if(c&&(!d.override||!c.fulfilled))return c.promise;let n;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(n=window.setTimeout(()=>{delete a[s]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return a[s]={timestamp:Date.now(),fulfilled:!1,timeout:n,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),n.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(n.default.config=f,f))}getAppConfig(f){return this.getAppConfigPromise&&!f?this.getAppConfigPromise:this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then(f=>(n.default.appConfig=f,f))}}const v=new y;r.a.apiManagerProxy=v;e.a=v},38:function(f,e,d){"use strict";d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return t}));var t,a=d(29),s=d(130),c=d(48);class n{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return Object(s.a)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new n(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class r extends c.a{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:i(270,270),webpage:i(270,200),album:i(270,0),esgSticker:i(68,68),animatedSticker:i(180,180),staticSticker:i(180,180),emojiSticker:i(112,112),poll:i(240,0),round:i(200,200)},desktop:{regular:i(420,340),webpage:i(420,340),album:i(420,0),esgSticker:i(80,80),animatedSticker:i(200,200),staticSticker:i(200,200),emojiSticker:i(112,112),poll:i(330,0),round:i(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const o=new r;a.a.mediaSizes=o,e.b=o},59:function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"c",(function(){return o})),d.d(e,"e",(function(){return u})),d.d(e,"d",(function(){return l})),d.d(e,"f",(function(){return b})),d.d(e,"g",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(29),a=d(16),s=d(142);d.d(e,"h",(function(){return s.a}));const c=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=86400,r=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/i+1)/7)};function o(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,s={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):c[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=new RegExp("20[0-9]{1,2}"),p=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),m=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),k=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),v=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime();f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:s,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime()-864e5;f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:s,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===P(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),a=t-f.getDay();f.setDate(f.getDate()+a),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const s=f.getFullYear(),c=f.getMonth(),n=f.getDate();f.setFullYear(s,c,n),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(s,c,n+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:P(i),minDate:i,maxDate:r})}let a;if(null===(a=k.exec(d)))if(null===(a=y.exec(d)))if(null===(a=g.exec(d))){if(null!==(a=p.exec(d))){const f=a[1],d=a[2],t=L(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void A(e,f-1,t)}if(f>=2013){return void E(e,t,f)}}}if(null!==(a=m.exec(d))){const f=a[1],d=L(a[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void A(e,t-1,d)}if(t>=2013){E(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const a=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:a})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const a=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:a})}}else{const f=a[1],d=a[3],t=a[5];if(!a[2]===a[4])return;const s=parseInt(f),c=parseInt(d)-1;let n=parseInt(t);n>=10&&n<=99&&(n+=2e3);const i=(new Date).getFullYear();if(D(s-1,c)&&n>=2013&&n<=i){const f=new Date;f.setFullYear(n,c,s),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(n,c,s+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:T(d),minDate:d,maxDate:t})}}else{const f=a[1],d=a[3],t=parseInt(f),s=parseInt(d);if(t>0&&t<=31){if(s>=2013&&t<=12){return void E(e,t-1,s)}if(s<=12){A(e,t-1,s-1)}}else if(t>=2013&&s<=12){E(e,s-1,t)}}}function E(f,e,d){const t=(new Date).getFullYear(),a=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const s=t.getTime();if(s>a)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:C(s),minDate:s,maxDate:c})}}function A(f,e,d){if(D(e,d)){const a=(new Date).getFullYear(),s=Date.now();for(let c=a;c>=2013;c--){if(1===d&&28===e&&(((t=c)%4!=0||t%100==0)&&t%400!=0))continue;const n=new Date;n.setFullYear(c,d,e+1),n.setHours(0,0,0);const i=n.getTime();if(i>s)continue;n.setFullYear(c,d,e+2),n.setHours(0,0,0);const r=n.getTime()-1;c===a?f.push({title:S(i),minDate:i,maxDate:r}):f.push({title:T(i),minDate:i,maxDate:r})}}var t}function C(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function S(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getDate()}function T(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function P(f){const e=new Date(f);return n[e.getDay()]}function D(f,e){return e>=0&&e<12&&f>=0&&fnew Promise(e=>{setTimeout(e,f)})},88:function(f,e,d){"use strict";function t(f,e,d=e+10){return(f=f.trim()).length>d&&(f=f.slice(0,e)+"..."),f}function a(f){return f.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function s(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}function c(f,e){if(f.length{let i=f.slice(t,n);const r=a++;if(i.length>e){c(i.slice(e),e).forEach(f=>{s[a++]=f}),i=i.slice(0,e)}t=n,d=0,s[r]=(s[r]||"")+i};let i=0;for(;;){let t=f.indexOf(" ",i);if(-1===t){i!==f.length-1&&n();break}t+=" ".length;const a=t-i;d+a>e&&n(d),i=t,d+=a}return s}function n(f){const e=f.replace("input","");return e[0].toLowerCase()+e.slice(1)}function i(f){return f="input"+(f=f[0].toUpperCase()+f.slice(1))}function r(f){return f.charAt(0).toUpperCase()+f.slice(1)}d.d(e,"f",(function(){return t})),d.d(e,"e",(function(){return a})),d.d(e,"d",(function(){return s})),d.d(e,"g",(function(){return c})),d.d(e,"b",(function(){return n})),d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return r}))},99:function(f,e,d){"use strict";function t(f){return n(c(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return n})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"a",(function(){return o}));const a=/\uFE0F/g,s=String.fromCharCode(8205),c=f=>f.indexOf(s)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function o(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}}}]); -//# sourceMappingURL=1.492b807a01f9ca3e3cf5.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{129:function(f,e,d){"use strict";const t=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp");e.a=t},130:function(f,e,d){"use strict";d.d(e,"a",(function(){return a}));var t=d(38);function a(f,e,d,a,s=!0){if(fd/a?n=e*d/f|0:(c=f*a/e|0,c>d&&(n=n*d/c|0,c=d)),s&&c>=f&&n>=e&&(c=f,n=e),Object(t.c)(c,n)}d(29).a.calcImageInBox=a},141:function(f,e,d){"use strict";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};e.a=t},142:function(f,e,d){"use strict";function t(f){const e=Date.now();return f?e/1e3|0:e}d.d(e,"a",(function(){return t}))},143:function(f,e,d){"use strict";var t=d(29);const a={Emoji:{2049:62748,2122:62776,2139:62801,2194:62678,2195:62677,2196:62676,2197:62670,2198:62672,2199:62674,2328:61155,2600:4954,2601:4962,2602:4977,2603:4982,2604:4984,2611:62764,2614:4978,2615:3750,2618:2639,2620:196,2622:62667,2623:62668,2626:62697,2638:62694,2639:168,2648:62702,2649:62703,2650:62710,2651:62711,2652:62712,2653:62713,2660:51057,2663:51060,2665:51058,2666:51059,2668:4832,2692:61258,2693:4887,2694:61261,2696:61272,2697:61280,2699:61270,2702:61245,2705:62763,2708:4895,2709:61206,2712:61220,2714:62765,2716:62742,2721:62693,2728:5993,2733:62771,2734:62772,2744:4981,2747:62773,2753:62749,2754:62750,2755:62751,2757:62752,2763:1127,2764:1129,2795:62743,2796:62744,2797:62745,2934:62681,2935:62682,3030:62753,3297:62825,3299:62826,"0023-20e3":62777,"002a-20e3":62778,"0030-20e3":62779,"0031-20e3":62780,"0032-20e3":62781,"0033-20e3":62782,"0034-20e3":62783,"0035-20e3":62784,"0036-20e3":62785,"0037-20e3":62786,"0038-20e3":62787,"0039-20e3":62788,"00a9":62774,"00ae":62775,"1f004":51063,"1f0cf":51062,"1f170":62795,"1f171":62797,"1f17e":62806,"1f17f":62808,"1f18e":62796,"1f191":62798,"1f192":62799,"1f193":62800,"1f194":62802,"1f195":62804,"1f196":62805,"1f197":62807,"1f198":62809,"1f199":62810,"1f19a":62811,"1f1e6-1f1e8":71550,"1f1e6-1f1e9":71551,"1f1e6-1f1ea":71552,"1f1e6-1f1eb":71553,"1f1e6-1f1ec":71554,"1f1e6-1f1ee":71555,"1f1e6-1f1f1":71556,"1f1e6-1f1f2":71557,"1f1e6-1f1f4":71558,"1f1e6-1f1f6":71559,"1f1e6-1f1f7":71560,"1f1e6-1f1f8":71561,"1f1e6-1f1f9":71562,"1f1e6-1f1fa":71563,"1f1e6-1f1fc":71564,"1f1e6-1f1fd":71565,"1f1e6-1f1ff":71566,"1f1e7-1f1e6":71567,"1f1e7-1f1e7":71568,"1f1e7-1f1e9":71569,"1f1e7-1f1ea":71570,"1f1e7-1f1eb":71571,"1f1e7-1f1ec":71572,"1f1e7-1f1ed":71573,"1f1e7-1f1ee":71574,"1f1e7-1f1ef":71575,"1f1e7-1f1f1":71576,"1f1e7-1f1f2":71577,"1f1e7-1f1f3":71578,"1f1e7-1f1f4":71579,"1f1e7-1f1f6":71580,"1f1e7-1f1f7":71581,"1f1e7-1f1f8":71582,"1f1e7-1f1f9":71583,"1f1e7-1f1fb":71584,"1f1e7-1f1fc":71585,"1f1e7-1f1fe":71586,"1f1e7-1f1ff":71587,"1f1e8-1f1e6":71588,"1f1e8-1f1e8":71589,"1f1e8-1f1e9":71590,"1f1e8-1f1eb":71591,"1f1e8-1f1ec":71592,"1f1e8-1f1ed":71593,"1f1e8-1f1ee":71594,"1f1e8-1f1f0":71595,"1f1e8-1f1f1":71596,"1f1e8-1f1f2":71597,"1f1e8-1f1f3":71598,"1f1e8-1f1f4":71599,"1f1e8-1f1f5":71600,"1f1e8-1f1f7":71601,"1f1e8-1f1fa":71602,"1f1e8-1f1fb":71603,"1f1e8-1f1fc":71604,"1f1e8-1f1fd":71605,"1f1e8-1f1fe":71606,"1f1e8-1f1ff":71607,"1f1e9-1f1ea":71608,"1f1e9-1f1ec":71609,"1f1e9-1f1ef":71610,"1f1e9-1f1f0":71611,"1f1e9-1f1f2":71612,"1f1e9-1f1f4":71613,"1f1e9-1f1ff":71614,"1f1ea-1f1e6":71615,"1f1ea-1f1e8":71616,"1f1ea-1f1ea":71617,"1f1ea-1f1ec":71618,"1f1ea-1f1ed":71619,"1f1ea-1f1f7":71620,"1f1ea-1f1f8":71621,"1f1ea-1f1f9":71622,"1f1ea-1f1fa":71623,"1f1eb-1f1ee":71624,"1f1eb-1f1ef":71625,"1f1eb-1f1f0":71626,"1f1eb-1f1f2":71627,"1f1eb-1f1f4":71628,"1f1eb-1f1f7":71629,"1f1ec-1f1e6":71630,"1f1ec-1f1e7":71631,"1f1ec-1f1e9":71632,"1f1ec-1f1ea":71633,"1f1ec-1f1eb":71634,"1f1ec-1f1ec":71635,"1f1ec-1f1ed":71636,"1f1ec-1f1ee":71637,"1f1ec-1f1f1":71638,"1f1ec-1f1f2":71639,"1f1ec-1f1f3":71640,"1f1ec-1f1f5":71641,"1f1ec-1f1f6":71642,"1f1ec-1f1f7":71643,"1f1ec-1f1f8":71644,"1f1ec-1f1f9":71645,"1f1ec-1f1fa":71646,"1f1ec-1f1fc":71647,"1f1ec-1f1fe":71648,"1f1ed-1f1f0":71649,"1f1ed-1f1f2":71650,"1f1ed-1f1f3":71651,"1f1ed-1f1f7":71652,"1f1ed-1f1f9":71653,"1f1ed-1f1fa":71654,"1f1ee-1f1e8":71655,"1f1ee-1f1e9":71656,"1f1ee-1f1ea":71657,"1f1ee-1f1f1":71658,"1f1ee-1f1f2":71659,"1f1ee-1f1f3":71660,"1f1ee-1f1f4":71661,"1f1ee-1f1f6":71662,"1f1ee-1f1f7":71663,"1f1ee-1f1f8":71664,"1f1ee-1f1f9":71665,"1f1ef-1f1ea":71666,"1f1ef-1f1f2":71667,"1f1ef-1f1f4":71668,"1f1ef-1f1f5":71669,"1f1f0-1f1ea":71670,"1f1f0-1f1ec":71671,"1f1f0-1f1ed":71672,"1f1f0-1f1ee":71673,"1f1f0-1f1f2":71674,"1f1f0-1f1f3":71675,"1f1f0-1f1f5":71676,"1f1f0-1f1f7":71677,"1f1f0-1f1fc":71678,"1f1f0-1f1fe":71679,"1f1f0-1f1ff":71680,"1f1f1-1f1e6":71681,"1f1f1-1f1e7":71682,"1f1f1-1f1e8":71683,"1f1f1-1f1ee":71684,"1f1f1-1f1f0":71685,"1f1f1-1f1f7":71686,"1f1f1-1f1f8":71687,"1f1f1-1f1f9":71688,"1f1f1-1f1fa":71689,"1f1f1-1f1fb":71690,"1f1f1-1f1fe":71691,"1f1f2-1f1e6":71692,"1f1f2-1f1e8":71693,"1f1f2-1f1e9":71694,"1f1f2-1f1ea":71695,"1f1f2-1f1eb":71696,"1f1f2-1f1ec":71697,"1f1f2-1f1ed":71698,"1f1f2-1f1f0":71699,"1f1f2-1f1f1":71700,"1f1f2-1f1f2":71701,"1f1f2-1f1f3":71702,"1f1f2-1f1f4":71703,"1f1f2-1f1f5":71704,"1f1f2-1f1f6":71705,"1f1f2-1f1f7":71706,"1f1f2-1f1f8":71707,"1f1f2-1f1f9":71708,"1f1f2-1f1fa":71709,"1f1f2-1f1fb":71710,"1f1f2-1f1fc":71711,"1f1f2-1f1fd":71712,"1f1f2-1f1fe":71713,"1f1f2-1f1ff":71714,"1f1f3-1f1e6":71715,"1f1f3-1f1e8":71716,"1f1f3-1f1ea":71717,"1f1f3-1f1eb":71718,"1f1f3-1f1ec":71719,"1f1f3-1f1ee":71720,"1f1f3-1f1f1":71721,"1f1f3-1f1f4":71722,"1f1f3-1f1f5":71723,"1f1f3-1f1f7":71724,"1f1f3-1f1fa":71725,"1f1f3-1f1ff":71726,"1f1f4-1f1f2":71727,"1f1f5-1f1e6":71728,"1f1f5-1f1ea":71729,"1f1f5-1f1eb":71730,"1f1f5-1f1ec":71731,"1f1f5-1f1ed":71732,"1f1f5-1f1f0":71733,"1f1f5-1f1f1":71734,"1f1f5-1f1f2":71735,"1f1f5-1f1f3":71736,"1f1f5-1f1f7":71737,"1f1f5-1f1f8":71738,"1f1f5-1f1f9":71739,"1f1f5-1f1fc":71740,"1f1f5-1f1fe":71741,"1f1f6-1f1e6":71742,"1f1f7-1f1ea":71743,"1f1f7-1f1f4":71744,"1f1f7-1f1f8":71745,"1f1f7-1f1fa":71746,"1f1f7-1f1fc":71747,"1f1f8-1f1e6":71748,"1f1f8-1f1e7":71749,"1f1f8-1f1e8":71750,"1f1f8-1f1e9":71751,"1f1f8-1f1ea":71752,"1f1f8-1f1ec":71753,"1f1f8-1f1ed":71754,"1f1f8-1f1ee":71755,"1f1f8-1f1ef":71756,"1f1f8-1f1f0":71757,"1f1f8-1f1f1":71758,"1f1f8-1f1f2":71759,"1f1f8-1f1f3":71760,"1f1f8-1f1f4":71761,"1f1f8-1f1f7":71762,"1f1f8-1f1f8":71763,"1f1f8-1f1f9":71764,"1f1f8-1f1fb":71765,"1f1f8-1f1fd":71766,"1f1f8-1f1fe":71767,"1f1f8-1f1ff":71768,"1f1f9-1f1e6":71769,"1f1f9-1f1e8":71770,"1f1f9-1f1e9":71771,"1f1f9-1f1eb":71772,"1f1f9-1f1ec":71773,"1f1f9-1f1ed":71774,"1f1f9-1f1ef":71775,"1f1f9-1f1f0":71776,"1f1f9-1f1f1":71777,"1f1f9-1f1f2":71778,"1f1f9-1f1f3":71779,"1f1f9-1f1f4":71780,"1f1f9-1f1f7":71781,"1f1f9-1f1f9":71782,"1f1f9-1f1fb":71783,"1f1f9-1f1fc":71784,"1f1f9-1f1ff":71785,"1f1fa-1f1e6":71786,"1f1fa-1f1ec":71787,"1f1fa-1f1f2":71788,"1f1fa-1f1f3":71789,"1f1fa-1f1f8":71790,"1f1fa-1f1fe":71791,"1f1fa-1f1ff":71792,"1f1fb-1f1e6":71793,"1f1fb-1f1e8":71794,"1f1fb-1f1ea":71795,"1f1fb-1f1ec":71796,"1f1fb-1f1ee":71797,"1f1fb-1f1f3":71798,"1f1fb-1f1fa":71799,"1f1fc-1f1eb":71800,"1f1fc-1f1f8":71801,"1f1fd-1f1f0":71802,"1f1fe-1f1ea":71803,"1f1fe-1f1f9":71804,"1f1ff-1f1e6":71805,"1f1ff-1f1f2":71806,"1f1ff-1f1fc":71807,"1f201":62812,"1f202":62813,"1f21a":62819,"1f22f":62816,"1f232":62820,"1f233":62824,"1f234":62823,"1f235":62828,"1f236":62815,"1f237":62814,"1f238":62822,"1f239":62818,"1f23a":62827,"1f250":62817,"1f251":62821,"1f300":4974,"1f301":4824,"1f302":4976,"1f303":4825,"1f304":4827,"1f305":4828,"1f306":4829,"1f307":4830,"1f308":4975,"1f309":4831,"1f30a":4987,"1f30b":4782,"1f30c":4961,"1f30d":4773,"1f30e":4774,"1f30f":4775,"1f310":4776,"1f311":4941,"1f312":4942,"1f313":4943,"1f314":4944,"1f315":4945,"1f316":4946,"1f317":4947,"1f318":4948,"1f319":4949,"1f31a":4950,"1f31b":4951,"1f31c":4952,"1f31d":4955,"1f31e":4956,"1f31f":4959,"1f320":4960,"1f321":4953,"1f324":4965,"1f325":4966,"1f326":4967,"1f327":4968,"1f328":4969,"1f329":4970,"1f32a":4971,"1f32b":4972,"1f32c":4973,"1f32d":3694,"1f32e":3696,"1f32f":3697,"1f330":3677,"1f331":2631,"1f332":2633,"1f333":2634,"1f334":2635,"1f335":2636,"1f336":3668,"1f337":2630,"1f338":2622,"1f339":2625,"1f33a":2627,"1f33b":2628,"1f33c":2629,"1f33d":3667,"1f33e":2637,"1f33f":2638,"1f340":2640,"1f341":2641,"1f342":2642,"1f343":2643,"1f344":3675,"1f345":3660,"1f346":3664,"1f347":3644,"1f348":3645,"1f349":3646,"1f34a":3647,"1f34b":3648,"1f34c":3649,"1f34d":3650,"1f34e":3652,"1f34f":3653,"1f350":3654,"1f351":3655,"1f352":3656,"1f353":3657,"1f354":3691,"1f355":3693,"1f356":3687,"1f357":3688,"1f358":3713,"1f359":3714,"1f35a":3715,"1f35b":3716,"1f35c":3717,"1f35d":3718,"1f35e":3678,"1f35f":3692,"1f360":3719,"1f361":3725,"1f362":3720,"1f363":3721,"1f364":3722,"1f365":3723,"1f366":3734,"1f367":3735,"1f368":3736,"1f369":3737,"1f36a":3738,"1f36b":3743,"1f36c":3744,"1f36d":3745,"1f36e":3746,"1f36f":3747,"1f370":3740,"1f371":3712,"1f372":3704,"1f373":3702,"1f374":3769,"1f375":3752,"1f376":3753,"1f377":3755,"1f378":3756,"1f379":3757,"1f37a":3758,"1f37b":3759,"1f37c":3748,"1f37d":3768,"1f37e":3754,"1f37f":3708,"1f380":51004,"1f381":51005,"1f382":3739,"1f383":5988,"1f384":5989,"1f385":1490,"1f386":5990,"1f387":5991,"1f388":5994,"1f389":5995,"1f38a":5996,"1f38b":5997,"1f38c":71544,"1f38d":5998,"1f38e":5999,"1f38f":51e3,"1f390":51001,"1f391":51002,"1f392":61096,"1f393":61109,"1f396":51009,"1f397":51006,"1f399":61129,"1f39a":61130,"1f39b":61131,"1f39e":61164,"1f39f":51007,"1f3a0":4833,"1f3a1":4834,"1f3a2":4835,"1f3a3":51036,"1f3a4":61132,"1f3a5":61163,"1f3a6":62733,"1f3a7":61133,"1f3a8":51067,"1f3a9":61108,"1f3aa":4837,"1f3ab":51008,"1f3ac":61166,"1f3ad":51065,"1f3ae":51049,"1f3af":51042,"1f3b0":51051,"1f3b1":51045,"1f3b2":51052,"1f3b3":51024,"1f3b4":51064,"1f3b5":61127,"1f3b6":61128,"1f3b7":61135,"1f3b8":61137,"1f3b9":61138,"1f3ba":61139,"1f3bb":61140,"1f3bc":61126,"1f3bd":51038,"1f3be":51022,"1f3bf":51039,"1f3c0":51018,"1f3c1":71542,"1f3c2":1562,"1f3c3-200d-2640":1546,"1f3c3-200d-2642":1545,"1f3c3":1544,"1f3c4-200d-2640":1568,"1f3c4-200d-2642":1567,"1f3c4":1566,"1f3c5":51011,"1f3c6":51010,"1f3c7":1560,"1f3c8":51020,"1f3c9":51021,"1f3ca-200d-2640":1574,"1f3ca-200d-2642":1573,"1f3ca":1572,"1f3cb-200d-2640":1580,"1f3cb-200d-2642":1579,"1f3cb":1578,"1f3cc-200d-2640":1565,"1f3cc-200d-2642":1564,"1f3cc":1563,"1f3cd":4868,"1f3ce":4867,"1f3cf":51025,"1f3d0":51019,"1f3d1":51026,"1f3d2":51027,"1f3d3":51029,"1f3d4":4780,"1f3d5":4784,"1f3d6":4785,"1f3d7":4791,"1f3d8":4796,"1f3d9":4826,"1f3da":4797,"1f3db":4790,"1f3dc":4786,"1f3dd":4787,"1f3de":4788,"1f3df":4789,"1f3e0":4798,"1f3e1":4799,"1f3e2":4800,"1f3e3":4801,"1f3e4":4802,"1f3e5":4803,"1f3e6":4804,"1f3e7":62643,"1f3e8":4805,"1f3e9":4806,"1f3ea":4807,"1f3eb":4808,"1f3ec":4809,"1f3ed":4810,"1f3ee":61177,"1f3ef":4811,"1f3f0":4812,"1f3f3-200d-1f308":71547,"1f3f3-200d-26a7":71548,"1f3f3":71546,"1f3f4-200d-2620":71549,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71808,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71809,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71810,"1f3f4":71545,"1f3f5":2624,"1f3f7":61195,"1f3f8":51030,"1f3f9":61264,"1f3fa":3772,"1f3fb":9499,"1f3fc":9500,"1f3fd":9501,"1f3fe":9502,"1f3ff":9503,"1f400":2550,"1f401":2549,"1f402":2530,"1f403":2531,"1f404":2532,"1f405":2521,"1f406":2522,"1f407":2553,"1f408-200d-2b1b":2518,"1f408":2517,"1f409":2592,"1f40a":2587,"1f40b":2596,"1f40c":2605,"1f40d":2590,"1f40e":2524,"1f40f":2537,"1f410":2539,"1f411":2538,"1f412":2505,"1f413":2570,"1f414":2569,"1f415-200d-1f9ba":2511,"1f415":2509,"1f416":2534,"1f417":2535,"1f418":2544,"1f419":2603,"1f41a":2604,"1f41b":2607,"1f41c":2608,"1f41d":2609,"1f41e":2611,"1f41f":2599,"1f420":2600,"1f421":2601,"1f422":2588,"1f423":2571,"1f424":2572,"1f425":2573,"1f426":2574,"1f427":2575,"1f428":2560,"1f429":2512,"1f42a":2540,"1f42b":2541,"1f42c":2597,"1f42d":2548,"1f42e":2529,"1f42f":2520,"1f430":2552,"1f431":2516,"1f432":2591,"1f433":2595,"1f434":2523,"1f435":2504,"1f436":2508,"1f437":2533,"1f438":2586,"1f439":2551,"1f43a":2513,"1f43b-200d-2744":2559,"1f43b":2558,"1f43c":2561,"1f43d":2536,"1f43e":2567,"1f43f":2554,"1f440":1350,"1f441-200d-1f5e8":1147,"1f441":1351,"1f442":1342,"1f443":1344,"1f444":1353,"1f445":1352,"1f446":1318,"1f447":1320,"1f448":1316,"1f449":1317,"1f44a":1325,"1f44b":1303,"1f44c":1308,"1f44d":1322,"1f44e":1323,"1f44f":1328,"1f450":1330,"1f451":61106,"1f452":61107,"1f453":61072,"1f454":61077,"1f455":61078,"1f456":61079,"1f457":61084,"1f458":61085,"1f459":61090,"1f45a":61091,"1f45b":61092,"1f45c":61093,"1f45d":61094,"1f45e":61098,"1f45f":61099,"1f460":61102,"1f461":61103,"1f462":61105,"1f463":1649,"1f464":1646,"1f465":1647,"1f466":1356,"1f467":1357,"1f468-200d-1f33e":1423,"1f468-200d-1f373":1426,"1f468-200d-1f37c":1487,"1f468-200d-1f393":1414,"1f468-200d-1f3a4":1444,"1f468-200d-1f3a8":1447,"1f468-200d-1f3eb":1417,"1f468-200d-1f3ed":1432,"1f468-200d-1f466-200d-1f466":1636,"1f468-200d-1f466":1635,"1f468-200d-1f467-200d-1f466":1638,"1f468-200d-1f467-200d-1f467":1639,"1f468-200d-1f467":1637,"1f468-200d-1f468-200d-1f466":1625,"1f468-200d-1f468-200d-1f466-200d-1f466":1628,"1f468-200d-1f468-200d-1f467":1626,"1f468-200d-1f468-200d-1f467-200d-1f466":1627,"1f468-200d-1f468-200d-1f467-200d-1f467":1629,"1f468-200d-1f469-200d-1f466":1620,"1f468-200d-1f469-200d-1f466-200d-1f466":1623,"1f468-200d-1f469-200d-1f467":1621,"1f468-200d-1f469-200d-1f467-200d-1f466":1622,"1f468-200d-1f469-200d-1f467-200d-1f467":1624,"1f468-200d-1f4bb":1441,"1f468-200d-1f4bc":1435,"1f468-200d-1f527":1429,"1f468-200d-1f52c":1438,"1f468-200d-1f680":1453,"1f468-200d-1f692":1456,"1f468-200d-1f9af":1536,"1f468-200d-1f9b0":1362,"1f468-200d-1f9b1":1363,"1f468-200d-1f9b2":1365,"1f468-200d-1f9b3":1364,"1f468-200d-1f9bc":1539,"1f468-200d-1f9bd":1542,"1f468-200d-2695":1411,"1f468-200d-2696":1420,"1f468-200d-2708":1450,"1f468-200d-2764-200d-1f468":1617,"1f468-200d-2764-200d-1f48b-200d-1f468":1613,"1f468":1360,"1f469-200d-1f33e":1424,"1f469-200d-1f373":1427,"1f469-200d-1f37c":1486,"1f469-200d-1f393":1415,"1f469-200d-1f3a4":1445,"1f469-200d-1f3a8":1448,"1f469-200d-1f3eb":1418,"1f469-200d-1f3ed":1433,"1f469-200d-1f466-200d-1f466":1641,"1f469-200d-1f466":1640,"1f469-200d-1f467-200d-1f466":1643,"1f469-200d-1f467-200d-1f467":1644,"1f469-200d-1f467":1642,"1f469-200d-1f469-200d-1f466":1630,"1f469-200d-1f469-200d-1f466-200d-1f466":1633,"1f469-200d-1f469-200d-1f467":1631,"1f469-200d-1f469-200d-1f467-200d-1f466":1632,"1f469-200d-1f469-200d-1f467-200d-1f467":1634,"1f469-200d-1f4bb":1442,"1f469-200d-1f4bc":1436,"1f469-200d-1f527":1430,"1f469-200d-1f52c":1439,"1f469-200d-1f680":1454,"1f469-200d-1f692":1457,"1f469-200d-1f9af":1537,"1f469-200d-1f9b0":1367,"1f469-200d-1f9b1":1369,"1f469-200d-1f9b2":1373,"1f469-200d-1f9b3":1371,"1f469-200d-1f9bc":1540,"1f469-200d-1f9bd":1543,"1f469-200d-2695":1412,"1f469-200d-2696":1421,"1f469-200d-2708":1451,"1f469-200d-2764-200d-1f468":1616,"1f469-200d-2764-200d-1f469":1618,"1f469-200d-2764-200d-1f48b-200d-1f468":1612,"1f469-200d-2764-200d-1f48b-200d-1f469":1614,"1f469":1366,"1f46a":1619,"1f46b":1609,"1f46c":1610,"1f46d":1608,"1f46e-200d-2640":1460,"1f46e-200d-2642":1459,"1f46e":1458,"1f46f-200d-2640":1552,"1f46f-200d-2642":1551,"1f46f":1550,"1f470-200d-2640":1483,"1f470-200d-2642":1482,"1f470":1481,"1f471-200d-2640":1375,"1f471-200d-2642":1376,"1f471":1359,"1f472":1476,"1f473-200d-2640":1475,"1f473-200d-2642":1474,"1f473":1473,"1f474":1378,"1f475":1379,"1f476":1354,"1f477-200d-2640":1470,"1f477-200d-2642":1469,"1f477":1468,"1f478":1472,"1f479":199,"1f47a":1100,"1f47b":1101,"1f47c":1489,"1f47d":1102,"1f47e":1103,"1f47f":194,"1f480":195,"1f481-200d-2640":1394,"1f481-200d-2642":1393,"1f481":1392,"1f482-200d-2640":1466,"1f482-200d-2642":1465,"1f482":1464,"1f483":1547,"1f484":61114,"1f485":1335,"1f486-200d-2640":1522,"1f486-200d-2642":1521,"1f486":1520,"1f487-200d-2640":1525,"1f487-200d-2642":1524,"1f487":1523,"1f488":4836,"1f489":61287,"1f48a":61289,"1f48b":1117,"1f48c":1118,"1f48d":61115,"1f48e":61116,"1f48f":1611,"1f490":2621,"1f491":1615,"1f492":4813,"1f493":1123,"1f494":1128,"1f495":1125,"1f496":1121,"1f497":1122,"1f498":1119,"1f499":1133,"1f49a":1132,"1f49b":1131,"1f49c":1134,"1f49d":1120,"1f49e":1124,"1f49f":1126,"1f4a0":62859,"1f4a1":61175,"1f4a2":1139,"1f4a3":1145,"1f4a4":1151,"1f4a5":1140,"1f4a6":1142,"1f4a7":4986,"1f4a8":1143,"1f4a9":197,"1f4aa":1337,"1f4ab":1141,"1f4ac":1146,"1f4ad":1150,"1f4ae":2623,"1f4af":1138,"1f4b0":61196,"1f4b1":62754,"1f4b2":62755,"1f4b3":61203,"1f4b4":61198,"1f4b5":61199,"1f4b6":61200,"1f4b7":61201,"1f4b8":61202,"1f4b9":61205,"1f4ba":4900,"1f4bb":61152,"1f4bc":61226,"1f4bd":61158,"1f4be":61159,"1f4bf":61160,"1f4c0":61161,"1f4c1":61227,"1f4c2":61228,"1f4c3":61188,"1f4c4":61190,"1f4c5":61230,"1f4c6":61231,"1f4c7":61234,"1f4c8":61235,"1f4c9":61236,"1f4ca":61237,"1f4cb":61238,"1f4cc":61239,"1f4cd":61240,"1f4ce":61241,"1f4cf":61243,"1f4d0":61244,"1f4d1":61193,"1f4d2":61187,"1f4d3":61186,"1f4d4":61179,"1f4d5":61180,"1f4d6":61181,"1f4d7":61182,"1f4d8":61183,"1f4d9":61184,"1f4da":61185,"1f4db":62760,"1f4dc":61189,"1f4dd":61225,"1f4de":61147,"1f4df":61148,"1f4e0":61149,"1f4e1":61286,"1f4e2":61121,"1f4e3":61122,"1f4e4":61210,"1f4e5":61211,"1f4e6":61212,"1f4e7":61207,"1f4e8":61208,"1f4e9":61209,"1f4ea":61214,"1f4eb":61213,"1f4ec":61215,"1f4ed":61216,"1f4ee":61217,"1f4ef":61123,"1f4f0":61191,"1f4f1":61144,"1f4f2":61145,"1f4f3":62737,"1f4f4":62738,"1f4f5":62665,"1f4f6":62736,"1f4f7":61168,"1f4f8":61169,"1f4f9":61170,"1f4fa":61167,"1f4fb":61134,"1f4fc":61171,"1f4fd":61165,"1f4ff":61113,"1f500":62715,"1f501":62716,"1f502":62717,"1f503":62683,"1f504":62684,"1f505":62734,"1f506":62735,"1f507":61117,"1f508":61118,"1f509":61119,"1f50a":61120,"1f50b":61150,"1f50c":61151,"1f50d":61172,"1f50e":61173,"1f50f":61251,"1f510":61252,"1f511":61253,"1f512":61249,"1f513":61250,"1f514":61124,"1f515":61125,"1f516":61194,"1f517":61274,"1f518":62860,"1f519":62685,"1f51a":62686,"1f51b":62687,"1f51c":62688,"1f51d":62689,"1f51e":62666,"1f51f":62789,"1f520":62790,"1f521":62791,"1f522":62792,"1f523":62793,"1f524":62794,"1f525":4985,"1f526":61176,"1f527":61267,"1f528":61255,"1f529":61269,"1f52a":3771,"1f52b":61262,"1f52c":61284,"1f52d":61285,"1f52e":51046,"1f52f":62701,"1f530":62761,"1f531":62759,"1f532":62862,"1f533":62861,"1f534":62829,"1f535":62833,"1f536":62853,"1f537":62854,"1f538":62855,"1f539":62856,"1f53a":62857,"1f53b":62858,"1f53c":62725,"1f53d":62727,"1f549":62692,"1f54a":2576,"1f54b":4821,"1f54c":4817,"1f54d":4819,"1f54e":62700,"1f550":4919,"1f551":4921,"1f552":4923,"1f553":4925,"1f554":4927,"1f555":4929,"1f556":4931,"1f557":4933,"1f558":4935,"1f559":4937,"1f55a":4939,"1f55b":4917,"1f55c":4920,"1f55d":4922,"1f55e":4924,"1f55f":4926,"1f560":4928,"1f561":4930,"1f562":4932,"1f563":4934,"1f564":4936,"1f565":4938,"1f566":4940,"1f567":4918,"1f56f":61174,"1f570":4916,"1f573":1144,"1f574":1549,"1f575-200d-2640":1463,"1f575-200d-2642":1462,"1f575":1461,"1f576":61073,"1f577":2614,"1f578":2615,"1f579":51050,"1f57a":1548,"1f587":61242,"1f58a":61222,"1f58b":61221,"1f58c":61223,"1f58d":61224,"1f590":1305,"1f595":1319,"1f596":1307,"1f5a4":1136,"1f5a5":61153,"1f5a8":61154,"1f5b1":61156,"1f5b2":61157,"1f5bc":51066,"1f5c2":61229,"1f5c3":61246,"1f5c4":61247,"1f5d1":61248,"1f5d2":61232,"1f5d3":61233,"1f5dc":61271,"1f5dd":61254,"1f5de":61192,"1f5e1":61260,"1f5e3":1645,"1f5e8":1148,"1f5ef":1149,"1f5f3":61218,"1f5fa":4777,"1f5fb":4783,"1f5fc":4814,"1f5fd":4815,"1f5fe":4778,"1f5ff":61320,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":113,"1f608":193,"1f609":111,"1f60a":112,"1f60b":123,"1f60c":143,"1f60d":115,"1f60e":162,"1f60f":138,"1f610":135,"1f611":136,"1f612":139,"1f613":185,"1f614":144,"1f615":165,"1f616":182,"1f617":118,"1f618":117,"1f619":121,"1f61a":120,"1f61b":124,"1f61c":125,"1f61d":127,"1f61e":184,"1f61f":166,"1f620":191,"1f621":190,"1f622":179,"1f623":183,"1f624":189,"1f625":178,"1f626":174,"1f627":175,"1f628":176,"1f629":186,"1f62a":145,"1f62b":187,"1f62c":141,"1f62d":180,"1f62e":169,"1f62f":170,"1f630":177,"1f631":181,"1f632":171,"1f633":172,"1f634":147,"1f635":157,"1f636":137,"1f637":148,"1f638":1106,"1f639":1107,"1f63a":1105,"1f63b":1108,"1f63c":1109,"1f63d":1110,"1f63e":1113,"1f63f":1112,"1f640":1111,"1f641":167,"1f642":19,"1f643":110,"1f644":140,"1f645-200d-2640":1388,"1f645-200d-2642":1387,"1f645":1386,"1f646-200d-2640":1391,"1f646-200d-2642":1390,"1f646":1389,"1f647-200d-2640":1403,"1f647-200d-2642":1402,"1f647":1401,"1f648":1114,"1f649":1115,"1f64a":1116,"1f64b-200d-2640":1397,"1f64b-200d-2642":1396,"1f64b":1395,"1f64c":1329,"1f64d-200d-2640":1382,"1f64d-200d-2642":1381,"1f64d":1380,"1f64e-200d-2640":1385,"1f64e-200d-2642":1384,"1f64e":1383,"1f64f":1333,"1f680":4906,"1f681":4901,"1f682":4838,"1f683":4839,"1f684":4840,"1f685":4841,"1f686":4842,"1f687":4843,"1f688":4844,"1f689":4845,"1f68a":4846,"1f68b":4849,"1f68c":4850,"1f68d":4851,"1f68e":4852,"1f68f":4877,"1f690":4853,"1f691":4854,"1f692":4855,"1f693":4856,"1f694":4857,"1f695":4858,"1f696":4859,"1f697":4860,"1f698":4861,"1f699":4862,"1f69a":4864,"1f69b":4865,"1f69c":4866,"1f69d":4847,"1f69e":4848,"1f69f":4902,"1f6a0":4903,"1f6a1":4904,"1f6a2":4894,"1f6a3-200d-2640":1571,"1f6a3-200d-2642":1570,"1f6a3":1569,"1f6a4":4890,"1f6a5":4883,"1f6a6":4884,"1f6a7":4886,"1f6a8":4882,"1f6a9":71543,"1f6aa":61292,"1f6ab":62659,"1f6ac":61316,"1f6ad":62661,"1f6ae":62644,"1f6af":62662,"1f6b0":62645,"1f6b1":62663,"1f6b2":4873,"1f6b3":62660,"1f6b4-200d-2640":1583,"1f6b4-200d-2642":1582,"1f6b4":1581,"1f6b5-200d-2640":1586,"1f6b5-200d-2642":1585,"1f6b5":1584,"1f6b6-200d-2640":1528,"1f6b6-200d-2642":1527,"1f6b6":1526,"1f6b7":62664,"1f6b8":62657,"1f6b9":62647,"1f6ba":62648,"1f6bb":62649,"1f6bc":62650,"1f6bd":61299,"1f6be":62651,"1f6bf":61301,"1f6c0":1605,"1f6c1":61302,"1f6c2":62652,"1f6c3":62653,"1f6c4":62654,"1f6c5":62655,"1f6cb":61297,"1f6cc":1606,"1f6cd":61095,"1f6ce":4908,"1f6cf":61296,"1f6d0":62690,"1f6d1":4885,"1f6d2":61315,"1f6d5":4818,"1f6d6":4795,"1f6d7":61293,"1f6e0":61259,"1f6e1":61265,"1f6e2":4880,"1f6e3":4878,"1f6e4":4879,"1f6e5":4893,"1f6e9":4896,"1f6eb":4897,"1f6ec":4898,"1f6f0":4905,"1f6f3":4891,"1f6f4":4874,"1f6f5":4869,"1f6f6":4889,"1f6f7":51040,"1f6f8":4907,"1f6f9":4875,"1f6fa":4872,"1f6fb":4863,"1f6fc":4876,"1f7e0":62830,"1f7e1":62831,"1f7e2":62832,"1f7e3":62834,"1f7e4":62835,"1f7e5":62838,"1f7e6":62842,"1f7e7":62839,"1f7e8":62840,"1f7e9":62841,"1f7ea":62843,"1f7eb":62844,"1f90c":1309,"1f90d":1137,"1f90e":1135,"1f90f":1310,"1f910":133,"1f911":128,"1f912":149,"1f913":163,"1f914":132,"1f915":150,"1f916":1104,"1f917":129,"1f918":1314,"1f919":1315,"1f91a":1304,"1f91b":1326,"1f91c":1327,"1f91d":1332,"1f91e":1312,"1f91f":1313,"1f920":159,"1f921":198,"1f922":151,"1f923":17,"1f924":146,"1f925":142,"1f926-200d-2640":1406,"1f926-200d-2642":1405,"1f926":1404,"1f927":153,"1f928":134,"1f929":116,"1f92a":126,"1f92b":131,"1f92c":192,"1f92d":130,"1f92e":152,"1f92f":158,"1f930":1484,"1f931":1485,"1f932":1331,"1f933":1336,"1f934":1471,"1f935-200d-2640":1480,"1f935-200d-2642":1479,"1f935":1478,"1f936":1491,"1f937-200d-2640":1409,"1f937-200d-2642":1408,"1f937":1407,"1f938-200d-2640":1589,"1f938-200d-2642":1588,"1f938":1587,"1f939-200d-2640":1601,"1f939-200d-2642":1600,"1f939":1599,"1f93a":1559,"1f93c-200d-2640":1592,"1f93c-200d-2642":1591,"1f93c":1590,"1f93d-200d-2640":1595,"1f93d-200d-2642":1594,"1f93d":1593,"1f93e-200d-2640":1598,"1f93e-200d-2642":1597,"1f93e":1596,"1f93f":51037,"1f940":2626,"1f941":61142,"1f942":3760,"1f943":3761,"1f944":3770,"1f945":51033,"1f947":51012,"1f948":51013,"1f949":51014,"1f94a":51031,"1f94b":51032,"1f94c":51041,"1f94d":51028,"1f94e":51017,"1f94f":51023,"1f950":3679,"1f951":3663,"1f952":3670,"1f953":3690,"1f954":3665,"1f955":3666,"1f956":3680,"1f957":3707,"1f958":3703,"1f959":3699,"1f95a":3701,"1f95b":3749,"1f95c":3676,"1f95d":3659,"1f95e":3684,"1f95f":3726,"1f960":3727,"1f961":3728,"1f962":3767,"1f963":3706,"1f964":3762,"1f965":3662,"1f966":3672,"1f967":3742,"1f968":3682,"1f969":3689,"1f96a":3695,"1f96b":3711,"1f96c":3671,"1f96d":3651,"1f96e":3724,"1f96f":3683,"1f970":114,"1f971":188,"1f972":122,"1f973":160,"1f974":156,"1f975":154,"1f976":155,"1f977":1467,"1f978":161,"1f97a":173,"1f97b":61086,"1f97c":61075,"1f97d":61074,"1f97e":61100,"1f97f":61101,"1f980":3729,"1f981":2519,"1f982":2616,"1f983":2568,"1f984":2525,"1f985":2577,"1f986":2578,"1f987":2557,"1f988":2602,"1f989":2580,"1f98a":2514,"1f98b":2606,"1f98c":2527,"1f98d":2506,"1f98e":2589,"1f98f":2546,"1f990":3731,"1f991":3732,"1f992":2543,"1f993":2526,"1f994":2556,"1f995":2593,"1f996":2594,"1f997":2612,"1f998":2565,"1f999":2542,"1f99a":2584,"1f99b":2547,"1f99c":2585,"1f99d":2515,"1f99e":3730,"1f99f":2617,"1f9a0":2620,"1f9a1":2566,"1f9a2":2579,"1f9a3":2545,"1f9a4":2581,"1f9a5":2562,"1f9a6":2563,"1f9a7":2507,"1f9a8":2564,"1f9a9":2583,"1f9aa":3733,"1f9ab":2555,"1f9ac":2528,"1f9ad":2598,"1f9ae":2510,"1f9af":61273,"1f9b4":1349,"1f9b5":1340,"1f9b6":1341,"1f9b7":1348,"1f9b8-200d-2640":1495,"1f9b8-200d-2642":1494,"1f9b8":1493,"1f9b9-200d-2640":1498,"1f9b9-200d-2642":1497,"1f9b9":1496,"1f9ba":61076,"1f9bb":1343,"1f9bc":4871,"1f9bd":4870,"1f9be":1338,"1f9bf":1339,"1f9c0":3686,"1f9c1":3741,"1f9c2":3710,"1f9c3":3764,"1f9c4":3673,"1f9c5":3674,"1f9c6":3700,"1f9c7":3685,"1f9c8":3709,"1f9c9":3765,"1f9ca":3766,"1f9cb":3763,"1f9cd-200d-2640":1531,"1f9cd-200d-2642":1530,"1f9cd":1529,"1f9ce-200d-2640":1534,"1f9ce-200d-2642":1533,"1f9ce":1532,"1f9cf-200d-2640":1400,"1f9cf-200d-2642":1399,"1f9cf":1398,"1f9d0":164,"1f9d1-200d-1f33e":1422,"1f9d1-200d-1f373":1425,"1f9d1-200d-1f37c":1488,"1f9d1-200d-1f384":1492,"1f9d1-200d-1f393":1413,"1f9d1-200d-1f3a4":1443,"1f9d1-200d-1f3a8":1446,"1f9d1-200d-1f3eb":1416,"1f9d1-200d-1f3ed":1431,"1f9d1-200d-1f4bb":1440,"1f9d1-200d-1f4bc":1434,"1f9d1-200d-1f527":1428,"1f9d1-200d-1f52c":1437,"1f9d1-200d-1f680":1452,"1f9d1-200d-1f692":1455,"1f9d1-200d-1f91d-200d-1f9d1":1607,"1f9d1-200d-1f9af":1535,"1f9d1-200d-1f9b0":1368,"1f9d1-200d-1f9b1":1370,"1f9d1-200d-1f9b2":1374,"1f9d1-200d-1f9b3":1372,"1f9d1-200d-1f9bc":1538,"1f9d1-200d-1f9bd":1541,"1f9d1-200d-2695":1410,"1f9d1-200d-2696":1419,"1f9d1-200d-2708":1449,"1f9d1":1358,"1f9d2":1355,"1f9d3":1377,"1f9d4":1361,"1f9d5":1477,"1f9d6-200d-2640":1555,"1f9d6-200d-2642":1554,"1f9d6":1553,"1f9d7-200d-2640":1558,"1f9d7-200d-2642":1557,"1f9d7":1556,"1f9d8-200d-2640":1604,"1f9d8-200d-2642":1603,"1f9d8":1602,"1f9d9-200d-2640":1501,"1f9d9-200d-2642":1500,"1f9d9":1499,"1f9da-200d-2640":1504,"1f9da-200d-2642":1503,"1f9da":1502,"1f9db-200d-2640":1507,"1f9db-200d-2642":1506,"1f9db":1505,"1f9dc-200d-2640":1510,"1f9dc-200d-2642":1509,"1f9dc":1508,"1f9dd-200d-2640":1513,"1f9dd-200d-2642":1512,"1f9dd":1511,"1f9de-200d-2640":1516,"1f9de-200d-2642":1515,"1f9de":1514,"1f9df-200d-2640":1519,"1f9df-200d-2642":1518,"1f9df":1517,"1f9e0":1345,"1f9e1":1130,"1f9e2":61110,"1f9e3":61080,"1f9e4":61081,"1f9e5":61082,"1f9e6":61083,"1f9e7":51003,"1f9e8":5992,"1f9e9":51053,"1f9ea":61281,"1f9eb":61282,"1f9ec":61283,"1f9ed":4779,"1f9ee":61162,"1f9ef":61314,"1f9f0":61277,"1f9f1":4792,"1f9f2":61278,"1f9f3":4909,"1f9f4":61305,"1f9f5":51068,"1f9f6":51070,"1f9f7":61306,"1f9f8":51054,"1f9f9":61307,"1f9fa":61308,"1f9fb":61309,"1f9fc":61311,"1f9fd":61313,"1f9fe":61204,"1f9ff":51048,"1fa70":61104,"1fa71":61087,"1fa72":61088,"1fa73":61089,"1fa74":61097,"1fa78":61288,"1fa79":61290,"1fa7a":61291,"1fa80":51043,"1fa81":51044,"1fa82":4899,"1fa83":61263,"1fa84":51047,"1fa85":51055,"1fa86":51056,"1fa90":4957,"1fa91":61298,"1fa92":61304,"1fa93":61256,"1fa94":61178,"1fa95":61141,"1fa96":61111,"1fa97":61136,"1fa98":61143,"1fa99":61197,"1fa9a":61266,"1fa9b":61268,"1fa9c":61279,"1fa9d":61276,"1fa9e":61294,"1fa9f":61295,"1faa0":61300,"1faa1":51069,"1faa2":51071,"1faa3":61310,"1faa4":61303,"1faa5":61312,"1faa6":61318,"1faa7":61321,"1faa8":4793,"1fab0":2618,"1fab1":2619,"1fab2":2610,"1fab3":2613,"1fab4":2632,"1fab5":4794,"1fab6":2582,"1fac0":1346,"1fac1":1347,"1fac2":1648,"1fad0":3658,"1fad1":3669,"1fad2":3661,"1fad3":3681,"1fad4":3698,"1fad5":3705,"1fad6":3751,"203c":62747,"21a9":62679,"21aa":62680,"231a":4912,"231b":4910,"23cf":62732,"23e9":62719,"23ea":62723,"23eb":62726,"23ec":62728,"23ed":62720,"23ee":62724,"23ef":62721,"23f0":4913,"23f1":4914,"23f2":4915,"23f3":4911,"23f8":62729,"23f9":62730,"23fa":62731,"24c2":62803,"25aa":62851,"25ab":62852,"25b6":62718,"25c0":62722,"25fb":62848,"25fc":62847,"25fd":62850,"25fe":62849,"260e":61146,"261d":1321,"262a":62698,"262e":62699,"262f":62695,"263a":119,"264a":62704,"264b":62705,"264c":62706,"264d":62707,"264e":62708,"264f":62709,"265f":51061,"267b":62757,"267e":62746,"267f":62646,"269b":62691,"269c":62758,"26a0":62656,"26a1":4980,"26a7":62741,"26aa":62837,"26ab":62836,"26b0":61317,"26b1":61319,"26bd":51015,"26be":51016,"26c4":4983,"26c5":4963,"26c8":4964,"26ce":62714,"26cf":61257,"26d1":61112,"26d3":61275,"26d4":62658,"26e9":4820,"26ea":4816,"26f0":4781,"26f1":4979,"26f2":4822,"26f3":51034,"26f4":4892,"26f5":4888,"26f7":1561,"26f8":51035,"26f9-200d-2640":1577,"26f9-200d-2642":1576,"26f9":1575,"26fa":4823,"26fd":4881,"270a":1324,"270b":1306,"270c":1311,"270d":1334,"270f":61219,"271d":62696,"274c":62766,"274e":62767,"27a1":62671,"27b0":62768,"27bf":62769,"2b05":62675,"2b06":62669,"2b07":62673,"2b1b":62845,"2b1c":62846,"2b50":4958,"2b55":62762,"303d":62770,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0},LatinizeMap:{"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A","Ẳ":"A","Ẵ":"A","Ǎ":"A","Â":"A","Ấ":"A","Ậ":"A","Ầ":"A","Ẩ":"A","Ẫ":"A","Ä":"A","Ǟ":"A","Ȧ":"A","Ǡ":"A","Ạ":"A","Ȁ":"A","À":"A","Ả":"A","Ȃ":"A","Ā":"A","Ą":"A","Å":"A","Ǻ":"A","Ḁ":"A","Ⱥ":"A","Ã":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ḃ":"B","Ḅ":"B","Ɓ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ć":"C","Č":"C","Ç":"C","Ḉ":"C","Ĉ":"C","Ċ":"C","Ƈ":"C","Ȼ":"C","Ď":"D","Ḑ":"D","Ḓ":"D","Ḋ":"D","Ḍ":"D","Ɗ":"D","Ḏ":"D","Dz":"D","Dž":"D","Đ":"D","Ƌ":"D","DZ":"DZ","DŽ":"DZ","É":"E","Ĕ":"E","Ě":"E","Ȩ":"E","Ḝ":"E","Ê":"E","Ế":"E","Ệ":"E","Ề":"E","Ể":"E","Ễ":"E","Ḙ":"E","Ë":"E","Ė":"E","Ẹ":"E","Ȅ":"E","È":"E","Ẻ":"E","Ȇ":"E","Ē":"E","Ḗ":"E","Ḕ":"E","Ę":"E","Ɇ":"E","Ẽ":"E","Ḛ":"E","Ꝫ":"ET","Ḟ":"F","Ƒ":"F","Ǵ":"G","Ğ":"G","Ǧ":"G","Ģ":"G","Ĝ":"G","Ġ":"G","Ɠ":"G","Ḡ":"G","Ǥ":"G","Ḫ":"H","Ȟ":"H","Ḩ":"H","Ĥ":"H","Ⱨ":"H","Ḧ":"H","Ḣ":"H","Ḥ":"H","Ħ":"H","Í":"I","Ĭ":"I","Ǐ":"I","Î":"I","Ï":"I","Ḯ":"I","İ":"I","Ị":"I","Ȉ":"I","Ì":"I","Ỉ":"I","Ȋ":"I","Ī":"I","Į":"I","Ɨ":"I","Ĩ":"I","Ḭ":"I","Ꝺ":"D","Ꝼ":"F","Ᵹ":"G","Ꞃ":"R","Ꞅ":"S","Ꞇ":"T","Ꝭ":"IS","Ĵ":"J","Ɉ":"J","Ḱ":"K","Ǩ":"K","Ķ":"K","Ⱪ":"K","Ꝃ":"K","Ḳ":"K","Ƙ":"K","Ḵ":"K","Ꝁ":"K","Ꝅ":"K","Ĺ":"L","Ƚ":"L","Ľ":"L","Ļ":"L","Ḽ":"L","Ḷ":"L","Ḹ":"L","Ⱡ":"L","Ꝉ":"L","Ḻ":"L","Ŀ":"L","Ɫ":"L","Lj":"L","Ł":"L","LJ":"LJ","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ń":"N","Ň":"N","Ņ":"N","Ṋ":"N","Ṅ":"N","Ṇ":"N","Ǹ":"N","Ɲ":"N","Ṉ":"N","Ƞ":"N","Nj":"N","Ñ":"N","NJ":"NJ","Ó":"O","Ŏ":"O","Ǒ":"O","Ô":"O","Ố":"O","Ộ":"O","Ồ":"O","Ổ":"O","Ỗ":"O","Ö":"O","Ȫ":"O","Ȯ":"O","Ȱ":"O","Ọ":"O","Ő":"O","Ȍ":"O","Ò":"O","Ỏ":"O","Ơ":"O","Ớ":"O","Ợ":"O","Ờ":"O","Ở":"O","Ỡ":"O","Ȏ":"O","Ꝋ":"O","Ꝍ":"O","Ō":"O","Ṓ":"O","Ṑ":"O","Ɵ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Õ":"O","Ṍ":"O","Ṏ":"O","Ȭ":"O","Ƣ":"OI","Ꝏ":"OO","Ɛ":"E","Ɔ":"O","Ȣ":"OU","Ṕ":"P","Ṗ":"P","Ꝓ":"P","Ƥ":"P","Ꝕ":"P","Ᵽ":"P","Ꝑ":"P","Ꝙ":"Q","Ꝗ":"Q","Ŕ":"R","Ř":"R","Ŗ":"R","Ṙ":"R","Ṛ":"R","Ṝ":"R","Ȑ":"R","Ȓ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꜿ":"C","Ǝ":"E","Ś":"S","Ṥ":"S","Š":"S","Ṧ":"S","Ş":"S","Ŝ":"S","Ș":"S","Ṡ":"S","Ṣ":"S","Ṩ":"S","ẞ":"SS","Ť":"T","Ţ":"T","Ṱ":"T","Ț":"T","Ⱦ":"T","Ṫ":"T","Ṭ":"T","Ƭ":"T","Ṯ":"T","Ʈ":"T","Ŧ":"T","Ɐ":"A","Ꞁ":"L","Ɯ":"M","Ʌ":"V","Ꜩ":"TZ","Ú":"U","Ŭ":"U","Ǔ":"U","Û":"U","Ṷ":"U","Ü":"U","Ǘ":"U","Ǚ":"U","Ǜ":"U","Ǖ":"U","Ṳ":"U","Ụ":"U","Ű":"U","Ȕ":"U","Ù":"U","Ủ":"U","Ư":"U","Ứ":"U","Ự":"U","Ừ":"U","Ử":"U","Ữ":"U","Ȗ":"U","Ū":"U","Ṻ":"U","Ų":"U","Ů":"U","Ũ":"U","Ṹ":"U","Ṵ":"U","Ꝟ":"V","Ṿ":"V","Ʋ":"V","Ṽ":"V","Ꝡ":"VY","Ẃ":"W","Ŵ":"W","Ẅ":"W","Ẇ":"W","Ẉ":"W","Ẁ":"W","Ⱳ":"W","Ẍ":"X","Ẋ":"X","Ý":"Y","Ŷ":"Y","Ÿ":"Y","Ẏ":"Y","Ỵ":"Y","Ỳ":"Y","Ƴ":"Y","Ỷ":"Y","Ỿ":"Y","Ȳ":"Y","Ɏ":"Y","Ỹ":"Y","Ź":"Z","Ž":"Z","Ẑ":"Z","Ⱬ":"Z","Ż":"Z","Ẓ":"Z","Ȥ":"Z","Ẕ":"Z","Ƶ":"Z","IJ":"IJ","Œ":"OE","ᴀ":"A","ᴁ":"AE","ʙ":"B","ᴃ":"B","ᴄ":"C","ᴅ":"D","ᴇ":"E","ꜰ":"F","ɢ":"G","ʛ":"G","ʜ":"H","ɪ":"I","ʁ":"R","ᴊ":"J","ᴋ":"K","ʟ":"L","ᴌ":"L","ᴍ":"M","ɴ":"N","ᴏ":"O","ɶ":"OE","ᴐ":"O","ᴕ":"OU","ᴘ":"P","ʀ":"R","ᴎ":"N","ᴙ":"R","ꜱ":"S","ᴛ":"T","ⱻ":"E","ᴚ":"R","ᴜ":"U","ᴠ":"V","ᴡ":"W","ʏ":"Y","ᴢ":"Z","á":"a","ă":"a","ắ":"a","ặ":"a","ằ":"a","ẳ":"a","ẵ":"a","ǎ":"a","â":"a","ấ":"a","ậ":"a","ầ":"a","ẩ":"a","ẫ":"a","ä":"a","ǟ":"a","ȧ":"a","ǡ":"a","ạ":"a","ȁ":"a","à":"a","ả":"a","ȃ":"a","ā":"a","ą":"a","ᶏ":"a","ẚ":"a","å":"a","ǻ":"a","ḁ":"a","ⱥ":"a","ã":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ḃ":"b","ḅ":"b","ɓ":"b","ḇ":"b","ᵬ":"b","ᶀ":"b","ƀ":"b","ƃ":"b","ɵ":"o","ć":"c","č":"c","ç":"c","ḉ":"c","ĉ":"c","ɕ":"c","ċ":"c","ƈ":"c","ȼ":"c","ď":"d","ḑ":"d","ḓ":"d","ȡ":"d","ḋ":"d","ḍ":"d","ɗ":"d","ᶑ":"d","ḏ":"d","ᵭ":"d","ᶁ":"d","đ":"d","ɖ":"d","ƌ":"d","ı":"i","ȷ":"j","ɟ":"j","ʄ":"j","dz":"dz","dž":"dz","é":"e","ĕ":"e","ě":"e","ȩ":"e","ḝ":"e","ê":"e","ế":"e","ệ":"e","ề":"e","ể":"e","ễ":"e","ḙ":"e","ë":"e","ė":"e","ẹ":"e","ȅ":"e","è":"e","ẻ":"e","ȇ":"e","ē":"e","ḗ":"e","ḕ":"e","ⱸ":"e","ę":"e","ᶒ":"e","ɇ":"e","ẽ":"e","ḛ":"e","ꝫ":"et","ḟ":"f","ƒ":"f","ᵮ":"f","ᶂ":"f","ǵ":"g","ğ":"g","ǧ":"g","ģ":"g","ĝ":"g","ġ":"g","ɠ":"g","ḡ":"g","ᶃ":"g","ǥ":"g","ḫ":"h","ȟ":"h","ḩ":"h","ĥ":"h","ⱨ":"h","ḧ":"h","ḣ":"h","ḥ":"h","ɦ":"h","ẖ":"h","ħ":"h","ƕ":"hv","í":"i","ĭ":"i","ǐ":"i","î":"i","ï":"i","ḯ":"i","ị":"i","ȉ":"i","ì":"i","ỉ":"i","ȋ":"i","ī":"i","į":"i","ᶖ":"i","ɨ":"i","ĩ":"i","ḭ":"i","ꝺ":"d","ꝼ":"f","ᵹ":"g","ꞃ":"r","ꞅ":"s","ꞇ":"t","ꝭ":"is","ǰ":"j","ĵ":"j","ʝ":"j","ɉ":"j","ḱ":"k","ǩ":"k","ķ":"k","ⱪ":"k","ꝃ":"k","ḳ":"k","ƙ":"k","ḵ":"k","ᶄ":"k","ꝁ":"k","ꝅ":"k","ĺ":"l","ƚ":"l","ɬ":"l","ľ":"l","ļ":"l","ḽ":"l","ȴ":"l","ḷ":"l","ḹ":"l","ⱡ":"l","ꝉ":"l","ḻ":"l","ŀ":"l","ɫ":"l","ᶅ":"l","ɭ":"l","ł":"l","lj":"lj","ſ":"s","ẜ":"s","ẛ":"s","ẝ":"s","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ᵯ":"m","ᶆ":"m","ń":"n","ň":"n","ņ":"n","ṋ":"n","ȵ":"n","ṅ":"n","ṇ":"n","ǹ":"n","ɲ":"n","ṉ":"n","ƞ":"n","ᵰ":"n","ᶇ":"n","ɳ":"n","ñ":"n","nj":"nj","ó":"o","ŏ":"o","ǒ":"o","ô":"o","ố":"o","ộ":"o","ồ":"o","ổ":"o","ỗ":"o","ö":"o","ȫ":"o","ȯ":"o","ȱ":"o","ọ":"o","ő":"o","ȍ":"o","ò":"o","ỏ":"o","ơ":"o","ớ":"o","ợ":"o","ờ":"o","ở":"o","ỡ":"o","ȏ":"o","ꝋ":"o","ꝍ":"o","ⱺ":"o","ō":"o","ṓ":"o","ṑ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","õ":"o","ṍ":"o","ṏ":"o","ȭ":"o","ƣ":"oi","ꝏ":"oo","ɛ":"e","ᶓ":"e","ɔ":"o","ᶗ":"o","ȣ":"ou","ṕ":"p","ṗ":"p","ꝓ":"p","ƥ":"p","ᵱ":"p","ᶈ":"p","ꝕ":"p","ᵽ":"p","ꝑ":"p","ꝙ":"q","ʠ":"q","ɋ":"q","ꝗ":"q","ŕ":"r","ř":"r","ŗ":"r","ṙ":"r","ṛ":"r","ṝ":"r","ȑ":"r","ɾ":"r","ᵳ":"r","ȓ":"r","ṟ":"r","ɼ":"r","ᵲ":"r","ᶉ":"r","ɍ":"r","ɽ":"r","ↄ":"c","ꜿ":"c","ɘ":"e","ɿ":"r","ś":"s","ṥ":"s","š":"s","ṧ":"s","ş":"s","ŝ":"s","ș":"s","ṡ":"s","ṣ":"s","ṩ":"s","ʂ":"s","ᵴ":"s","ᶊ":"s","ȿ":"s","ɡ":"g","ß":"ss","ᴑ":"o","ᴓ":"o","ᴝ":"u","ť":"t","ţ":"t","ṱ":"t","ț":"t","ȶ":"t","ẗ":"t","ⱦ":"t","ṫ":"t","ṭ":"t","ƭ":"t","ṯ":"t","ᵵ":"t","ƫ":"t","ʈ":"t","ŧ":"t","ᵺ":"th","ɐ":"a","ᴂ":"ae","ǝ":"e","ᵷ":"g","ɥ":"h","ʮ":"h","ʯ":"h","ᴉ":"i","ʞ":"k","ꞁ":"l","ɯ":"m","ɰ":"m","ᴔ":"oe","ɹ":"r","ɻ":"r","ɺ":"r","ⱹ":"r","ʇ":"t","ʌ":"v","ʍ":"w","ʎ":"y","ꜩ":"tz","ú":"u","ŭ":"u","ǔ":"u","û":"u","ṷ":"u","ü":"u","ǘ":"u","ǚ":"u","ǜ":"u","ǖ":"u","ṳ":"u","ụ":"u","ű":"u","ȕ":"u","ù":"u","ủ":"u","ư":"u","ứ":"u","ự":"u","ừ":"u","ử":"u","ữ":"u","ȗ":"u","ū":"u","ṻ":"u","ų":"u","ᶙ":"u","ů":"u","ũ":"u","ṹ":"u","ṵ":"u","ᵫ":"ue","ꝸ":"um","ⱴ":"v","ꝟ":"v","ṿ":"v","ʋ":"v","ᶌ":"v","ⱱ":"v","ṽ":"v","ꝡ":"vy","ẃ":"w","ŵ":"w","ẅ":"w","ẇ":"w","ẉ":"w","ẁ":"w","ⱳ":"w","ẘ":"w","ẍ":"x","ẋ":"x","ᶍ":"x","ý":"y","ŷ":"y","ÿ":"y","ẏ":"y","ỵ":"y","ỳ":"y","ƴ":"y","ỷ":"y","ỿ":"y","ȳ":"y","ẙ":"y","ɏ":"y","ỹ":"y","ź":"z","ž":"z","ẑ":"z","ʑ":"z","ⱬ":"z","ż":"z","ẓ":"z","ȥ":"z","ẕ":"z","ᵶ":"z","ᶎ":"z","ʐ":"z","ƶ":"z","ɀ":"z","ff":"ff","ffi":"ffi","ffl":"ffl","fi":"fi","fl":"fl","ij":"ij","œ":"oe","st":"st","ₐ":"a","ₑ":"e","ᵢ":"i","ⱼ":"j","ₒ":"o","ᵣ":"r","ᵤ":"u","ᵥ":"v","ₓ":"x","Ё":"YO","Й":"I","Ц":"TS","У":"U","К":"K","Е":"E","Н":"N","Г":"G","Ш":"SH","Щ":"SCH","З":"Z","Х":"H","Ъ":"","ё":"yo","й":"i","ц":"ts","у":"u","к":"k","е":"e","н":"n","г":"g","ш":"sh","щ":"sch","з":"z","х":"h","ъ":"","Ф":"F","Ы":"I","В":"V","А":"A","П":"P","Р":"R","О":"O","Л":"L","Д":"D","Ж":"ZH","Э":"E","ф":"f","ы":"i","в":"v","а":"a","п":"p","р":"r","о":"o","л":"l","д":"d","ж":"zh","э":"e","Я":"Ya","Ч":"CH","С":"S","М":"M","И":"I","Т":"T","Ь":"","Б":"B","Ю":"YU","я":"ya","ч":"ch","с":"s","м":"m","и":"i","т":"t","ь":"","б":"b","ю":"yu"},TLD:["abogado","ac","academy","accountants","active","actor","ad","adult","ae","aero","af","ag","agency","ai","airforce","al","allfinanz","alsace","am","amsterdam","an","android","ao","apartments","aq","aquarelle","ar","archi","army","arpa","as","asia","associates","at","attorney","au","auction","audio","autos","aw","ax","axa","az","ba","band","bank","bar","barclaycard","barclays","bargains","bayern","bb","bd","be","beer","berlin","best","bf","bg","bh","bi","bid","bike","bingo","bio","biz","bj","black","blackfriday","bloomberg","blue","bm","bmw","bn","bnpparibas","bo","boo","boutique","br","brussels","bs","bt","budapest","build","builders","business","buzz","bv","bw","by","bz","bzh","ca","cab","cal","camera","camp","cancerresearch","canon","capetown","capital","caravan","cards","care","career","careers","cartier","casa","cash","cat","catering","cc","cd","center","ceo","cern","cf","cg","ch","channel","chat","cheap","christmas","chrome","church","ci","citic","city","ck","cl","claims","cleaning","click","clinic","clothing","club","cm","cn","co","coach","codes","coffee","college","cologne","com","community","company","computer","condos","construction","consulting","contractors","cooking","cool","coop","country","cr","credit","creditcard","cricket","crs","cruises","cu","cuisinella","cv","cw","cx","cy","cymru","cz","dabur","dad","dance","dating","day","dclk","de","deals","degree","delivery","democrat","dental","dentist","desi","design","dev","diamonds","diet","digital","direct","directory","discount","dj","dk","dm","dnp","do","docs","domains","doosan","durban","dvag","dz","eat","ec","edu","education","ee","eg","email","emerck","energy","engineer","engineering","enterprises","equipment","er","es","esq","estate","et","eu","eurovision","eus","events","everbank","exchange","expert","exposed","fail","farm","fashion","feedback","fi","finance","financial","firmdale","fish","fishing","fit","fitness","fj","fk","flights","florist","flowers","flsmidth","fly","fm","fo","foo","forsale","foundation","fr","frl","frogans","fund","furniture","futbol","ga","gal","gallery","garden","gb","gbiz","gd","ge","gent","gf","gg","ggee","gh","gi","gift","gifts","gives","gl","glass","gle","global","globo","gm","gmail","gmo","gmx","gn","goog","google","gop","gov","gp","gq","gr","graphics","gratis","green","gripe","gs","gt","gu","guide","guitars","guru","gw","gy","hamburg","hangout","haus","healthcare","help","here","hermes","hiphop","hiv","hk","hm","hn","holdings","holiday","homes","horse","host","hosting","house","how","hr","ht","hu","ibm","id","ie","ifm","il","im","immo","immobilien","in","industries","info","ing","ink","institute","insure","int","international","investments","io","iq","ir","irish","is","it","iwc","jcb","je","jetzt","jm","jo","jobs","joburg","jp","juegos","kaufen","kddi","ke","kg","kh","ki","kim","kitchen","kiwi","km","kn","koeln","kp","kr","krd","kred","kw","ky","kyoto","kz","la","lacaixa","land","lat","latrobe","lawyer","lb","lc","lds","lease","legal","lgbt","li","lidl","life","lighting","limited","limo","link","lk","loans","london","lotte","lotto","lr","ls","lt","ltda","lu","luxe","luxury","lv","ly","ma","madrid","maison","management","mango","market","marketing","marriott","mc","md","me","media","meet","melbourne","meme","memorial","menu","mg","mh","miami","mil","mini","mk","ml","mm","mn","mo","mobi","moda","moe","monash","money","mormon","mortgage","moscow","motorcycles","mov","mp","mq","mr","ms","mt","mu","museum","mv","mw","mx","my","mz","na","nagoya","name","navy","nc","ne","net","network","neustar","new","nexus","nf","ng","ngo","nhk","ni","nico","ninja","nl","no","np","nr","nra","nrw","ntt","nu","nyc","nz","okinawa","om","one","ong","onl","ooo","org","organic","osaka","otsuka","ovh","pa","paris","partners","parts","party","pe","pf","pg","ph","pharmacy","photo","photography","photos","physio","pics","pictures","pink","pizza","pk","pl","place","plumbing","pm","pn","pohl","poker","porn","post","pr","praxi","press","pro","prod","productions","prof","properties","property","ps","pt","pub","pw","py","qa","qpon","quebec","re","realtor","recipes","red","rehab","reise","reisen","reit","ren","rentals","repair","report","republican","rest","restaurant","reviews","rich","rio","rip","ro","rocks","rodeo","rs","rsvp","ru","ruhr","rw","ryukyu","sa","saarland","sale","samsung","sarl","saxo","sb","sc","sca","scb","schmidt","schule","schwarz","science","scot","sd","se","services","sew","sexy","sg","sh","shiksha","shoes","shriram","si","singles","sj","sk","sky","sl","sm","sn","so","social","software","sohu","solar","solutions","soy","space","spiegel","sr","st","style","su","supplies","supply","support","surf","surgery","suzuki","sv","sx","sy","sydney","systems","sz","taipei","tatar","tattoo","tax","tc","td","technology","tel","temasek","tennis","tf","tg","th","tienda","tips","tires","tirol","tj","tk","tl","tm","tn","to","today","tokyo","tools","top","toshiba","town","toys","tp","tr","trade","training","travel","trust","tt","tui","tv","tw","tz","ua","ug","uk","university","uno","uol","us","uy","uz","va","vacations","vc","ve","vegas","ventures","versicherung","vet","vg","vi","viajes","video","villas","vision","vlaanderen","vn","vodka","vote","voting","voto","voyage","vu","wales","wang","watch","webcam","website","wed","wedding","wf","whoswho","wien","wiki","williamhill","wme","work","works","world","ws","wtc","wtf","佛山","集团","在线","한국","ভারত","八卦","موقع","公益","公司","移动","我爱你","москва","қаз","онлайн","сайт","срб","淡马锡","орг","삼성","சிங்கப்பூர்","商标","商店","商城","дети","мкд","中文网","中信","中国","中國","谷歌","భారత్","ලංකා","ભારત","भारत","网店","संगठन","网络","укр","香港","台湾","台灣","手机","мон","الجزائر","عمان","ایران","امارات","بازار","الاردن","بھارت","المغرب","السعودية","مليسيا","شبكة","გე","机构","组织机构","ไทย","سورية","рус","рф","تونس","みんな","グーグル","世界","ਭਾਰਤ","网址","游戏","vermögensberater","vermögensberatung","企业","مصر","قطر","广东","இலங்கை","இந்தியா","新加坡","فلسطين","政务","xxx","xyz","yachts","yandex","ye","yoga","yokohama","youtube","yt","za","zip","zm","zone","zuerich","zw"],MediaSizes:d(38).b};t.a.Config=a,e.a=a},152:function(f,e,d){"use strict";d.d(e,"a",(function(){return t}));class t{invokeCrypto(f,...e){return this.performTaskWorker(f,...e)}}},153:function(f,e,d){"use strict";d.d(e,"a",(function(){return c}));var t=d(37),a=d(63),s=d(48);class c extends s.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=a.a.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=f=>{this.log.error("handleError",f),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=f=>{this.debug&&this.log.debug("<-","handleMessage",f.data.byteLength),this.dispatchEvent("message",f.data)},this.send=f=>{this.debug&&this.log.debug("-> body length to send:",f.length),this.ws.send(f)};let s=t.a.Error|t.a.Log;return this.debug&&(s|=t.a.Debug),this.log=Object(t.b)("WS-"+f+d,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(f){}this.handleClose()}}}},154:function(f,e,d){"use strict";var t=d(29),a=d(61),s=d(37),c=d(15),n=d(62),i=d(33);const r=new class{constructor(){this.log=Object(s.b)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),n.a.delete("xt_instance"))},this.deactivateInstance=()=>{if(this.masterInstance||this.deactivated)return!1;this.log("deactivate"),this.deactivateTimeout=0,this.deactivated=!0,this.clearInstance(),c.default.idle.deactivated=!0,c.default.dispatchEvent("instance_deactivated")},this.checkInstance=(f=c.default.idle&&c.default.idle.isIDLE)=>{if(this.deactivated)return!1;const e=Date.now(),d={id:this.instanceID,idle:f,time:e};n.a.get("xt_instance",!1).then(t=>{!f||!t||t.id===this.instanceID||t.time{const a=[];h(f.default,a),h(d.default,a);return p({_:"langPackDifference",from_version:0,lang_code:e,strings:a,version:0,local:!0,countries:t.default})})}function b(e){return f.requestedServerLanguage=!0,Promise.all([c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:i.a.langPack}),c.a.invokeApiCacheable("langpack.getLangPack",{lang_code:e,lang_pack:"android"}),d.e(8).then(d.bind(null,156)),d.e(9).then(d.bind(null,157)),c.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(f,e=[]){for(const d in f){const t=f[d];"string"==typeof t?e.push({_:"langPackString",key:d,value:t}):e.push(Object.assign({_:"langPackStringPluralized",key:d},t))}return e}function g(e){return f.lastRequestedLangCode=e,b(e).then(([f,e,d,t,a,s])=>{let c=[];[d,t].forEach(f=>{h(f.default,c)}),c=c.concat(f.strings);for(const f of e.strings)c.push(f);return f.strings=c,f.countries=a,p(f)})}function p(f){return f.appVersion=i.a.langPackVersion,n.a.set({langPack:f}).then(()=>(m(f),f))}function m(d){if(d.lang_code!==f.lastRequestedLangCode)return;try{e=new Intl.PluralRules(d.lang_code)}catch(f){console.error("pluralRules error",f),e=new Intl.PluralRules(d.lang_code.split("-",1)[0])}f.strings.clear();for(const e of d.strings)f.strings.set(e.key,e);d.countries&&(f.countriesList.length=0,f.countriesList.push(...d.countries.countries),d.countries.countries.forEach(e=>{if(e.name){const d=e.default_name;f.strings.set(d,{_:"langPackString",key:d,value:e.name})}})),f.lastAppliedLangCode!==d.lang_code&&(r.default.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code);Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function k(f,e,d={i:0}){let t=[];let a=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,s,c,n,i,r,u)=>{if(t.push(u.slice(a,r)),s){let f;switch(s){case"**":f=document.createElement("b");break;case"__":f=document.createElement("i")}f.append(...k(c,e,d)),t.push(f)}else if(n)t.push(document.createElement("br"));else if(i){const f=i.lastIndexOf("]"),a=i.slice(1,f),s=i.slice(f+2,i.length-1);let c;if(s&&o.b.matchUrlProtocol(s)){c=document.createElement("a");const f=o.b.wrapUrl(s);c.href=f.url,f.onclick&&c.setAttribute("onclick",f.onclick),c.target="_blank"}else c=e[d.i++],c.textContent="";c.append(...k(a,e,d)),t.push(c)}else e&&function(f,e,d){const t=e[d.i++];Array.isArray(t)?f.push(...t):f.push(t)}(t,e,d);return a=r+f.length,""}),a!==f.length&&t.push(f.slice(a)),t}function y(d,t=!1,a){const s=f.strings.get(d);let c;if(s)if("langPackStringPluralized"===s._&&(null==a?void 0:a.length)){let f=a[0];"string"==typeof f&&(f=+f.replace(/\D/g,""));c=s[e.select(f)+"_value"]||s.other_value}else c="langPackString"===s._?s.value:d;else c=d;const n=k(c,a);return t?n.map(f=>f instanceof Node?f.textContent:f).join(""):n}f.strings=new Map,f.countriesList=[],f.requestedServerLanguage=!1,f.getCacheLangPack=function(){return u||(u=Promise.all([n.a.get("langPack"),f.polyfillPromise]).then(([e])=>e?(t.b,f.lastRequestedLangCode||(f.lastRequestedLangCode=e.lang_code),m(e),e):l()).finally(()=>{u=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof E&&d.update()})}},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return c.a.invokeApi("langpack.getStrings",{lang_pack:i.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=p,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(29).then(d.bind(null,173)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=m,f.superFormatter=k,f.format=y,f.weakMap=new WeakMap;class v{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class w extends v{update(f){if(Object(a.g)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(this.key,!0,this.args);void 0===f?this.element.dataset[this.property]=e:this.element[this.property]=e}}compareAndUpdate(f){if(this.key!==f.key||!Object(a.b)(this.args,f.args))return this.update(f)}}f.IntlElement=w;class E extends v{update(e){Object(a.g)(this,e);const d=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,this.options);this.element[this.property]=Object(s.a)(d.format(this.date))}}f.IntlDateElement=E,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({element:f,key:e,args:d,property:t}).element}}(h||(h={})),e.default=h;const g=h.i18n,p=h.i18n_,m=h._i18n;function k(f,e){const d=f.slice(0,1);for(let t=1;t{const t=f&&e?"WordDelimiterLast":"WordDelimiter";return d?h.format(t,!0):g(t)});return d?t.join(""):t}t.a.I18n=h},167:function(f,e,d){"use strict";function t(){return new Worker(d.p+"webp.worker.db1ce269f081e74b2c5a.bundle.worker.js")}var a=d(29),s=d(45),c=d(33);const n=new class{constructor(){this.convertPromises={}}init(){this.worker=new t,this.worker.addEventListener("message",f=>{const e=f.data.payload;if(0===e.fileName.indexOf("main-")){const f=this.convertPromises[e.fileName];f&&(e.bytes?f.resolve(e.bytes):f.reject(),delete this.convertPromises[e.fileName])}else c.a.postMessage(f.data)})}postMessage(f){this.init&&(this.init(),this.init=null),this.worker.postMessage(f)}convert(f,e){if(f="main-"+f,this.convertPromises.hasOwnProperty(f))return this.convertPromises[f];const d=Object(s.a)();return this.postMessage({type:"convertWebp",payload:{fileName:f,bytes:e}}),this.convertPromises[f]=d}};a.a.webpWorkerController=n;e.a=n},24:function(f,e,d){"use strict";d.r(e),d.d(e,"TelegramMeWebManager",(function(){return i}));var t=d(7),a=d(29),s=d(63),c=d(59),n=d(62);class i{constructor(){this.disabled=s.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return n.a.get("tgme_sync").then(e=>{const d=Object(c.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;n.a.set({tgme_sync:{canRedirect:f,ts:d}});const a=`_websync_?authed=${f?"1":"0"}&version=${encodeURIComponent(t.a.version+" "+t.a.suffix)}`,s=["//telegram.me/"+a,"//t.me/"+a].map(f=>{const e=document.createElement("script"),d=new Promise(f=>{e.onload=e.onerror=()=>{e.remove(),f()}});return e.src=f,document.body.appendChild(e),d});return Promise.all(s)})}}const r=new i;a.a&&(a.a.telegramMeWebManager=r),e.default=r},26:function(f,e,d){"use strict";d.r(e),d.d(e,"WebPushApiManager",(function(){return u}));var t=d(29),a=d(31),s=d(37),c=d(15),n=d(33),i=d(16),r=d(0),o=d(141);class u{constructor(){this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=Object(s.b)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then(f=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",f)}).catch(f=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",f),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))})})},this.isAliveNotify=()=>{if(!this.isAvailable||c.default.idle&&c.default.idle.deactivated)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"")+"#/im";const f={},e={push_action_mute1d:r.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:r.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.default.format(e[d],!0);const d={type:"ping",payload:{localNotifications:this.localNotificationsAvailable,lang:f,settings:this.settings}};n.a.postSWMessage(d),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!!f,this.pushSubscriptionNotify("init",f)}).catch(f=>{this.log.error("Error during getSubscription()",f)})})}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.isPushEnabled=!1,f&&(this.pushSubscriptionNotify("unsubscribe",f),setTimeout(()=>{f.unsubscribe().then(f=>{this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})},3e3))}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then(f=>{f.pushManager.getSubscription().then(f=>{this.log.warn("force unsubscribe",f),f&&f.unsubscribe().then(f=>{this.log.warn("force unsubscribe successful",f),this.isPushEnabled=!1}).catch(f=>{this.log.error("Unsubscription error: ",f)})}).catch(f=>{this.log.error("Error thrown while unsubscribing from push messaging.",f)})})}setSettings(f){this.settings=Object(a.a)(f),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){if(!this.isAvailable)return;n.a.postSWMessage({type:"notifications_clear"})}setUpServiceWorkerChannel(){this.isAvailable&&(n.a.addServiceWorkerTaskListener("push_click",f=>{c.default.idle&&c.default.idle.deactivated?o.a.reload():c.default.dispatchEvent("push_notification_click",f.payload)}),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(f,e){if(e){const d=e.toJSON();if(!(d&&d.endpoint&&d.keys&&d.keys.p256dh&&d.keys.auth))return this.log.warn("Invalid push subscription",d),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(f);this.log.warn("Push",f,d),c.default.dispatchEvent("push_"+f,{tokenType:10,tokenValue:JSON.stringify(d)})}else this.log.warn("Push",f,!1),c.default.dispatchEvent("push_"+f,!1)}}const l=new u;t.a&&(t.a.webPushApiManager=l),e.default=l},32:function(f,e,d){"use strict";d.d(e,"a",(function(){return w}));var t=d(143);var a=d(99),s=d(88),c=d(0),n=d(29),i=d(10),r=d(31);const o=t.a.Emoji,u="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?(?:"+l+"{1,64}(?::"+l+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",h=(new RegExp("^"+"((?:https?|ftp)://|mailto:)?".slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),g=new RegExp("(^| )(@)([a-zA-Z\\d_]{5,32})|("+b+")|(\\n)|(((?:👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍❤️?‍💋‍👨|👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍❤️?‍👨|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍❤️?‍\ud83d[\udc68\udc69]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️?⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️))|(^|[\\s\\(\\]])(#[0-9_a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc]{2,64})|(^|\\s)\\/([a-zA-Z\\d_]{1,32})(?:@([a-zA-Z\\d_]{5,32}))?(\\b|$)","i"),p=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,k={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},y={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(let f in y)v.add(y[f]);var w;!function(f){function e(f){let e=Object(a.b)(f).replace(/-?fe0f/g,"");return o.hasOwnProperty(e)?e:null}function d(f){let d,a=f;const s=[];let c,n=0;for(g.lastIndex=0;d=a.match(g);){if(c=n+d.index,d[3])s.push({_:"messageEntityMention",offset:c+d[1].length,length:d[2].length+d[3].length});else if(d[4])if(p.test(d[4]))s.push({_:"messageEntityEmail",offset:c,length:d[4].length});else{let f,e=d[5];const a=d[6];if(a){if(e||"xn--"!==a.substr(0,4)&&-1===t.a.TLD.indexOf(a.toLowerCase())||(e="http://"),e){const t=C(d[4]);t.length!==d[4].length&&(d[4]=t),f=(d[5]?"":e)+d[4]}}else f=(d[5]?"":"http://")+d[4];f&&s.push({_:"messageEntityUrl",offset:c,length:d[4].length})}else if(d[7])s.push({_:"messageEntityLinebreak",offset:c,length:1});else if(d[8]){const f=e(d[8]);f&&s.push({_:"messageEntityEmoji",offset:c,length:d[8].length,unicode:f})}else d[11]?s.push({_:"messageEntityHashtag",offset:c+(d[10]?d[10].length:0),length:d[11].length}):d[13]&&s.push({_:"messageEntityBotCommand",offset:c+(d[11]?d[11].length:0)+(d[12]?d[12].length:0),length:1+d[13].length+(d[14]?1+d[14].length:0),unsafe:!0});a=a.substr(d.index+d[0].length),n+=d.index+d[0].length}return s}function n(f,e){return f.find(f=>{if(!(e._===f._||!v.has(e._)&&!v.has(f._)))return!1;return e.offset>=f.offset&&e.length+e.offset<=f.length+f.offset})}function u(f,e){const d=e.filter(e=>!n(f,e));f.push(...d),E(f);for(let e=0;en(e,f)?a=!1:(t.push(f),a=!0),c=[];let i,r=0;for(;i=f.match(m);){const e=r+i.index;c.push(f.substr(0,i.index));const d=i[3]||i[8]||i[11]||i[13];let t;if(r-=d.length,r+=d.length,a=!1,d.match(/^`*$/))c.push(i[0]);else if(i[3])t={_:"messageEntityPre",language:"",offset:e+i[1].length,length:d.length},s(t)&&("\n"===i[5]&&(i[5]="",r-=1),c.push(i[1]+d+i[5]),r-=i[2].length+i[4].length);else if(i[7]){const f=""===i[6];t={_:y[i[7]],offset:e+(f?0:i[6].length),length:d.length},s(t)&&(f?c.push(d):c.push(i[6]+d+i[9]),r-=2*i[7].length+(f?2:0))}else i[11]?(t={_:"messageEntityMentionName",user_id:i[10].toUserId(),offset:e,length:d.length},s(t)&&(c.push(d),r-=i[0].length-d.length)):i[12]&&(t={_:"messageEntityTextUrl",url:i[14],offset:e,length:d.length},s(t)&&(c.push(d),r-=i[12].length-d.length));a||c.push(i[0]),f=f.substr(i.index+i[0].length),r+=i.index+i[0].length}c.push(f);let o=c.join("");o.replace(/\s+/g,"").length||(o=f,t.splice(0,t.length)),u(e,t),w(e);let l=o.length;if(!d){o=o.replace(/^\s*/,"");let f=l-o.length;f&&e.forEach(e=>{e.offset=Math.max(0,e.offset-f)}),o=o.replace(/\s*$/,""),f=l-o.length,l=o.length,f&&e.forEach(f=>{f.offset+f.length>l&&(f.length=l-f.offset)})}return o},f.findConflictingEntity=n,f.mergeEntities=u;const l=new Set(["messageEntityBold","messageEntityItalic","messageEntityCode","messageEntityPre","messageEntityUnderline","messageEntityStrike","messageEntityBlockquote","messageEntitySpoiler"]);function w(f){for(let e=0;el.has(f._)&&t!==e&&f._===d._&&f.offset-d.length===d.offset),-1!==t){const e=f[t];d.length+=e.length,f.splice(t,1)}}while(-1!==t)}}function E(f){f.sort((f,e)=>f.offset-e.offset||e.length-f.length)}function A(f,e={}){if(!f)return"";const t=[],a=e.entities||d(f),n=e.passEntities||{},o=e.contextSite||"Telegram",u="Telegram"!==o,l=(f,e,d)=>{const a=f.offset,s=d?f.offset+f.length:void 0;let c,n;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===c&&a>=e&&(c=f+1),void 0!==s&&s<=e&&(n=f),a>e&&(void 0===s||s=h){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>h&&(t=Object(r.a)(t),t.length=t.offset+t.length-h);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?l(t,'',""):l(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){l(t,``,"")}else e.noTextFormat||l(t,"","");break;case"messageEntityCode":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,"","");break;case"messageEntityPre":e.wrappingDraft?l(t,'',""):e.noTextFormat||l(t,`
`,"
");break;case"messageEntityHighlight":l(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&n[t._]){let d,a,c=f.substr(t.offset,t.length).substr(1);-1!==(a=c.indexOf("@"))?(d=c.substr(a+1),c=c.substr(0,a)):d=e.fromBot,l(t,``,"")}break;case"messageEntityEmoji":i.a?e.wrappingDraft||l(t,'',""):l(t,``,'');break;case"messageEntityCaret":{const f='';b.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||n[t._]){const c=f.substr(t.offset,t.length);let n,i=t.url||c,r=!1;const o=P(i,!0);if(i=o.url,n=o.onclick,"messageEntityTextUrl"===t._){const f=a[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==c&&(r=!0)}const u=!!n;n||!r||u||(n="showMaskedAlert"),e.wrappingDraft&&(n=void 0);l(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){const e=f.substr(t.offset,t.length);l(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&k[o];if(d){const e=f.substr(t.offset,t.length).substr(1);l(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!n[t._]||l(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:a}=P("t.me/"+e);l(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),a=f.slice(t.offset+t.length);f=e+S(d)+a}else e.wrappingDraft?l(t,'',""):l(t,'',"")}}let g=t.length,p=b.length;for(let f=0;f=e.offset););t.splice(d,0,e)}g+=p;const m=[];let y=0;for(let d=0;dy){const d=f.slice(y,c);m.push(e.noEncoding?d:Object(s.d)(d)),y=c}m.push(a)}if(yd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function S(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let a=0;a"messageEntityEmoji"===f._),wrappingDraft:e})}function P(f,e){let d,t,a,s;if(D(f)||(f="https://"+f),d=f.match(/^(?:https?:\/\/)?t(?:elegram)?\.me\/(.+)/)){const e=d[1];if(/^\W/.test(e))return s="joinchat",{url:f,onclick:s};const t=e.split("/");switch(t[0]){case"joinchat":case"addstickers":case"voicechat":s=t[0];break;default:if(t[1]&&t[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===t.length){s="im";break}}}else(t=f.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?s="im":(a=f.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(s="tg_"+a[1]);return window[s]||(s=void 0),{url:f,onclick:s}}function D(f){return f?f.match(h):null}function L(f){return{_:"messageEntityEmoji",offset:0,length:f.length,unicode:Object(a.e)(f).join("-").replace(/-?fe0f/g,"")}}f.combineSameEntities=w,f.sortEntities=E,f.wrapRichText=A,f.fixEmoji=function(f,e){return f=f.replace(/[\u2640\u2642\u2764](?!\ufe0f)/g,(f,d,t)=>{if(e){const t=f.length;d+=t,e.forEach(f=>{const e=f.offset+f.length;e===d?f.length+=t:e>d&&(f.offset+=t)})}return f+"️"})},f.wrapDraftText=function(f,e={}){return f?A(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=C,f.spoiler=S,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),A(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=T,f.wrapUrl=P,f.matchUrlProtocol=D,f.matchUrl=function(f){return f?f.match(b):null},f.matchEmail=function(f){return f?f.match(p):null},f.getAbbreviation=function(f,e=!1){if(!f)return"";const d=f.trim().split(" ");if(!d[0])return"";const t=[...d[0]][0];return e||1===d.length?T(t):T(t+[...d[d.length-1]][0])},f.isUsernameValid=function(f){return(f.length>=5&&f.length<=32||!f.length)&&/^[a-zA-Z0-9_]*$/.test(f)},f.getEmojiEntityFromEmoji=L,f.wrapSingleEmoji=function(f){return A(f,{entities:[L(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},33:function(f,e,d){"use strict";function t(){return new Worker(d.p+"mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js")}var a=d(31),s=d(152),c=d(37),n=d(15),i=d(167),r=d(29),o=d(153),u=d(154),l=d(62),b=d(26),h=d(92),g=d(141),p=d(24),m=d(81),k=d(129);class y extends s.a{constructor(){super(),this.afterMessageIdTemp=0,this.taskId=0,this.awaiting={},this.pending=[],this.updatesProcessor=null,this.log=Object(c.b)("API-PROXY"),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.isSWRegistered=!0,this.debug=r.b,this.sockets=new Map,this.taskListeners={},this.taskListenersSW={},this.postMessagesWaiting=[],this.onWorkerMessage=f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListeners[e.type];d?d(e):e.update?this.updatesProcessor&&this.updatesProcessor(e.update):e.progress?n.default.dispatchEvent("download_progress",e.progress):(e.hasOwnProperty("result")||e.hasOwnProperty("error"))&&this.finalizeTask(e.taskId,e.result,e.error)},this.log("constructor"),u.a.start(),this.registerServiceWorker(),this.addTaskListener("clear",()=>{Promise.all([h.a.toggleStorage(!1),l.a.clear(),Promise.race([p.default.setAuthorized(!1),Object(m.a)(3e3)]),b.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map(f=>caches.delete(f)))]).finally(()=>{g.a.reload()})}),this.addTaskListener("connectionStatusChange",f=>{n.default.dispatchEvent("connection_status_change",f.payload)}),this.addTaskListener("convertWebp",f=>{i.a.postMessage(f)}),this.addTaskListener("socketProxy",f=>{const e=f.payload,d=e.id;if("send"===e.type){this.sockets.get(d).send(e.payload)}else if("close"===e.type){this.sockets.get(d).close()}else if("setup"===e.type){const f=new o.a(e.payload.dcId,e.payload.url,e.payload.logSuffix),t=()=>{this.postMessage({type:"socketProxy",payload:{type:"open",id:d}})},a=()=>{this.postMessage({type:"socketProxy",payload:{type:"close",id:d}}),f.removeEventListener("open",t),f.removeEventListener("close",a),f.removeEventListener("message",s),this.sockets.delete(d)},s=f=>{this.postMessage({type:"socketProxy",payload:{type:"message",id:d,payload:f}})};f.addEventListener("open",t),f.addEventListener("close",a),f.addEventListener("message",s),this.sockets.set(d,f)}}),this.addTaskListener("localStorageProxy",f=>{const e=f.payload;l.a[e.type](...e.args).then(e=>{this.postMessage({type:"localStorageProxy",id:f.id,payload:e})})}),n.default.addEventListener("language_change",f=>{this.performTaskWorkerVoid("setLanguage",f)}),window.addEventListener("online",f=>{this.forceReconnectTimeout()}),this.registerWorker(),setTimeout(()=>{this.getConfig()},5e3)}isServiceWorkerOnline(){return this.isSWRegistered}registerServiceWorker(){if(!("serviceWorker"in navigator))return;const f=navigator.serviceWorker;f.register("./sw.js",{scope:"./"}).then(f=>{this.log("SW registered",f),this.isSWRegistered=!0;(f.installing||f.waiting||f.active).addEventListener("statechange",f=>{this.log("SW statechange",f)})},f=>{this.isSWRegistered=!1,this.log.error("SW registration failed!",f),this.onServiceWorkerFail&&this.onServiceWorkerFail()}),f.addEventListener("controllerchange",()=>{this.log.warn("controllerchange"),this.releasePending(),f.controller.addEventListener("error",f=>{this.log.error("controller error:",f)})}),f.addEventListener("message",f=>{const e=f.data;if(!Object(a.f)(e))return;const d=this.taskListenersSW[e.type];d&&d(e)}),this.addServiceWorkerTaskListener("requestFilePart",f=>{const e={type:f.type,id:f.id};this.performTaskWorker("requestFilePart",...f.payload).then(f=>{e.payload=f,this.postSWMessage(e)},d=>{e.originalPayload=f.payload,e.error=d,this.postSWMessage(e)})}),f.addEventListener("messageerror",f=>{this.log.error("SW messageerror:",f)})}postMessage(...f){this.postMessagesWaiting.push(f)}postSWMessage(f){navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage(f)}onWorkerFirstMessage(f){if(!this.worker){this.worker=f,this.log("set webWorker"),this.postMessage=this.worker.postMessage.bind(this.worker),this.postMessagesWaiting.forEach(f=>this.postMessage(...f)),this.postMessagesWaiting.length=0;const e=k.a;this.log("WebP supported:",e),this.postMessage({type:"webpSupport",payload:e}),this.postMessage({type:"userAgent",payload:navigator.userAgent}),this.releasePending()}}addTaskListener(f,e){this.taskListeners[f]=e}addServiceWorkerTaskListener(f,e){this.taskListenersSW[f]=e}registerWorker(){const f=new t;f.addEventListener("message",this.onWorkerFirstMessage.bind(this,f),{once:!0}),f.addEventListener("message",this.onWorkerMessage),f.addEventListener("error",f=>{this.log.error("WORKER ERROR",f)})}finalizeTask(f,e,d){const t=this.awaiting[f];void 0!==t&&(this.debug&&this.log.debug("done",t.taskName,e,d),d?t.reject(d):t.resolve(e),delete this.awaiting[f])}createTask(f,e,d){return{task:f,taskId:this.taskId++,type:e,args:d}}performTaskWorkerVoid(f,...e){const d=this.createTask(f,void 0,e);this.pending.push(d),this.releasePending()}performTaskWorkerNew(f,e,...d){return this.debug&&this.log.debug("start",f,d),new Promise((t,a)=>{const s=this.createTask(f,e,d);this.pending.push(s),this.awaiting[s.taskId]={resolve:t,reject:a,taskName:f},this.releasePending()})}performTaskWorker(f,...e){return this.performTaskWorkerNew(f,void 0,...e)}releasePending(){this.postMessage&&(this.debug&&this.log.debug("releasing tasks, length:",this.pending.length),this.pending.forEach(f=>{this.postMessage(f)}),this.debug&&this.log.debug("released tasks"),this.pending.length=0)}setUpdatesProcessor(f){this.updatesProcessor=f}invokeCrypto(f,...e){return this.performTaskWorkerNew(f,"crypto",...e)}invokeApi(f,e={},d={}){return this.performTaskWorker("invokeApi",f,e,d)}invokeApiAfter(f,e={},d={}){let t=d;return t.prepareTempMessageId=""+ ++this.afterMessageIdTemp,t=Object.assign({},d),d.messageId=t.prepareTempMessageId,this.invokeApi(f,e,t)}invokeApiHashable(f){var e,d;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{params:t,options:a,method:s}=f,c=JSON.stringify(t);let n;return this.hashes[s]&&(n=this.hashes[s][c],n&&(t.hash=n.hash)),this.invokeApiSingleProcess({method:s,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",s,c),n.result;if(e.hash){const f=e.hash;this.hashes[s]||(this.hashes[s]={}),this.hashes[s][c]={hash:f,result:e}}return f.processResult?f.processResult(e):e},params:t,options:a})}invokeApiSingle(f,e={},d={}){const t=f+"-"+JSON.stringify(e),a=this.apiPromisesSingle;return a[t]?a[t]:a[t]=this.invokeApi(f,e,d).finally(()=>{delete a[t]})}invokeApiSingleProcess(f){var e,d,t;null!==(e=f.params)&&void 0!==e||(f.params={}),null!==(d=f.options)&&void 0!==d||(f.options={});const{method:a,processResult:s,processError:c,params:n,options:i}=f,r=this.apiPromisesSingleProcess,o=i.cacheKey||JSON.stringify(n),u=null!==(t=r[a])&&void 0!==t?t:r[a]=new Map,l=u.get(o);if(l)return l;const b=this.invokeApi(a,n,i).then(s,c).finally(()=>{u.delete(o),u.size||delete r[a]});return u.set(o,b),b}invokeApiCacheable(f,e={},d={}){var t;const a=null!==(t=this.apiPromisesCacheable[f])&&void 0!==t?t:this.apiPromisesCacheable[f]={},s=JSON.stringify(e),c=a[s];if(c&&(!d.override||!c.fulfilled))return c.promise;let n;d.override&&(c&&c.timeout&&(clearTimeout(c.timeout),delete c.timeout),delete d.override),d.cacheSeconds&&(n=window.setTimeout(()=>{delete a[s]},1e3*d.cacheSeconds),delete d.cacheSeconds);const i=this.invokeApi(f,e,d);return a[s]={timestamp:Date.now(),fulfilled:!1,timeout:n,promise:i,params:e},i}clearCache(f,e){const d=this.apiPromisesCacheable[f];if(d)for(const f in d){const t=d[f];try{e(t.params)&&(t.timeout&&clearTimeout(t.timeout),delete d[f])}catch(e){this.log.error("clearCache error:",e,f,t)}}}setBaseDcId(f){return this.performTaskWorker("setBaseDcId",f)}setQueueId(f){return this.performTaskWorker("setQueueId",f)}setUserAuth(f){return"string"!=typeof f&&"number"!=typeof f||(f={dcID:0,date:Date.now()/1e3|0,id:f.toPeerId(!1)}),n.default.dispatchEvent("user_auth",f),this.performTaskWorker("setUserAuth",f)}setUser(f){return this.setUserAuth(f.id)}getNetworker(f,e){return this.performTaskWorker("getNetworker",f,e)}logOut(){return this.performTaskWorker("logOut")}cancelDownload(f){return this.performTaskWorker("cancelDownload",f)}downloadFile(f){return this.performTaskWorker("downloadFile",f)}uploadFile(f){return this.performTaskWorker("uploadFile",f)}toggleStorage(f){const e={type:"toggleStorage",payload:f};this.postMessage(e),this.postSWMessage(e)}stopAll(){return this.performTaskWorkerVoid("stopAll")}startAll(){return this.performTaskWorkerVoid("startAll")}forceReconnectTimeout(){this.postMessage({type:"online"})}forceReconnect(){this.postMessage({type:"forceReconnect"})}getConfig(){return this.getConfigPromise?this.getConfigPromise:this.getConfigPromise=this.invokeApi("help.getConfig").then(f=>(n.default.config=f,f))}getAppConfig(f){return this.getAppConfigPromise&&!f?this.getAppConfigPromise:this.getAppConfigPromise=this.invokeApi("help.getAppConfig").then(f=>(n.default.appConfig=f,f))}}const v=new y;r.a.apiManagerProxy=v;e.a=v},38:function(f,e,d){"use strict";d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return t}));var t,a=d(29),s=d(130),c=d(48);class n{constructor(f=0,e=f){this.width=f,this.height=e}aspect(f,e){return Object(s.a)(this.width,this.height,f.width,f.height,e)}aspectFitted(f){return this.aspect(f,!0)}aspectCovered(f){return this.aspect(f,!1)}}function i(f,e){return new n(f,e)}!function(f){f[f.mobile=0]="mobile",f[f.medium=1]="medium",f[f.large=2]="large"}(t||(t={}));class r extends c.a{constructor(){super(),this.screenSizes=[{key:t.mobile,value:600},{key:t.medium,value:1275},{key:t.large,value:1680}],this.sizes={handhelds:{regular:i(270,270),webpage:i(270,200),album:i(270,0),esgSticker:i(68,68),animatedSticker:i(180,180),staticSticker:i(180,180),emojiSticker:i(112,112),poll:i(240,0),round:i(200,200)},desktop:{regular:i(420,340),webpage:i(420,340),album:i(420,0),esgSticker:i(80,80),animatedSticker:i(200,200),staticSticker:i(200,200),emojiSticker:i(112,112),poll:i(330,0),round:i(280,280)}},this.isMobile=!1,this.handleResize=()=>{const f=window.innerWidth;let e=this.screenSizes[0].key;for(let d=this.screenSizes.length-1;d>=0;--d)if(this.screenSizes[d].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame(()=>{this.handleResize(),this.rAF=0})}),this.handleResize()}}const o=new r;a.a.mediaSizes=o,e.b=o},59:function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"c",(function(){return o})),d.d(e,"e",(function(){return u})),d.d(e,"d",(function(){return l})),d.d(e,"f",(function(){return b})),d.d(e,"g",(function(){return h})),d.d(e,"b",(function(){return w}));var t=d(29),a=d(16),s=d(142);d.d(e,"h",(function(){return s.a}));const c=["January","February","March","April","May","June","July","August","September","October","November","December"],n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],i=86400,r=f=>{const e=new Date(Date.UTC(f.getFullYear(),f.getMonth(),f.getDate())),d=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-d);const t=new Date(Date.UTC(e.getUTCFullYear(),0,1));return Math.ceil(((e.getTime()-t.getTime())/i+1)/7)};function o(f){const e=new Date,d=e.getTime()/1e3|0,t=f.getTime()/1e3|0,s={};return d-t{const d=e.monthAsNumber?".":" ",t=("0"+f.getHours()).slice(-2)+":"+("0"+f.getMinutes()).slice(-2)+(e.noSeconds?"":":"+("0"+f.getSeconds()).slice(-2));return(e.leadingZero?("0"+f.getDate()).slice(-2):f.getDate())+d+(e.monthAsNumber?("0"+(f.getMonth()+1)).slice(-2):c[f.getMonth()])+d+f.getFullYear()+(e.noTime?"":", "+t)},g=new RegExp("20[0-9]{1,2}"),p=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),m=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),k=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),v=[31,29,31,30,31,30,31,31,30,31,30,31];function w(f,e){const d=f.trim().toLowerCase();if(d.length<3)return;if(0==="today".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime();f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-1;return void e.push({title:"Today",minDate:s,maxDate:c})}if(0==="yesterday".indexOf(d)){const f=new Date,d=f.getFullYear(),t=f.getMonth(),a=f.getDate();f.setFullYear(d,t,a),f.setHours(0,0,0);const s=f.getTime()-864e5;f.setFullYear(d,t,a+1),f.setHours(0,0,0);const c=f.getTime()-86400001;return void e.push({title:"Yesterday",minDate:s,maxDate:c})}const t=function(f){const e=new Date;if(f.length<=3)return-1;for(let d=0;d<7;d++)if(e.setDate(e.getDate()+1),0===P(e.getTime()).toLowerCase().indexOf(f))return e.getDay();return-1}(d);if(t>=0){const f=new Date,d=f.getTime(),a=t-f.getDay();f.setDate(f.getDate()+a),f.getTime()>d&&f.setTime(f.getTime()-6048e5);const s=f.getFullYear(),c=f.getMonth(),n=f.getDate();f.setFullYear(s,c,n),f.setHours(0,0,0);const i=f.getTime();f.setFullYear(s,c,n+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:P(i),minDate:i,maxDate:r})}let a;if(null===(a=k.exec(d)))if(null===(a=y.exec(d)))if(null===(a=g.exec(d))){if(null!==(a=p.exec(d))){const f=a[1],d=a[2],t=L(f);if(t>=0){const f=+d;if(f>0&&f<=31){return void A(e,f-1,t)}if(f>=2013){return void E(e,t,f)}}}if(null!==(a=m.exec(d))){const f=a[1],d=L(a[2]);if(d>=0){const t=+f;if(t>0&&t<=31){return void A(e,t-1,d)}if(t>=2013){E(e,d,t)}}}}else{let f=+d;const t=(new Date).getFullYear();if(f<2013){f=2013;for(let d=t;d>=f;d--){const f=new Date;f.setFullYear(d,0,1),f.setHours(0,0,0);const t=f.getTime();f.setFullYear(d+1,0,1),f.setHours(0,0,0);const a=f.getTime()-1;e.push({title:""+d,minDate:t,maxDate:a})}}else if(f<=t){const d=new Date;d.setFullYear(f,0,1),d.setHours(0,0,0);const t=d.getTime();d.setFullYear(f+1,0,1),d.setHours(0,0,0);const a=d.getTime()-1;e.push({title:""+f,minDate:t,maxDate:a})}}else{const f=a[1],d=a[3],t=a[5];if(!a[2]===a[4])return;const s=parseInt(f),c=parseInt(d)-1;let n=parseInt(t);n>=10&&n<=99&&(n+=2e3);const i=(new Date).getFullYear();if(D(s-1,c)&&n>=2013&&n<=i){const f=new Date;f.setFullYear(n,c,s),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(n,c,s+1),f.setHours(0,0,0);const t=f.getTime()-1;return void e.push({title:T(d),minDate:d,maxDate:t})}}else{const f=a[1],d=a[3],t=parseInt(f),s=parseInt(d);if(t>0&&t<=31){if(s>=2013&&t<=12){return void E(e,t-1,s)}if(s<=12){A(e,t-1,s-1)}}else if(t>=2013&&s<=12){E(e,s-1,t)}}}function E(f,e,d){const t=(new Date).getFullYear(),a=Date.now();if(d>=2013&&d<=t){const t=new Date;t.setFullYear(d,e,1),t.setHours(0,0,0);const s=t.getTime();if(s>a)return;t.setMonth(t.getMonth()+1);const c=t.getTime()-1;f.push({title:C(s),minDate:s,maxDate:c})}}function A(f,e,d){if(D(e,d)){const a=(new Date).getFullYear(),s=Date.now();for(let c=a;c>=2013;c--){if(1===d&&28===e&&(((t=c)%4!=0||t%100==0)&&t%400!=0))continue;const n=new Date;n.setFullYear(c,d,e+1),n.setHours(0,0,0);const i=n.getTime();if(i>s)continue;n.setFullYear(c,d,e+2),n.setHours(0,0,0);const r=n.getTime()-1;c===a?f.push({title:S(i),minDate:i,maxDate:r}):f.push({title:T(i),minDate:i,maxDate:r})}}var t}function C(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getFullYear()}function S(f){const e=new Date(f);return c[e.getMonth()].slice(0,3)+" "+e.getDate()}function T(f){const e=new Date(f);return("0"+e.getDate()).slice(-2)+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+e.getFullYear()}function P(f){const e=new Date(f);return n[e.getDay()]}function D(f,e){return e>=0&&e<12&&f>=0&&fnew Promise(e=>{setTimeout(e,f)})},88:function(f,e,d){"use strict";function t(f,e,d=e+10){return(f=f.trim()).length>d&&(f=f.slice(0,e)+"..."),f}function a(f){return f.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}function s(f){return f.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=>"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}function c(f,e){if(f.length{let i=f.slice(t,n);const r=a++;if(i.length>e){c(i.slice(e),e).forEach(f=>{s[a++]=f}),i=i.slice(0,e)}t=n,d=0,s[r]=(s[r]||"")+i};let i=0;for(;;){let t=f.indexOf(" ",i);if(-1===t){i!==f.length-1&&n();break}t+=" ".length;const a=t-i;d+a>e&&n(d),i=t,d+=a}return s}function n(f){const e=f.replace("input","");return e[0].toLowerCase()+e.slice(1)}function i(f){return f="input"+(f=f[0].toUpperCase()+f.slice(1))}function r(f){return f.charAt(0).toUpperCase()+f.slice(1)}d.d(e,"f",(function(){return t})),d.d(e,"e",(function(){return a})),d.d(e,"d",(function(){return s})),d.d(e,"g",(function(){return c})),d.d(e,"b",(function(){return n})),d.d(e,"c",(function(){return i})),d.d(e,"a",(function(){return r}))},99:function(f,e,d){"use strict";function t(f){return n(c(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return n})),d.d(e,"d",(function(){return i})),d.d(e,"c",(function(){return r})),d.d(e,"a",(function(){return o}));const a=/\uFE0F/g,s=String.fromCharCode(8205),c=f=>f.indexOf(s)<0?f.replace(a,""):f;function n(f){const e=[];let d=0,t=0,a=0;for(;a55296&&d<=56319?t=d:e.push(d.toString(16));return e.length&&2===e[0].length&&(e[0]="00"+e[0]),e}function i(f){let e=f.match(/[\uDFFB-\uDFFF]/);return e?5-(57343-e[0].charCodeAt(0)):0}function r(f){return String.fromCharCode(55356,56741+f.charCodeAt(0),55356,56741+f.charCodeAt(1))}function o(f){return f.split("-").reduce((f,e)=>f+String.fromCodePoint(parseInt(e,16)),"")}}}]); +//# sourceMappingURL=1.99b84ec019c74ae469a1.chunk.js.map \ No newline at end of file diff --git a/public/1.492b807a01f9ca3e3cf5.chunk.js.map b/public/1.99b84ec019c74ae469a1.chunk.js.map similarity index 99% rename from public/1.492b807a01f9ca3e3cf5.chunk.js.map rename to public/1.99b84ec019c74ae469a1.chunk.js.map index 12fafb173..7db83381e 100644 --- a/public/1.492b807a01f9ca3e3cf5.chunk.js.map +++ b/public/1.99b84ec019c74ae469a1.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/helpers/tsNow.ts","webpack:///./src/lib/config.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/string.ts","webpack:///./src/vendor/emoji/index.ts"],"names":["IS_WEBP_SUPPORTED","document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","appRuntimeManager","location","reload","e","window","close","focus","tsNow","seconds","t","Date","now","Config","Emoji","LatinizeMap","TLD","MediaSizes","CryptoWorkerMethods","method","args","this","performTaskWorker","Socket","dcId","url","logSuffix","super","debug","handleOpen","log","dispatchEvent","handleError","error","handleClose","removeListeners","handleMessage","event","data","byteLength","send","body","length","ws","logTypes","Error","Log","Debug","connect","removeEventListener","undefined","WebSocket","binaryType","addEventListener","err","singleInstance","clearInstance","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","checkInstance","isIDLE","time","newInstance","id","instanceID","get","then","curInstance","set","xt_instance","startAll","initial","clearTimeout","stopAll","setTimeout","started","reset","setInterval","documentElement","langPack","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","Promise","all","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","hash","polyfillPromise","pushTo","i","v","push","key","value","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","forEach","l","concat","string","appVersion","langPackVersion","applyLangPack","Intl","PluralRules","console","split","clear","countriesList","country","name","langPackKey","default_name","lastAppliedLangCode","Array","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","slice","append","idx","lastIndexOf","text","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","target","textContent","arg","isArray","pushNextArgument","format","plain","str","select","result","map","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","keys","resolve","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","classList","add","date","IntlElement","formatted","dataset","dateTimeFormat","DateTimeFormat","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","Worker_fn","Worker","webpWorkerController","convertPromises","worker","payload","fileName","indexOf","promise","bytes","reject","postMessage","init","hasOwnProperty","convertPromise","type","TelegramMeWebManager","disabled","test","domains","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","suffix","promises","script","onload","onerror","remove","src","appendChild","telegramMeWebManager","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","navigator","userAgent","toLowerCase","userVisibleOnly","subscribe","serviceWorker","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","task","localNotifications","postSWMessage","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","addServiceWorkerTaskListener","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","JSON","stringify","webPushApiManager","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","Set","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","find","currentEntity","has","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","Math","max","CAN_COMBINE_ENTITIES","nextEntityIdx","findIndex","_i","sort","b","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","noTextFormat","wrappingDraft","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","charAt","chars","charsLength","char","charCodeAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","trim","first","isUsernameValid","wrapSingleEmoji","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","logger","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","callback","progress","rootScope","finalizeTask","start","registerServiceWorker","addTaskListener","toggleStorage","sessionStorage","race","setAuthorized","pause","forceUnsubscribe","cacheName","caches","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","responseTask","uploadFile","originalPayload","message","bind","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","createTask","performTaskWorkerNew","params","o","prepareTempMessageId","messageId","queryJSON","cached","invokeApiSingleProcess","processResult","includes","q","cache","processError","cacheKey","oldPromise","p","size","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","enabled","getConfigPromise","config","overwrite","getAppConfigPromise","appConfig","apiManagerProxy","ScreenSize","MediaSize","width","height","boxSize","fitted","aspect","makeMediaSize","screenSizes","mobile","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","months","days","ONE_DAY","getWeekNumber","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","style","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","ms","limitSymbols","limitFrom","escapeRegExp","encodeEntities","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","_arrayIndex","partLength","convertInputKeyToKey","inputKey","convertKeyToInputKey","toUpperCase","capitalizeFirstLetter","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"mappings":"sFAAA,MAAMA,EAAoBC,SAASC,cAAc,UAAUC,UAAU,cAAcC,WAAW,mBAE/E,O,iCCFf,8CAce,SAASC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,MA6CA,EAAeP,eAAiBA,G,iCCMhC,MAAMQ,EAAoB,IAxCnB,MACE,SACL,IACEC,SAASC,SACT,MAAMC,KAOH,QACL,IACEC,OAAOC,QACP,MAAMF,KAMH,QAeHC,OAAOE,UAME,O,iCCpDA,SAASC,EAAMC,GAC5B,MAAMC,EAAIC,KAAKC,MACf,OAAOH,EAAUC,EAAI,IAAO,EAAIA,EAFlC,mC,iCCAA,YAeO,MAYDG,EAAS,CACbC,MAb8C,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAA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","file":"1.492b807a01f9ca3e3cf5.chunk.js","sourcesContent":["const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { deepEqual, safeAssign } from \"../helpers/object\";\nimport { capitalizeFirstLetter } from \"../helpers/string\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'WordDelimiterLast' : 'WordDelimiter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.db1ce269f081e74b2c5a.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { encodeEntities } from '../helpers/string';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport { copy } from '../helpers/object';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n }\n \n /* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n } */\n \n /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport { isObject } from '../../helpers/object';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map(cacheName => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n //console.log('socketProxy', socketTask, id);\n\n if(socketTask.type === 'send') {\n const socket = this.sockets.get(id);\n socket.send(socketTask.payload);\n } else if(socketTask.type === 'close') { // will remove from map in onClose\n const socket = this.sockets.get(id);\n socket.close();\n } else if(socketTask.type === 'setup') {\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n const onOpen = () => {\n //console.log('socketProxy onOpen');\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'open',\n id\n }\n });\n };\n const onClose = () => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'close',\n id\n }\n });\n\n socket.removeEventListener('open', onOpen);\n socket.removeEventListener('close', onClose);\n socket.removeEventListener('message', onMessage);\n this.sockets.delete(id);\n };\n const onMessage = (buffer: ArrayBuffer) => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'message',\n id,\n payload: buffer\n }\n });\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('close', onClose);\n socket.addEventListener('message', onMessage);\n this.sockets.set(id, socket);\n }\n });\n\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n return this.performTaskWorkerNew(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean): Promise {\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n return this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then(config => {\n rootScope.appConfig = config;\n return config;\n });\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport { capitalizeFirstLetter } from \"./string\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* export function stringMiddleOverflow(str: string, maxLength: number) {\r\n return str.length > maxLength ? str.slice(0, maxLength / 2 | 0) + '...' + str.slice(-Math.round(maxLength / 2)) : str; \r\n} */\r\n\r\nexport function limitSymbols(str: string, length: number, limitFrom = length + 10) {\r\n str = str.trim();\r\n if(str.length > limitFrom) {\r\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\r\n }\r\n\r\n return str;\r\n}\r\n\r\n// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\r\nexport function escapeRegExp(str: string) {\r\n return str\r\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\r\n .replace(/-/g, '\\\\x2d');\r\n}\r\n\r\nexport function encodeEntities(value: string) {\r\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\r\n var hi = value.charCodeAt(0);\r\n var low = value.charCodeAt(1);\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\r\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';';\r\n }).replace(//g, '>');\r\n}\r\n\r\nexport function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';//'\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n let overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach(part => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n \r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n\r\n// https://stackoverflow.com/a/14824756\r\n/* export const checkRTL = (s: string) => { \r\n const ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\r\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\r\n rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');\r\n\r\n return rtlDirCheck.test(s);\r\n}; */\r\n\r\n//(window as any).checkRTL = checkRTL;\r\n\r\nexport function convertInputKeyToKey(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as T;\r\n}\r\n\r\nexport function convertKeyToInputKey(key: string) {\r\n key = key[0].toUpperCase() + key.slice(1);\r\n key = 'input' + key;\r\n return key;\r\n}\r\n\r\nexport function capitalizeFirstLetter(string: string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/environment/webpSupport.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/lib/appManagers/appRuntimeManager.ts","webpack:///./src/helpers/tsNow.ts","webpack:///./src/lib/config.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/singleInstance.ts","webpack:///./src/lib/langPack.ts","webpack:///./src/lib/webp/webp.worker.ts","webpack:///./src/lib/webp/webpWorkerController.ts","webpack:///./src/lib/mtproto/telegramMeWebManager.ts","webpack:///./src/lib/mtproto/webPushApiManager.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/lib/richtextprocessor.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts","webpack:///./src/lib/mtproto/mtprotoworker.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/helpers/date.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/string.ts","webpack:///./src/vendor/emoji/index.ts"],"names":["IS_WEBP_SUPPORTED","document","createElement","toDataURL","startsWith","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","appRuntimeManager","location","reload","e","window","close","focus","tsNow","seconds","t","Date","now","Config","Emoji","LatinizeMap","TLD","MediaSizes","CryptoWorkerMethods","method","args","this","performTaskWorker","Socket","dcId","url","logSuffix","super","debug","handleOpen","log","dispatchEvent","handleError","error","handleClose","removeListeners","handleMessage","event","data","byteLength","send","body","length","ws","logTypes","Error","Log","Debug","connect","removeEventListener","undefined","WebSocket","binaryType","addEventListener","err","singleInstance","clearInstance","masterInstance","deactivated","warn","delete","deactivateInstance","deactivateTimeout","idle","checkInstance","isIDLE","time","newInstance","id","instanceID","get","then","curInstance","set","xt_instance","startAll","initial","clearTimeout","stopAll","setTimeout","started","reset","setInterval","documentElement","langPack","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","loadLocalLangPack","defaultCode","langPackCode","lastRequestedLangCode","Promise","all","lang","langSign","countries","strings","formatLocalStrings","default","saveLangPack","_","from_version","lang_code","version","local","loadLangPack","langCode","requestedServerLanguage","invokeApiCacheable","lang_pack","hash","polyfillPromise","pushTo","i","v","push","key","value","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","forEach","l","concat","string","appVersion","langPackVersion","applyLangPack","Intl","PluralRules","console","split","clear","countriesList","country","name","langPackKey","default_name","lastAppliedLangCode","Array","from","querySelectorAll","element","instance","weakMap","update","superFormatter","input","indexHolder","out","lastIndex","replace","match","p1","p2","p3","p4","offset","slice","append","idx","lastIndexOf","text","a","matchUrlProtocol","wrappedUrl","wrapUrl","href","onclick","setAttribute","target","textContent","arg","isArray","pushNextArgument","format","plain","str","select","result","map","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","keys","resolve","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","classList","add","date","IntlElement","formatted","dataset","dateTimeFormat","DateTimeFormat","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","arr","isLast","useLast","joined","Worker_fn","Worker","webpWorkerController","convertPromises","worker","payload","fileName","indexOf","promise","bytes","reject","postMessage","init","hasOwnProperty","convertPromise","type","TelegramMeWebManager","disabled","test","domains","hostname","canRedirect","curValue","ts","tgme_sync","path","encodeURIComponent","suffix","promises","script","onload","onerror","remove","src","appendChild","telegramMeWebManager","WebPushApiManager","isAvailable","isPushEnabled","localNotificationsAvailable","settings","isFirefox","navigator","userAgent","toLowerCase","userVisibleOnly","subscribe","serviceWorker","ready","reg","pushManager","subscription","pushSubscriptionNotify","catch","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","task","localNotifications","postSWMessage","isAliveTO","getSubscription","setUpServiceWorkerChannel","unsubscribe","successful","newSettings","addServiceWorkerTaskListener","subscriptionObj","toJSON","endpoint","p256dh","auth","tokenType","tokenValue","JSON","stringify","webPushApiManager","emojiData","alphaCharsRegExp","urlAlphanumericRegExpPart","urlRegExp","urlProtocolRegExpPart","urlAnyProtocolRegExp","RegExp","fullRegExp","emailRegExp","markdownRegExp","siteHashtags","Telegram","Twitter","Instagram","markdownEntities","passConflictingEntities","Set","RichTextProcessor","getEmojiSpritesheetCoords","emojiCode","unified","parseEntities","raw","entities","matchIndex","rawOffset","index","protocol","tld","substr","balanced","checkBrackets","emojiCoords","unicode","unsafe","findConflictingEntity","currentEntities","newEntity","find","currentEntity","has","mergeEntities","newEntities","filtered","filter","sortEntities","entity","nextEntity","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","user_id","toUserId","newText","splice","combineSameEntities","diff","Math","max","CAN_COMBINE_ENTITIES","nextEntityIdx","findIndex","_i","sort","b","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","noTextFormat","wrappingDraft","noLinks","bot","atPos","command","fromBot","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","charAt","chars","charsLength","char","charCodeAt","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","noLinebreaks","matchUrl","matchEmail","getAbbreviation","onlyFirst","splitted","trim","first","isUsernameValid","wrapSingleEmoji","afterMessageIdTemp","taskId","awaiting","pending","updatesProcessor","logger","hashes","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","isSWRegistered","sockets","taskListeners","taskListenersSW","postMessagesWaiting","onWorkerMessage","callback","progress","rootScope","finalizeTask","start","registerServiceWorker","addTaskListener","toggleStorage","sessionStorage","race","setAuthorized","pause","forceUnsubscribe","cacheName","caches","socketTask","socket","onOpen","onClose","onMessage","buffer","storageTask","res","performTaskWorkerVoid","forceReconnectTimeout","registerWorker","getConfig","register","scope","registration","installing","waiting","active","onServiceWorkerFail","releasePending","controller","responseTask","uploadFile","originalPayload","message","bind","isWebpSupported","onWorkerFirstMessage","once","deferred","taskName","createTask","performTaskWorkerNew","params","o","prepareTempMessageId","messageId","queryJSON","cached","invokeApiSingleProcess","processResult","includes","q","cache","processError","cacheKey","oldPromise","p","size","override","fulfilled","timeout","cacheSeconds","timestamp","verify","queueId","userAuth","dcID","toPeerId","user","setUserAuth","dc_id","enabled","getConfigPromise","config","overwrite","getAppConfigPromise","appConfig","apiManagerProxy","ScreenSize","MediaSize","width","height","boxSize","fitted","aspect","makeMediaSize","screenSizes","mobile","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","round","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","cancelAnimationFrame","requestAnimationFrame","mediaSizes","months","days","ONE_DAY","getWeekNumber","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","style","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","c","setDate","formatWeekLong","getDay","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","parseInt","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","ms","limitSymbols","limitFrom","escapeRegExp","encodeEntities","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","_arrayIndex","partLength","convertInputKeyToKey","inputKey","convertKeyToInputKey","toUpperCase","capitalizeFirstLetter","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","String","fromCharCode","rawEmoji","unicodeSurrogates","points","previous","toString","getEmojiToneIndex","getCountryEmoji","iso2","emojiFromCodePoints","codePoints","reduce","prev","curr","fromCodePoint"],"mappings":"sFAAA,MAAMA,EAAoBC,SAASC,cAAc,UAAUC,UAAU,cAAcC,WAAW,mBAE/E,O,iCCFf,8CAce,SAASC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,MA6CA,EAAeP,eAAiBA,G,iCCMhC,MAAMQ,EAAoB,IAxCnB,MACE,SACL,IACEC,SAASC,SACT,MAAMC,KAOH,QACL,IACEC,OAAOC,QACP,MAAMF,KAMH,QAeHC,OAAOE,UAME,O,iCCpDA,SAASC,EAAMC,GAC5B,MAAMC,EAAIC,KAAKC,MACf,OAAOH,EAAUC,EAAI,IAAO,EAAIA,EAFlC,mC,iCCAA,YAeO,MAYDG,EAAS,CACbC,MAb8C,CAAC,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,KAAK,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,IAAI,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,KAAK,KAAO,KAAK,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,KAAO,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,cAAc,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,kBAAkB,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,4CAA4C,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,QAAQ,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,8BAA8B,KAAK,yCAAyC,KAAK,yCAAyC,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,6BAA6B,KAAK,6BAA6B,KAAK,wCAAwC,KAAK,wCAAwC,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,IAAI,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,IAAI,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,8BAA8B,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,mBAAmB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,kBAAkB,KAAK,kBAAkB,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,iBAAiB,KAAK,iBAAiB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAK,OAAO,MAAM,OAAO,MAAM,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,0CAA0C,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,GActs7DC,YAJgD,CAAC,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAK,IAAK,MAAM,IAAK,MAAM,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,MAAO,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,KAAM,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAA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","file":"1.99b84ec019c74ae469a1.chunk.js","sourcesContent":["const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport class AppRuntimeManager {\r\n public reload() {\r\n try {\r\n location.reload();\r\n } catch(e) {};\r\n\r\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\r\n // chrome.runtime.reload();\r\n // }\r\n }\r\n\r\n public close() {\r\n try {\r\n window.close();\r\n } catch(e) {}\r\n }\r\n\r\n /**\r\n * Better to call from event\r\n */\r\n public focus() {\r\n // // @ts-ignore\r\n // if(window.navigator.mozApps && document.hidden) {\r\n // // Get app instance and launch it to bring app to foreground\r\n // // @ts-ignore\r\n // window.navigator.mozApps.getSelf().onsuccess = function() {\r\n // this.result.launch();\r\n // };\r\n // } else {\r\n // // @ts-ignore\r\n // if(window.chrome && chrome.app && chrome.app.window) {\r\n // // @ts-ignore\r\n // chrome.app.window.current().focus();\r\n // }\r\n\r\n window.focus();\r\n // }\r\n }\r\n}\r\n\r\nconst appRuntimeManager = new AppRuntimeManager();\r\nexport default appRuntimeManager;\r\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\n\r\n// !WARNING, ТУТ СЛОЖНО! по-хорошему, надо бы это переделать без fe0f, но они здесь необходимы чтобы отрендерить панель, и ниже дописаны 3 элемента которые не воспроизводятся без fe0f\r\nexport const Emoji: {[emoji: string]: number} = {\"2049\":62748,\"2122\":62776,\"2139\":62801,\"2194\":62678,\"2195\":62677,\"2196\":62676,\"2197\":62670,\"2198\":62672,\"2199\":62674,\"2328\":61155,\"2600\":4954,\"2601\":4962,\"2602\":4977,\"2603\":4982,\"2604\":4984,\"2611\":62764,\"2614\":4978,\"2615\":3750,\"2618\":2639,\"2620\":196,\"2622\":62667,\"2623\":62668,\"2626\":62697,\"2638\":62694,\"2639\":168,\"2648\":62702,\"2649\":62703,\"2650\":62710,\"2651\":62711,\"2652\":62712,\"2653\":62713,\"2660\":51057,\"2663\":51060,\"2665\":51058,\"2666\":51059,\"2668\":4832,\"2692\":61258,\"2693\":4887,\"2694\":61261,\"2696\":61272,\"2697\":61280,\"2699\":61270,\"2702\":61245,\"2705\":62763,\"2708\":4895,\"2709\":61206,\"2712\":61220,\"2714\":62765,\"2716\":62742,\"2721\":62693,\"2728\":5993,\"2733\":62771,\"2734\":62772,\"2744\":4981,\"2747\":62773,\"2753\":62749,\"2754\":62750,\"2755\":62751,\"2757\":62752,\"2763\":1127,\"2764\":1129,\"2795\":62743,\"2796\":62744,\"2797\":62745,\"2934\":62681,\"2935\":62682,\"3030\":62753,\"3297\":62825,\"3299\":62826,\"0023-20e3\":62777,\"002a-20e3\":62778,\"0030-20e3\":62779,\"0031-20e3\":62780,\"0032-20e3\":62781,\"0033-20e3\":62782,\"0034-20e3\":62783,\"0035-20e3\":62784,\"0036-20e3\":62785,\"0037-20e3\":62786,\"0038-20e3\":62787,\"0039-20e3\":62788,\"00a9\":62774,\"00ae\":62775,\"1f004\":51063,\"1f0cf\":51062,\"1f170\":62795,\"1f171\":62797,\"1f17e\":62806,\"1f17f\":62808,\"1f18e\":62796,\"1f191\":62798,\"1f192\":62799,\"1f193\":62800,\"1f194\":62802,\"1f195\":62804,\"1f196\":62805,\"1f197\":62807,\"1f198\":62809,\"1f199\":62810,\"1f19a\":62811,\"1f1e6-1f1e8\":71550,\"1f1e6-1f1e9\":71551,\"1f1e6-1f1ea\":71552,\"1f1e6-1f1eb\":71553,\"1f1e6-1f1ec\":71554,\"1f1e6-1f1ee\":71555,\"1f1e6-1f1f1\":71556,\"1f1e6-1f1f2\":71557,\"1f1e6-1f1f4\":71558,\"1f1e6-1f1f6\":71559,\"1f1e6-1f1f7\":71560,\"1f1e6-1f1f8\":71561,\"1f1e6-1f1f9\":71562,\"1f1e6-1f1fa\":71563,\"1f1e6-1f1fc\":71564,\"1f1e6-1f1fd\":71565,\"1f1e6-1f1ff\":71566,\"1f1e7-1f1e6\":71567,\"1f1e7-1f1e7\":71568,\"1f1e7-1f1e9\":71569,\"1f1e7-1f1ea\":71570,\"1f1e7-1f1eb\":71571,\"1f1e7-1f1ec\":71572,\"1f1e7-1f1ed\":71573,\"1f1e7-1f1ee\":71574,\"1f1e7-1f1ef\":71575,\"1f1e7-1f1f1\":71576,\"1f1e7-1f1f2\":71577,\"1f1e7-1f1f3\":71578,\"1f1e7-1f1f4\":71579,\"1f1e7-1f1f6\":71580,\"1f1e7-1f1f7\":71581,\"1f1e7-1f1f8\":71582,\"1f1e7-1f1f9\":71583,\"1f1e7-1f1fb\":71584,\"1f1e7-1f1fc\":71585,\"1f1e7-1f1fe\":71586,\"1f1e7-1f1ff\":71587,\"1f1e8-1f1e6\":71588,\"1f1e8-1f1e8\":71589,\"1f1e8-1f1e9\":71590,\"1f1e8-1f1eb\":71591,\"1f1e8-1f1ec\":71592,\"1f1e8-1f1ed\":71593,\"1f1e8-1f1ee\":71594,\"1f1e8-1f1f0\":71595,\"1f1e8-1f1f1\":71596,\"1f1e8-1f1f2\":71597,\"1f1e8-1f1f3\":71598,\"1f1e8-1f1f4\":71599,\"1f1e8-1f1f5\":71600,\"1f1e8-1f1f7\":71601,\"1f1e8-1f1fa\":71602,\"1f1e8-1f1fb\":71603,\"1f1e8-1f1fc\":71604,\"1f1e8-1f1fd\":71605,\"1f1e8-1f1fe\":71606,\"1f1e8-1f1ff\":71607,\"1f1e9-1f1ea\":71608,\"1f1e9-1f1ec\":71609,\"1f1e9-1f1ef\":71610,\"1f1e9-1f1f0\":71611,\"1f1e9-1f1f2\":71612,\"1f1e9-1f1f4\":71613,\"1f1e9-1f1ff\":71614,\"1f1ea-1f1e6\":71615,\"1f1ea-1f1e8\":71616,\"1f1ea-1f1ea\":71617,\"1f1ea-1f1ec\":71618,\"1f1ea-1f1ed\":71619,\"1f1ea-1f1f7\":71620,\"1f1ea-1f1f8\":71621,\"1f1ea-1f1f9\":71622,\"1f1ea-1f1fa\":71623,\"1f1eb-1f1ee\":71624,\"1f1eb-1f1ef\":71625,\"1f1eb-1f1f0\":71626,\"1f1eb-1f1f2\":71627,\"1f1eb-1f1f4\":71628,\"1f1eb-1f1f7\":71629,\"1f1ec-1f1e6\":71630,\"1f1ec-1f1e7\":71631,\"1f1ec-1f1e9\":71632,\"1f1ec-1f1ea\":71633,\"1f1ec-1f1eb\":71634,\"1f1ec-1f1ec\":71635,\"1f1ec-1f1ed\":71636,\"1f1ec-1f1ee\":71637,\"1f1ec-1f1f1\":71638,\"1f1ec-1f1f2\":71639,\"1f1ec-1f1f3\":71640,\"1f1ec-1f1f5\":71641,\"1f1ec-1f1f6\":71642,\"1f1ec-1f1f7\":71643,\"1f1ec-1f1f8\":71644,\"1f1ec-1f1f9\":71645,\"1f1ec-1f1fa\":71646,\"1f1ec-1f1fc\":71647,\"1f1ec-1f1fe\":71648,\"1f1ed-1f1f0\":71649,\"1f1ed-1f1f2\":71650,\"1f1ed-1f1f3\":71651,\"1f1ed-1f1f7\":71652,\"1f1ed-1f1f9\":71653,\"1f1ed-1f1fa\":71654,\"1f1ee-1f1e8\":71655,\"1f1ee-1f1e9\":71656,\"1f1ee-1f1ea\":71657,\"1f1ee-1f1f1\":71658,\"1f1ee-1f1f2\":71659,\"1f1ee-1f1f3\":71660,\"1f1ee-1f1f4\":71661,\"1f1ee-1f1f6\":71662,\"1f1ee-1f1f7\":71663,\"1f1ee-1f1f8\":71664,\"1f1ee-1f1f9\":71665,\"1f1ef-1f1ea\":71666,\"1f1ef-1f1f2\":71667,\"1f1ef-1f1f4\":71668,\"1f1ef-1f1f5\":71669,\"1f1f0-1f1ea\":71670,\"1f1f0-1f1ec\":71671,\"1f1f0-1f1ed\":71672,\"1f1f0-1f1ee\":71673,\"1f1f0-1f1f2\":71674,\"1f1f0-1f1f3\":71675,\"1f1f0-1f1f5\":71676,\"1f1f0-1f1f7\":71677,\"1f1f0-1f1fc\":71678,\"1f1f0-1f1fe\":71679,\"1f1f0-1f1ff\":71680,\"1f1f1-1f1e6\":71681,\"1f1f1-1f1e7\":71682,\"1f1f1-1f1e8\":71683,\"1f1f1-1f1ee\":71684,\"1f1f1-1f1f0\":71685,\"1f1f1-1f1f7\":71686,\"1f1f1-1f1f8\":71687,\"1f1f1-1f1f9\":71688,\"1f1f1-1f1fa\":71689,\"1f1f1-1f1fb\":71690,\"1f1f1-1f1fe\":71691,\"1f1f2-1f1e6\":71692,\"1f1f2-1f1e8\":71693,\"1f1f2-1f1e9\":71694,\"1f1f2-1f1ea\":71695,\"1f1f2-1f1eb\":71696,\"1f1f2-1f1ec\":71697,\"1f1f2-1f1ed\":71698,\"1f1f2-1f1f0\":71699,\"1f1f2-1f1f1\":71700,\"1f1f2-1f1f2\":71701,\"1f1f2-1f1f3\":71702,\"1f1f2-1f1f4\":71703,\"1f1f2-1f1f5\":71704,\"1f1f2-1f1f6\":71705,\"1f1f2-1f1f7\":71706,\"1f1f2-1f1f8\":71707,\"1f1f2-1f1f9\":71708,\"1f1f2-1f1fa\":71709,\"1f1f2-1f1fb\":71710,\"1f1f2-1f1fc\":71711,\"1f1f2-1f1fd\":71712,\"1f1f2-1f1fe\":71713,\"1f1f2-1f1ff\":71714,\"1f1f3-1f1e6\":71715,\"1f1f3-1f1e8\":71716,\"1f1f3-1f1ea\":71717,\"1f1f3-1f1eb\":71718,\"1f1f3-1f1ec\":71719,\"1f1f3-1f1ee\":71720,\"1f1f3-1f1f1\":71721,\"1f1f3-1f1f4\":71722,\"1f1f3-1f1f5\":71723,\"1f1f3-1f1f7\":71724,\"1f1f3-1f1fa\":71725,\"1f1f3-1f1ff\":71726,\"1f1f4-1f1f2\":71727,\"1f1f5-1f1e6\":71728,\"1f1f5-1f1ea\":71729,\"1f1f5-1f1eb\":71730,\"1f1f5-1f1ec\":71731,\"1f1f5-1f1ed\":71732,\"1f1f5-1f1f0\":71733,\"1f1f5-1f1f1\":71734,\"1f1f5-1f1f2\":71735,\"1f1f5-1f1f3\":71736,\"1f1f5-1f1f7\":71737,\"1f1f5-1f1f8\":71738,\"1f1f5-1f1f9\":71739,\"1f1f5-1f1fc\":71740,\"1f1f5-1f1fe\":71741,\"1f1f6-1f1e6\":71742,\"1f1f7-1f1ea\":71743,\"1f1f7-1f1f4\":71744,\"1f1f7-1f1f8\":71745,\"1f1f7-1f1fa\":71746,\"1f1f7-1f1fc\":71747,\"1f1f8-1f1e6\":71748,\"1f1f8-1f1e7\":71749,\"1f1f8-1f1e8\":71750,\"1f1f8-1f1e9\":71751,\"1f1f8-1f1ea\":71752,\"1f1f8-1f1ec\":71753,\"1f1f8-1f1ed\":71754,\"1f1f8-1f1ee\":71755,\"1f1f8-1f1ef\":71756,\"1f1f8-1f1f0\":71757,\"1f1f8-1f1f1\":71758,\"1f1f8-1f1f2\":71759,\"1f1f8-1f1f3\":71760,\"1f1f8-1f1f4\":71761,\"1f1f8-1f1f7\":71762,\"1f1f8-1f1f8\":71763,\"1f1f8-1f1f9\":71764,\"1f1f8-1f1fb\":71765,\"1f1f8-1f1fd\":71766,\"1f1f8-1f1fe\":71767,\"1f1f8-1f1ff\":71768,\"1f1f9-1f1e6\":71769,\"1f1f9-1f1e8\":71770,\"1f1f9-1f1e9\":71771,\"1f1f9-1f1eb\":71772,\"1f1f9-1f1ec\":71773,\"1f1f9-1f1ed\":71774,\"1f1f9-1f1ef\":71775,\"1f1f9-1f1f0\":71776,\"1f1f9-1f1f1\":71777,\"1f1f9-1f1f2\":71778,\"1f1f9-1f1f3\":71779,\"1f1f9-1f1f4\":71780,\"1f1f9-1f1f7\":71781,\"1f1f9-1f1f9\":71782,\"1f1f9-1f1fb\":71783,\"1f1f9-1f1fc\":71784,\"1f1f9-1f1ff\":71785,\"1f1fa-1f1e6\":71786,\"1f1fa-1f1ec\":71787,\"1f1fa-1f1f2\":71788,\"1f1fa-1f1f3\":71789,\"1f1fa-1f1f8\":71790,\"1f1fa-1f1fe\":71791,\"1f1fa-1f1ff\":71792,\"1f1fb-1f1e6\":71793,\"1f1fb-1f1e8\":71794,\"1f1fb-1f1ea\":71795,\"1f1fb-1f1ec\":71796,\"1f1fb-1f1ee\":71797,\"1f1fb-1f1f3\":71798,\"1f1fb-1f1fa\":71799,\"1f1fc-1f1eb\":71800,\"1f1fc-1f1f8\":71801,\"1f1fd-1f1f0\":71802,\"1f1fe-1f1ea\":71803,\"1f1fe-1f1f9\":71804,\"1f1ff-1f1e6\":71805,\"1f1ff-1f1f2\":71806,\"1f1ff-1f1fc\":71807,\"1f201\":62812,\"1f202\":62813,\"1f21a\":62819,\"1f22f\":62816,\"1f232\":62820,\"1f233\":62824,\"1f234\":62823,\"1f235\":62828,\"1f236\":62815,\"1f237\":62814,\"1f238\":62822,\"1f239\":62818,\"1f23a\":62827,\"1f250\":62817,\"1f251\":62821,\"1f300\":4974,\"1f301\":4824,\"1f302\":4976,\"1f303\":4825,\"1f304\":4827,\"1f305\":4828,\"1f306\":4829,\"1f307\":4830,\"1f308\":4975,\"1f309\":4831,\"1f30a\":4987,\"1f30b\":4782,\"1f30c\":4961,\"1f30d\":4773,\"1f30e\":4774,\"1f30f\":4775,\"1f310\":4776,\"1f311\":4941,\"1f312\":4942,\"1f313\":4943,\"1f314\":4944,\"1f315\":4945,\"1f316\":4946,\"1f317\":4947,\"1f318\":4948,\"1f319\":4949,\"1f31a\":4950,\"1f31b\":4951,\"1f31c\":4952,\"1f31d\":4955,\"1f31e\":4956,\"1f31f\":4959,\"1f320\":4960,\"1f321\":4953,\"1f324\":4965,\"1f325\":4966,\"1f326\":4967,\"1f327\":4968,\"1f328\":4969,\"1f329\":4970,\"1f32a\":4971,\"1f32b\":4972,\"1f32c\":4973,\"1f32d\":3694,\"1f32e\":3696,\"1f32f\":3697,\"1f330\":3677,\"1f331\":2631,\"1f332\":2633,\"1f333\":2634,\"1f334\":2635,\"1f335\":2636,\"1f336\":3668,\"1f337\":2630,\"1f338\":2622,\"1f339\":2625,\"1f33a\":2627,\"1f33b\":2628,\"1f33c\":2629,\"1f33d\":3667,\"1f33e\":2637,\"1f33f\":2638,\"1f340\":2640,\"1f341\":2641,\"1f342\":2642,\"1f343\":2643,\"1f344\":3675,\"1f345\":3660,\"1f346\":3664,\"1f347\":3644,\"1f348\":3645,\"1f349\":3646,\"1f34a\":3647,\"1f34b\":3648,\"1f34c\":3649,\"1f34d\":3650,\"1f34e\":3652,\"1f34f\":3653,\"1f350\":3654,\"1f351\":3655,\"1f352\":3656,\"1f353\":3657,\"1f354\":3691,\"1f355\":3693,\"1f356\":3687,\"1f357\":3688,\"1f358\":3713,\"1f359\":3714,\"1f35a\":3715,\"1f35b\":3716,\"1f35c\":3717,\"1f35d\":3718,\"1f35e\":3678,\"1f35f\":3692,\"1f360\":3719,\"1f361\":3725,\"1f362\":3720,\"1f363\":3721,\"1f364\":3722,\"1f365\":3723,\"1f366\":3734,\"1f367\":3735,\"1f368\":3736,\"1f369\":3737,\"1f36a\":3738,\"1f36b\":3743,\"1f36c\":3744,\"1f36d\":3745,\"1f36e\":3746,\"1f36f\":3747,\"1f370\":3740,\"1f371\":3712,\"1f372\":3704,\"1f373\":3702,\"1f374\":3769,\"1f375\":3752,\"1f376\":3753,\"1f377\":3755,\"1f378\":3756,\"1f379\":3757,\"1f37a\":3758,\"1f37b\":3759,\"1f37c\":3748,\"1f37d\":3768,\"1f37e\":3754,\"1f37f\":3708,\"1f380\":51004,\"1f381\":51005,\"1f382\":3739,\"1f383\":5988,\"1f384\":5989,\"1f385\":1490,\"1f386\":5990,\"1f387\":5991,\"1f388\":5994,\"1f389\":5995,\"1f38a\":5996,\"1f38b\":5997,\"1f38c\":71544,\"1f38d\":5998,\"1f38e\":5999,\"1f38f\":51000,\"1f390\":51001,\"1f391\":51002,\"1f392\":61096,\"1f393\":61109,\"1f396\":51009,\"1f397\":51006,\"1f399\":61129,\"1f39a\":61130,\"1f39b\":61131,\"1f39e\":61164,\"1f39f\":51007,\"1f3a0\":4833,\"1f3a1\":4834,\"1f3a2\":4835,\"1f3a3\":51036,\"1f3a4\":61132,\"1f3a5\":61163,\"1f3a6\":62733,\"1f3a7\":61133,\"1f3a8\":51067,\"1f3a9\":61108,\"1f3aa\":4837,\"1f3ab\":51008,\"1f3ac\":61166,\"1f3ad\":51065,\"1f3ae\":51049,\"1f3af\":51042,\"1f3b0\":51051,\"1f3b1\":51045,\"1f3b2\":51052,\"1f3b3\":51024,\"1f3b4\":51064,\"1f3b5\":61127,\"1f3b6\":61128,\"1f3b7\":61135,\"1f3b8\":61137,\"1f3b9\":61138,\"1f3ba\":61139,\"1f3bb\":61140,\"1f3bc\":61126,\"1f3bd\":51038,\"1f3be\":51022,\"1f3bf\":51039,\"1f3c0\":51018,\"1f3c1\":71542,\"1f3c2\":1562,\"1f3c3-200d-2640\":1546,\"1f3c3-200d-2642\":1545,\"1f3c3\":1544,\"1f3c4-200d-2640\":1568,\"1f3c4-200d-2642\":1567,\"1f3c4\":1566,\"1f3c5\":51011,\"1f3c6\":51010,\"1f3c7\":1560,\"1f3c8\":51020,\"1f3c9\":51021,\"1f3ca-200d-2640\":1574,\"1f3ca-200d-2642\":1573,\"1f3ca\":1572,\"1f3cb-200d-2640\":1580,\"1f3cb-200d-2642\":1579,\"1f3cb\":1578,\"1f3cc-200d-2640\":1565,\"1f3cc-200d-2642\":1564,\"1f3cc\":1563,\"1f3cd\":4868,\"1f3ce\":4867,\"1f3cf\":51025,\"1f3d0\":51019,\"1f3d1\":51026,\"1f3d2\":51027,\"1f3d3\":51029,\"1f3d4\":4780,\"1f3d5\":4784,\"1f3d6\":4785,\"1f3d7\":4791,\"1f3d8\":4796,\"1f3d9\":4826,\"1f3da\":4797,\"1f3db\":4790,\"1f3dc\":4786,\"1f3dd\":4787,\"1f3de\":4788,\"1f3df\":4789,\"1f3e0\":4798,\"1f3e1\":4799,\"1f3e2\":4800,\"1f3e3\":4801,\"1f3e4\":4802,\"1f3e5\":4803,\"1f3e6\":4804,\"1f3e7\":62643,\"1f3e8\":4805,\"1f3e9\":4806,\"1f3ea\":4807,\"1f3eb\":4808,\"1f3ec\":4809,\"1f3ed\":4810,\"1f3ee\":61177,\"1f3ef\":4811,\"1f3f0\":4812,\"1f3f3-200d-1f308\":71547,\"1f3f3-200d-26a7\":71548,\"1f3f3\":71546,\"1f3f4-200d-2620\":71549,\"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\":71808,\"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\":71809,\"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\":71810,\"1f3f4\":71545,\"1f3f5\":2624,\"1f3f7\":61195,\"1f3f8\":51030,\"1f3f9\":61264,\"1f3fa\":3772,\"1f3fb\":9499,\"1f3fc\":9500,\"1f3fd\":9501,\"1f3fe\":9502,\"1f3ff\":9503,\"1f400\":2550,\"1f401\":2549,\"1f402\":2530,\"1f403\":2531,\"1f404\":2532,\"1f405\":2521,\"1f406\":2522,\"1f407\":2553,\"1f408-200d-2b1b\":2518,\"1f408\":2517,\"1f409\":2592,\"1f40a\":2587,\"1f40b\":2596,\"1f40c\":2605,\"1f40d\":2590,\"1f40e\":2524,\"1f40f\":2537,\"1f410\":2539,\"1f411\":2538,\"1f412\":2505,\"1f413\":2570,\"1f414\":2569,\"1f415-200d-1f9ba\":2511,\"1f415\":2509,\"1f416\":2534,\"1f417\":2535,\"1f418\":2544,\"1f419\":2603,\"1f41a\":2604,\"1f41b\":2607,\"1f41c\":2608,\"1f41d\":2609,\"1f41e\":2611,\"1f41f\":2599,\"1f420\":2600,\"1f421\":2601,\"1f422\":2588,\"1f423\":2571,\"1f424\":2572,\"1f425\":2573,\"1f426\":2574,\"1f427\":2575,\"1f428\":2560,\"1f429\":2512,\"1f42a\":2540,\"1f42b\":2541,\"1f42c\":2597,\"1f42d\":2548,\"1f42e\":2529,\"1f42f\":2520,\"1f430\":2552,\"1f431\":2516,\"1f432\":2591,\"1f433\":2595,\"1f434\":2523,\"1f435\":2504,\"1f436\":2508,\"1f437\":2533,\"1f438\":2586,\"1f439\":2551,\"1f43a\":2513,\"1f43b-200d-2744\":2559,\"1f43b\":2558,\"1f43c\":2561,\"1f43d\":2536,\"1f43e\":2567,\"1f43f\":2554,\"1f440\":1350,\"1f441-200d-1f5e8\":1147,\"1f441\":1351,\"1f442\":1342,\"1f443\":1344,\"1f444\":1353,\"1f445\":1352,\"1f446\":1318,\"1f447\":1320,\"1f448\":1316,\"1f449\":1317,\"1f44a\":1325,\"1f44b\":1303,\"1f44c\":1308,\"1f44d\":1322,\"1f44e\":1323,\"1f44f\":1328,\"1f450\":1330,\"1f451\":61106,\"1f452\":61107,\"1f453\":61072,\"1f454\":61077,\"1f455\":61078,\"1f456\":61079,\"1f457\":61084,\"1f458\":61085,\"1f459\":61090,\"1f45a\":61091,\"1f45b\":61092,\"1f45c\":61093,\"1f45d\":61094,\"1f45e\":61098,\"1f45f\":61099,\"1f460\":61102,\"1f461\":61103,\"1f462\":61105,\"1f463\":1649,\"1f464\":1646,\"1f465\":1647,\"1f466\":1356,\"1f467\":1357,\"1f468-200d-1f33e\":1423,\"1f468-200d-1f373\":1426,\"1f468-200d-1f37c\":1487,\"1f468-200d-1f393\":1414,\"1f468-200d-1f3a4\":1444,\"1f468-200d-1f3a8\":1447,\"1f468-200d-1f3eb\":1417,\"1f468-200d-1f3ed\":1432,\"1f468-200d-1f466-200d-1f466\":1636,\"1f468-200d-1f466\":1635,\"1f468-200d-1f467-200d-1f466\":1638,\"1f468-200d-1f467-200d-1f467\":1639,\"1f468-200d-1f467\":1637,\"1f468-200d-1f468-200d-1f466\":1625,\"1f468-200d-1f468-200d-1f466-200d-1f466\":1628,\"1f468-200d-1f468-200d-1f467\":1626,\"1f468-200d-1f468-200d-1f467-200d-1f466\":1627,\"1f468-200d-1f468-200d-1f467-200d-1f467\":1629,\"1f468-200d-1f469-200d-1f466\":1620,\"1f468-200d-1f469-200d-1f466-200d-1f466\":1623,\"1f468-200d-1f469-200d-1f467\":1621,\"1f468-200d-1f469-200d-1f467-200d-1f466\":1622,\"1f468-200d-1f469-200d-1f467-200d-1f467\":1624,\"1f468-200d-1f4bb\":1441,\"1f468-200d-1f4bc\":1435,\"1f468-200d-1f527\":1429,\"1f468-200d-1f52c\":1438,\"1f468-200d-1f680\":1453,\"1f468-200d-1f692\":1456,\"1f468-200d-1f9af\":1536,\"1f468-200d-1f9b0\":1362,\"1f468-200d-1f9b1\":1363,\"1f468-200d-1f9b2\":1365,\"1f468-200d-1f9b3\":1364,\"1f468-200d-1f9bc\":1539,\"1f468-200d-1f9bd\":1542,\"1f468-200d-2695\":1411,\"1f468-200d-2696\":1420,\"1f468-200d-2708\":1450,\"1f468-200d-2764-200d-1f468\":1617,\"1f468-200d-2764-200d-1f48b-200d-1f468\":1613,\"1f468\":1360,\"1f469-200d-1f33e\":1424,\"1f469-200d-1f373\":1427,\"1f469-200d-1f37c\":1486,\"1f469-200d-1f393\":1415,\"1f469-200d-1f3a4\":1445,\"1f469-200d-1f3a8\":1448,\"1f469-200d-1f3eb\":1418,\"1f469-200d-1f3ed\":1433,\"1f469-200d-1f466-200d-1f466\":1641,\"1f469-200d-1f466\":1640,\"1f469-200d-1f467-200d-1f466\":1643,\"1f469-200d-1f467-200d-1f467\":1644,\"1f469-200d-1f467\":1642,\"1f469-200d-1f469-200d-1f466\":1630,\"1f469-200d-1f469-200d-1f466-200d-1f466\":1633,\"1f469-200d-1f469-200d-1f467\":1631,\"1f469-200d-1f469-200d-1f467-200d-1f466\":1632,\"1f469-200d-1f469-200d-1f467-200d-1f467\":1634,\"1f469-200d-1f4bb\":1442,\"1f469-200d-1f4bc\":1436,\"1f469-200d-1f527\":1430,\"1f469-200d-1f52c\":1439,\"1f469-200d-1f680\":1454,\"1f469-200d-1f692\":1457,\"1f469-200d-1f9af\":1537,\"1f469-200d-1f9b0\":1367,\"1f469-200d-1f9b1\":1369,\"1f469-200d-1f9b2\":1373,\"1f469-200d-1f9b3\":1371,\"1f469-200d-1f9bc\":1540,\"1f469-200d-1f9bd\":1543,\"1f469-200d-2695\":1412,\"1f469-200d-2696\":1421,\"1f469-200d-2708\":1451,\"1f469-200d-2764-200d-1f468\":1616,\"1f469-200d-2764-200d-1f469\":1618,\"1f469-200d-2764-200d-1f48b-200d-1f468\":1612,\"1f469-200d-2764-200d-1f48b-200d-1f469\":1614,\"1f469\":1366,\"1f46a\":1619,\"1f46b\":1609,\"1f46c\":1610,\"1f46d\":1608,\"1f46e-200d-2640\":1460,\"1f46e-200d-2642\":1459,\"1f46e\":1458,\"1f46f-200d-2640\":1552,\"1f46f-200d-2642\":1551,\"1f46f\":1550,\"1f470-200d-2640\":1483,\"1f470-200d-2642\":1482,\"1f470\":1481,\"1f471-200d-2640\":1375,\"1f471-200d-2642\":1376,\"1f471\":1359,\"1f472\":1476,\"1f473-200d-2640\":1475,\"1f473-200d-2642\":1474,\"1f473\":1473,\"1f474\":1378,\"1f475\":1379,\"1f476\":1354,\"1f477-200d-2640\":1470,\"1f477-200d-2642\":1469,\"1f477\":1468,\"1f478\":1472,\"1f479\":199,\"1f47a\":1100,\"1f47b\":1101,\"1f47c\":1489,\"1f47d\":1102,\"1f47e\":1103,\"1f47f\":194,\"1f480\":195,\"1f481-200d-2640\":1394,\"1f481-200d-2642\":1393,\"1f481\":1392,\"1f482-200d-2640\":1466,\"1f482-200d-2642\":1465,\"1f482\":1464,\"1f483\":1547,\"1f484\":61114,\"1f485\":1335,\"1f486-200d-2640\":1522,\"1f486-200d-2642\":1521,\"1f486\":1520,\"1f487-200d-2640\":1525,\"1f487-200d-2642\":1524,\"1f487\":1523,\"1f488\":4836,\"1f489\":61287,\"1f48a\":61289,\"1f48b\":1117,\"1f48c\":1118,\"1f48d\":61115,\"1f48e\":61116,\"1f48f\":1611,\"1f490\":2621,\"1f491\":1615,\"1f492\":4813,\"1f493\":1123,\"1f494\":1128,\"1f495\":1125,\"1f496\":1121,\"1f497\":1122,\"1f498\":1119,\"1f499\":1133,\"1f49a\":1132,\"1f49b\":1131,\"1f49c\":1134,\"1f49d\":1120,\"1f49e\":1124,\"1f49f\":1126,\"1f4a0\":62859,\"1f4a1\":61175,\"1f4a2\":1139,\"1f4a3\":1145,\"1f4a4\":1151,\"1f4a5\":1140,\"1f4a6\":1142,\"1f4a7\":4986,\"1f4a8\":1143,\"1f4a9\":197,\"1f4aa\":1337,\"1f4ab\":1141,\"1f4ac\":1146,\"1f4ad\":1150,\"1f4ae\":2623,\"1f4af\":1138,\"1f4b0\":61196,\"1f4b1\":62754,\"1f4b2\":62755,\"1f4b3\":61203,\"1f4b4\":61198,\"1f4b5\":61199,\"1f4b6\":61200,\"1f4b7\":61201,\"1f4b8\":61202,\"1f4b9\":61205,\"1f4ba\":4900,\"1f4bb\":61152,\"1f4bc\":61226,\"1f4bd\":61158,\"1f4be\":61159,\"1f4bf\":61160,\"1f4c0\":61161,\"1f4c1\":61227,\"1f4c2\":61228,\"1f4c3\":61188,\"1f4c4\":61190,\"1f4c5\":61230,\"1f4c6\":61231,\"1f4c7\":61234,\"1f4c8\":61235,\"1f4c9\":61236,\"1f4ca\":61237,\"1f4cb\":61238,\"1f4cc\":61239,\"1f4cd\":61240,\"1f4ce\":61241,\"1f4cf\":61243,\"1f4d0\":61244,\"1f4d1\":61193,\"1f4d2\":61187,\"1f4d3\":61186,\"1f4d4\":61179,\"1f4d5\":61180,\"1f4d6\":61181,\"1f4d7\":61182,\"1f4d8\":61183,\"1f4d9\":61184,\"1f4da\":61185,\"1f4db\":62760,\"1f4dc\":61189,\"1f4dd\":61225,\"1f4de\":61147,\"1f4df\":61148,\"1f4e0\":61149,\"1f4e1\":61286,\"1f4e2\":61121,\"1f4e3\":61122,\"1f4e4\":61210,\"1f4e5\":61211,\"1f4e6\":61212,\"1f4e7\":61207,\"1f4e8\":61208,\"1f4e9\":61209,\"1f4ea\":61214,\"1f4eb\":61213,\"1f4ec\":61215,\"1f4ed\":61216,\"1f4ee\":61217,\"1f4ef\":61123,\"1f4f0\":61191,\"1f4f1\":61144,\"1f4f2\":61145,\"1f4f3\":62737,\"1f4f4\":62738,\"1f4f5\":62665,\"1f4f6\":62736,\"1f4f7\":61168,\"1f4f8\":61169,\"1f4f9\":61170,\"1f4fa\":61167,\"1f4fb\":61134,\"1f4fc\":61171,\"1f4fd\":61165,\"1f4ff\":61113,\"1f500\":62715,\"1f501\":62716,\"1f502\":62717,\"1f503\":62683,\"1f504\":62684,\"1f505\":62734,\"1f506\":62735,\"1f507\":61117,\"1f508\":61118,\"1f509\":61119,\"1f50a\":61120,\"1f50b\":61150,\"1f50c\":61151,\"1f50d\":61172,\"1f50e\":61173,\"1f50f\":61251,\"1f510\":61252,\"1f511\":61253,\"1f512\":61249,\"1f513\":61250,\"1f514\":61124,\"1f515\":61125,\"1f516\":61194,\"1f517\":61274,\"1f518\":62860,\"1f519\":62685,\"1f51a\":62686,\"1f51b\":62687,\"1f51c\":62688,\"1f51d\":62689,\"1f51e\":62666,\"1f51f\":62789,\"1f520\":62790,\"1f521\":62791,\"1f522\":62792,\"1f523\":62793,\"1f524\":62794,\"1f525\":4985,\"1f526\":61176,\"1f527\":61267,\"1f528\":61255,\"1f529\":61269,\"1f52a\":3771,\"1f52b\":61262,\"1f52c\":61284,\"1f52d\":61285,\"1f52e\":51046,\"1f52f\":62701,\"1f530\":62761,\"1f531\":62759,\"1f532\":62862,\"1f533\":62861,\"1f534\":62829,\"1f535\":62833,\"1f536\":62853,\"1f537\":62854,\"1f538\":62855,\"1f539\":62856,\"1f53a\":62857,\"1f53b\":62858,\"1f53c\":62725,\"1f53d\":62727,\"1f549\":62692,\"1f54a\":2576,\"1f54b\":4821,\"1f54c\":4817,\"1f54d\":4819,\"1f54e\":62700,\"1f550\":4919,\"1f551\":4921,\"1f552\":4923,\"1f553\":4925,\"1f554\":4927,\"1f555\":4929,\"1f556\":4931,\"1f557\":4933,\"1f558\":4935,\"1f559\":4937,\"1f55a\":4939,\"1f55b\":4917,\"1f55c\":4920,\"1f55d\":4922,\"1f55e\":4924,\"1f55f\":4926,\"1f560\":4928,\"1f561\":4930,\"1f562\":4932,\"1f563\":4934,\"1f564\":4936,\"1f565\":4938,\"1f566\":4940,\"1f567\":4918,\"1f56f\":61174,\"1f570\":4916,\"1f573\":1144,\"1f574\":1549,\"1f575-200d-2640\":1463,\"1f575-200d-2642\":1462,\"1f575\":1461,\"1f576\":61073,\"1f577\":2614,\"1f578\":2615,\"1f579\":51050,\"1f57a\":1548,\"1f587\":61242,\"1f58a\":61222,\"1f58b\":61221,\"1f58c\":61223,\"1f58d\":61224,\"1f590\":1305,\"1f595\":1319,\"1f596\":1307,\"1f5a4\":1136,\"1f5a5\":61153,\"1f5a8\":61154,\"1f5b1\":61156,\"1f5b2\":61157,\"1f5bc\":51066,\"1f5c2\":61229,\"1f5c3\":61246,\"1f5c4\":61247,\"1f5d1\":61248,\"1f5d2\":61232,\"1f5d3\":61233,\"1f5dc\":61271,\"1f5dd\":61254,\"1f5de\":61192,\"1f5e1\":61260,\"1f5e3\":1645,\"1f5e8\":1148,\"1f5ef\":1149,\"1f5f3\":61218,\"1f5fa\":4777,\"1f5fb\":4783,\"1f5fc\":4814,\"1f5fd\":4815,\"1f5fe\":4778,\"1f5ff\":61320,\"1f600\":11,\"1f601\":14,\"1f602\":18,\"1f603\":12,\"1f604\":13,\"1f605\":16,\"1f606\":15,\"1f607\":113,\"1f608\":193,\"1f609\":111,\"1f60a\":112,\"1f60b\":123,\"1f60c\":143,\"1f60d\":115,\"1f60e\":162,\"1f60f\":138,\"1f610\":135,\"1f611\":136,\"1f612\":139,\"1f613\":185,\"1f614\":144,\"1f615\":165,\"1f616\":182,\"1f617\":118,\"1f618\":117,\"1f619\":121,\"1f61a\":120,\"1f61b\":124,\"1f61c\":125,\"1f61d\":127,\"1f61e\":184,\"1f61f\":166,\"1f620\":191,\"1f621\":190,\"1f622\":179,\"1f623\":183,\"1f624\":189,\"1f625\":178,\"1f626\":174,\"1f627\":175,\"1f628\":176,\"1f629\":186,\"1f62a\":145,\"1f62b\":187,\"1f62c\":141,\"1f62d\":180,\"1f62e\":169,\"1f62f\":170,\"1f630\":177,\"1f631\":181,\"1f632\":171,\"1f633\":172,\"1f634\":147,\"1f635\":157,\"1f636\":137,\"1f637\":148,\"1f638\":1106,\"1f639\":1107,\"1f63a\":1105,\"1f63b\":1108,\"1f63c\":1109,\"1f63d\":1110,\"1f63e\":1113,\"1f63f\":1112,\"1f640\":1111,\"1f641\":167,\"1f642\":19,\"1f643\":110,\"1f644\":140,\"1f645-200d-2640\":1388,\"1f645-200d-2642\":1387,\"1f645\":1386,\"1f646-200d-2640\":1391,\"1f646-200d-2642\":1390,\"1f646\":1389,\"1f647-200d-2640\":1403,\"1f647-200d-2642\":1402,\"1f647\":1401,\"1f648\":1114,\"1f649\":1115,\"1f64a\":1116,\"1f64b-200d-2640\":1397,\"1f64b-200d-2642\":1396,\"1f64b\":1395,\"1f64c\":1329,\"1f64d-200d-2640\":1382,\"1f64d-200d-2642\":1381,\"1f64d\":1380,\"1f64e-200d-2640\":1385,\"1f64e-200d-2642\":1384,\"1f64e\":1383,\"1f64f\":1333,\"1f680\":4906,\"1f681\":4901,\"1f682\":4838,\"1f683\":4839,\"1f684\":4840,\"1f685\":4841,\"1f686\":4842,\"1f687\":4843,\"1f688\":4844,\"1f689\":4845,\"1f68a\":4846,\"1f68b\":4849,\"1f68c\":4850,\"1f68d\":4851,\"1f68e\":4852,\"1f68f\":4877,\"1f690\":4853,\"1f691\":4854,\"1f692\":4855,\"1f693\":4856,\"1f694\":4857,\"1f695\":4858,\"1f696\":4859,\"1f697\":4860,\"1f698\":4861,\"1f699\":4862,\"1f69a\":4864,\"1f69b\":4865,\"1f69c\":4866,\"1f69d\":4847,\"1f69e\":4848,\"1f69f\":4902,\"1f6a0\":4903,\"1f6a1\":4904,\"1f6a2\":4894,\"1f6a3-200d-2640\":1571,\"1f6a3-200d-2642\":1570,\"1f6a3\":1569,\"1f6a4\":4890,\"1f6a5\":4883,\"1f6a6\":4884,\"1f6a7\":4886,\"1f6a8\":4882,\"1f6a9\":71543,\"1f6aa\":61292,\"1f6ab\":62659,\"1f6ac\":61316,\"1f6ad\":62661,\"1f6ae\":62644,\"1f6af\":62662,\"1f6b0\":62645,\"1f6b1\":62663,\"1f6b2\":4873,\"1f6b3\":62660,\"1f6b4-200d-2640\":1583,\"1f6b4-200d-2642\":1582,\"1f6b4\":1581,\"1f6b5-200d-2640\":1586,\"1f6b5-200d-2642\":1585,\"1f6b5\":1584,\"1f6b6-200d-2640\":1528,\"1f6b6-200d-2642\":1527,\"1f6b6\":1526,\"1f6b7\":62664,\"1f6b8\":62657,\"1f6b9\":62647,\"1f6ba\":62648,\"1f6bb\":62649,\"1f6bc\":62650,\"1f6bd\":61299,\"1f6be\":62651,\"1f6bf\":61301,\"1f6c0\":1605,\"1f6c1\":61302,\"1f6c2\":62652,\"1f6c3\":62653,\"1f6c4\":62654,\"1f6c5\":62655,\"1f6cb\":61297,\"1f6cc\":1606,\"1f6cd\":61095,\"1f6ce\":4908,\"1f6cf\":61296,\"1f6d0\":62690,\"1f6d1\":4885,\"1f6d2\":61315,\"1f6d5\":4818,\"1f6d6\":4795,\"1f6d7\":61293,\"1f6e0\":61259,\"1f6e1\":61265,\"1f6e2\":4880,\"1f6e3\":4878,\"1f6e4\":4879,\"1f6e5\":4893,\"1f6e9\":4896,\"1f6eb\":4897,\"1f6ec\":4898,\"1f6f0\":4905,\"1f6f3\":4891,\"1f6f4\":4874,\"1f6f5\":4869,\"1f6f6\":4889,\"1f6f7\":51040,\"1f6f8\":4907,\"1f6f9\":4875,\"1f6fa\":4872,\"1f6fb\":4863,\"1f6fc\":4876,\"1f7e0\":62830,\"1f7e1\":62831,\"1f7e2\":62832,\"1f7e3\":62834,\"1f7e4\":62835,\"1f7e5\":62838,\"1f7e6\":62842,\"1f7e7\":62839,\"1f7e8\":62840,\"1f7e9\":62841,\"1f7ea\":62843,\"1f7eb\":62844,\"1f90c\":1309,\"1f90d\":1137,\"1f90e\":1135,\"1f90f\":1310,\"1f910\":133,\"1f911\":128,\"1f912\":149,\"1f913\":163,\"1f914\":132,\"1f915\":150,\"1f916\":1104,\"1f917\":129,\"1f918\":1314,\"1f919\":1315,\"1f91a\":1304,\"1f91b\":1326,\"1f91c\":1327,\"1f91d\":1332,\"1f91e\":1312,\"1f91f\":1313,\"1f920\":159,\"1f921\":198,\"1f922\":151,\"1f923\":17,\"1f924\":146,\"1f925\":142,\"1f926-200d-2640\":1406,\"1f926-200d-2642\":1405,\"1f926\":1404,\"1f927\":153,\"1f928\":134,\"1f929\":116,\"1f92a\":126,\"1f92b\":131,\"1f92c\":192,\"1f92d\":130,\"1f92e\":152,\"1f92f\":158,\"1f930\":1484,\"1f931\":1485,\"1f932\":1331,\"1f933\":1336,\"1f934\":1471,\"1f935-200d-2640\":1480,\"1f935-200d-2642\":1479,\"1f935\":1478,\"1f936\":1491,\"1f937-200d-2640\":1409,\"1f937-200d-2642\":1408,\"1f937\":1407,\"1f938-200d-2640\":1589,\"1f938-200d-2642\":1588,\"1f938\":1587,\"1f939-200d-2640\":1601,\"1f939-200d-2642\":1600,\"1f939\":1599,\"1f93a\":1559,\"1f93c-200d-2640\":1592,\"1f93c-200d-2642\":1591,\"1f93c\":1590,\"1f93d-200d-2640\":1595,\"1f93d-200d-2642\":1594,\"1f93d\":1593,\"1f93e-200d-2640\":1598,\"1f93e-200d-2642\":1597,\"1f93e\":1596,\"1f93f\":51037,\"1f940\":2626,\"1f941\":61142,\"1f942\":3760,\"1f943\":3761,\"1f944\":3770,\"1f945\":51033,\"1f947\":51012,\"1f948\":51013,\"1f949\":51014,\"1f94a\":51031,\"1f94b\":51032,\"1f94c\":51041,\"1f94d\":51028,\"1f94e\":51017,\"1f94f\":51023,\"1f950\":3679,\"1f951\":3663,\"1f952\":3670,\"1f953\":3690,\"1f954\":3665,\"1f955\":3666,\"1f956\":3680,\"1f957\":3707,\"1f958\":3703,\"1f959\":3699,\"1f95a\":3701,\"1f95b\":3749,\"1f95c\":3676,\"1f95d\":3659,\"1f95e\":3684,\"1f95f\":3726,\"1f960\":3727,\"1f961\":3728,\"1f962\":3767,\"1f963\":3706,\"1f964\":3762,\"1f965\":3662,\"1f966\":3672,\"1f967\":3742,\"1f968\":3682,\"1f969\":3689,\"1f96a\":3695,\"1f96b\":3711,\"1f96c\":3671,\"1f96d\":3651,\"1f96e\":3724,\"1f96f\":3683,\"1f970\":114,\"1f971\":188,\"1f972\":122,\"1f973\":160,\"1f974\":156,\"1f975\":154,\"1f976\":155,\"1f977\":1467,\"1f978\":161,\"1f97a\":173,\"1f97b\":61086,\"1f97c\":61075,\"1f97d\":61074,\"1f97e\":61100,\"1f97f\":61101,\"1f980\":3729,\"1f981\":2519,\"1f982\":2616,\"1f983\":2568,\"1f984\":2525,\"1f985\":2577,\"1f986\":2578,\"1f987\":2557,\"1f988\":2602,\"1f989\":2580,\"1f98a\":2514,\"1f98b\":2606,\"1f98c\":2527,\"1f98d\":2506,\"1f98e\":2589,\"1f98f\":2546,\"1f990\":3731,\"1f991\":3732,\"1f992\":2543,\"1f993\":2526,\"1f994\":2556,\"1f995\":2593,\"1f996\":2594,\"1f997\":2612,\"1f998\":2565,\"1f999\":2542,\"1f99a\":2584,\"1f99b\":2547,\"1f99c\":2585,\"1f99d\":2515,\"1f99e\":3730,\"1f99f\":2617,\"1f9a0\":2620,\"1f9a1\":2566,\"1f9a2\":2579,\"1f9a3\":2545,\"1f9a4\":2581,\"1f9a5\":2562,\"1f9a6\":2563,\"1f9a7\":2507,\"1f9a8\":2564,\"1f9a9\":2583,\"1f9aa\":3733,\"1f9ab\":2555,\"1f9ac\":2528,\"1f9ad\":2598,\"1f9ae\":2510,\"1f9af\":61273,\"1f9b4\":1349,\"1f9b5\":1340,\"1f9b6\":1341,\"1f9b7\":1348,\"1f9b8-200d-2640\":1495,\"1f9b8-200d-2642\":1494,\"1f9b8\":1493,\"1f9b9-200d-2640\":1498,\"1f9b9-200d-2642\":1497,\"1f9b9\":1496,\"1f9ba\":61076,\"1f9bb\":1343,\"1f9bc\":4871,\"1f9bd\":4870,\"1f9be\":1338,\"1f9bf\":1339,\"1f9c0\":3686,\"1f9c1\":3741,\"1f9c2\":3710,\"1f9c3\":3764,\"1f9c4\":3673,\"1f9c5\":3674,\"1f9c6\":3700,\"1f9c7\":3685,\"1f9c8\":3709,\"1f9c9\":3765,\"1f9ca\":3766,\"1f9cb\":3763,\"1f9cd-200d-2640\":1531,\"1f9cd-200d-2642\":1530,\"1f9cd\":1529,\"1f9ce-200d-2640\":1534,\"1f9ce-200d-2642\":1533,\"1f9ce\":1532,\"1f9cf-200d-2640\":1400,\"1f9cf-200d-2642\":1399,\"1f9cf\":1398,\"1f9d0\":164,\"1f9d1-200d-1f33e\":1422,\"1f9d1-200d-1f373\":1425,\"1f9d1-200d-1f37c\":1488,\"1f9d1-200d-1f384\":1492,\"1f9d1-200d-1f393\":1413,\"1f9d1-200d-1f3a4\":1443,\"1f9d1-200d-1f3a8\":1446,\"1f9d1-200d-1f3eb\":1416,\"1f9d1-200d-1f3ed\":1431,\"1f9d1-200d-1f4bb\":1440,\"1f9d1-200d-1f4bc\":1434,\"1f9d1-200d-1f527\":1428,\"1f9d1-200d-1f52c\":1437,\"1f9d1-200d-1f680\":1452,\"1f9d1-200d-1f692\":1455,\"1f9d1-200d-1f91d-200d-1f9d1\":1607,\"1f9d1-200d-1f9af\":1535,\"1f9d1-200d-1f9b0\":1368,\"1f9d1-200d-1f9b1\":1370,\"1f9d1-200d-1f9b2\":1374,\"1f9d1-200d-1f9b3\":1372,\"1f9d1-200d-1f9bc\":1538,\"1f9d1-200d-1f9bd\":1541,\"1f9d1-200d-2695\":1410,\"1f9d1-200d-2696\":1419,\"1f9d1-200d-2708\":1449,\"1f9d1\":1358,\"1f9d2\":1355,\"1f9d3\":1377,\"1f9d4\":1361,\"1f9d5\":1477,\"1f9d6-200d-2640\":1555,\"1f9d6-200d-2642\":1554,\"1f9d6\":1553,\"1f9d7-200d-2640\":1558,\"1f9d7-200d-2642\":1557,\"1f9d7\":1556,\"1f9d8-200d-2640\":1604,\"1f9d8-200d-2642\":1603,\"1f9d8\":1602,\"1f9d9-200d-2640\":1501,\"1f9d9-200d-2642\":1500,\"1f9d9\":1499,\"1f9da-200d-2640\":1504,\"1f9da-200d-2642\":1503,\"1f9da\":1502,\"1f9db-200d-2640\":1507,\"1f9db-200d-2642\":1506,\"1f9db\":1505,\"1f9dc-200d-2640\":1510,\"1f9dc-200d-2642\":1509,\"1f9dc\":1508,\"1f9dd-200d-2640\":1513,\"1f9dd-200d-2642\":1512,\"1f9dd\":1511,\"1f9de-200d-2640\":1516,\"1f9de-200d-2642\":1515,\"1f9de\":1514,\"1f9df-200d-2640\":1519,\"1f9df-200d-2642\":1518,\"1f9df\":1517,\"1f9e0\":1345,\"1f9e1\":1130,\"1f9e2\":61110,\"1f9e3\":61080,\"1f9e4\":61081,\"1f9e5\":61082,\"1f9e6\":61083,\"1f9e7\":51003,\"1f9e8\":5992,\"1f9e9\":51053,\"1f9ea\":61281,\"1f9eb\":61282,\"1f9ec\":61283,\"1f9ed\":4779,\"1f9ee\":61162,\"1f9ef\":61314,\"1f9f0\":61277,\"1f9f1\":4792,\"1f9f2\":61278,\"1f9f3\":4909,\"1f9f4\":61305,\"1f9f5\":51068,\"1f9f6\":51070,\"1f9f7\":61306,\"1f9f8\":51054,\"1f9f9\":61307,\"1f9fa\":61308,\"1f9fb\":61309,\"1f9fc\":61311,\"1f9fd\":61313,\"1f9fe\":61204,\"1f9ff\":51048,\"1fa70\":61104,\"1fa71\":61087,\"1fa72\":61088,\"1fa73\":61089,\"1fa74\":61097,\"1fa78\":61288,\"1fa79\":61290,\"1fa7a\":61291,\"1fa80\":51043,\"1fa81\":51044,\"1fa82\":4899,\"1fa83\":61263,\"1fa84\":51047,\"1fa85\":51055,\"1fa86\":51056,\"1fa90\":4957,\"1fa91\":61298,\"1fa92\":61304,\"1fa93\":61256,\"1fa94\":61178,\"1fa95\":61141,\"1fa96\":61111,\"1fa97\":61136,\"1fa98\":61143,\"1fa99\":61197,\"1fa9a\":61266,\"1fa9b\":61268,\"1fa9c\":61279,\"1fa9d\":61276,\"1fa9e\":61294,\"1fa9f\":61295,\"1faa0\":61300,\"1faa1\":51069,\"1faa2\":51071,\"1faa3\":61310,\"1faa4\":61303,\"1faa5\":61312,\"1faa6\":61318,\"1faa7\":61321,\"1faa8\":4793,\"1fab0\":2618,\"1fab1\":2619,\"1fab2\":2610,\"1fab3\":2613,\"1fab4\":2632,\"1fab5\":4794,\"1fab6\":2582,\"1fac0\":1346,\"1fac1\":1347,\"1fac2\":1648,\"1fad0\":3658,\"1fad1\":3669,\"1fad2\":3661,\"1fad3\":3681,\"1fad4\":3698,\"1fad5\":3705,\"1fad6\":3751,\"203c\":62747,\"21a9\":62679,\"21aa\":62680,\"231a\":4912,\"231b\":4910,\"23cf\":62732,\"23e9\":62719,\"23ea\":62723,\"23eb\":62726,\"23ec\":62728,\"23ed\":62720,\"23ee\":62724,\"23ef\":62721,\"23f0\":4913,\"23f1\":4914,\"23f2\":4915,\"23f3\":4911,\"23f8\":62729,\"23f9\":62730,\"23fa\":62731,\"24c2\":62803,\"25aa\":62851,\"25ab\":62852,\"25b6\":62718,\"25c0\":62722,\"25fb\":62848,\"25fc\":62847,\"25fd\":62850,\"25fe\":62849,\"260e\":61146,\"261d\":1321,\"262a\":62698,\"262e\":62699,\"262f\":62695,\"263a\":119,\"264a\":62704,\"264b\":62705,\"264c\":62706,\"264d\":62707,\"264e\":62708,\"264f\":62709,\"265f\":51061,\"267b\":62757,\"267e\":62746,\"267f\":62646,\"269b\":62691,\"269c\":62758,\"26a0\":62656,\"26a1\":4980,\"26a7\":62741,\"26aa\":62837,\"26ab\":62836,\"26b0\":61317,\"26b1\":61319,\"26bd\":51015,\"26be\":51016,\"26c4\":4983,\"26c5\":4963,\"26c8\":4964,\"26ce\":62714,\"26cf\":61257,\"26d1\":61112,\"26d3\":61275,\"26d4\":62658,\"26e9\":4820,\"26ea\":4816,\"26f0\":4781,\"26f1\":4979,\"26f2\":4822,\"26f3\":51034,\"26f4\":4892,\"26f5\":4888,\"26f7\":1561,\"26f8\":51035,\"26f9-200d-2640\":1577,\"26f9-200d-2642\":1576,\"26f9\":1575,\"26fa\":4823,\"26fd\":4881,\"270a\":1324,\"270b\":1306,\"270c\":1311,\"270d\":1334,\"270f\":61219,\"271d\":62696,\"274c\":62766,\"274e\":62767,\"27a1\":62671,\"27b0\":62768,\"27bf\":62769,\"2b05\":62675,\"2b06\":62669,\"2b07\":62673,\"2b1b\":62845,\"2b1c\":62846,\"2b50\":4958,\"2b55\":62762,\"303d\":62770,\"1f385-1f3fb\":0,\"1f385-1f3fc\":0,\"1f385-1f3fd\":0,\"1f385-1f3fe\":0,\"1f385-1f3ff\":0,\"1f3c2-1f3fb\":0,\"1f3c2-1f3fc\":0,\"1f3c2-1f3fd\":0,\"1f3c2-1f3fe\":0,\"1f3c2-1f3ff\":0,\"1f3c3-1f3fb-200d-2640\":0,\"1f3c3-1f3fc-200d-2640\":0,\"1f3c3-1f3fd-200d-2640\":0,\"1f3c3-1f3fe-200d-2640\":0,\"1f3c3-1f3ff-200d-2640\":0,\"1f3c3-1f3fb-200d-2642\":0,\"1f3c3-1f3fc-200d-2642\":0,\"1f3c3-1f3fd-200d-2642\":0,\"1f3c3-1f3fe-200d-2642\":0,\"1f3c3-1f3ff-200d-2642\":0,\"1f3c3-1f3fb\":0,\"1f3c3-1f3fc\":0,\"1f3c3-1f3fd\":0,\"1f3c3-1f3fe\":0,\"1f3c3-1f3ff\":0,\"1f3c4-1f3fb-200d-2640\":0,\"1f3c4-1f3fc-200d-2640\":0,\"1f3c4-1f3fd-200d-2640\":0,\"1f3c4-1f3fe-200d-2640\":0,\"1f3c4-1f3ff-200d-2640\":0,\"1f3c4-1f3fb-200d-2642\":0,\"1f3c4-1f3fc-200d-2642\":0,\"1f3c4-1f3fd-200d-2642\":0,\"1f3c4-1f3fe-200d-2642\":0,\"1f3c4-1f3ff-200d-2642\":0,\"1f3c4-1f3fb\":0,\"1f3c4-1f3fc\":0,\"1f3c4-1f3fd\":0,\"1f3c4-1f3fe\":0,\"1f3c4-1f3ff\":0,\"1f3c7-1f3fb\":0,\"1f3c7-1f3fc\":0,\"1f3c7-1f3fd\":0,\"1f3c7-1f3fe\":0,\"1f3c7-1f3ff\":0,\"1f3ca-1f3fb-200d-2640\":0,\"1f3ca-1f3fc-200d-2640\":0,\"1f3ca-1f3fd-200d-2640\":0,\"1f3ca-1f3fe-200d-2640\":0,\"1f3ca-1f3ff-200d-2640\":0,\"1f3ca-1f3fb-200d-2642\":0,\"1f3ca-1f3fc-200d-2642\":0,\"1f3ca-1f3fd-200d-2642\":0,\"1f3ca-1f3fe-200d-2642\":0,\"1f3ca-1f3ff-200d-2642\":0,\"1f3ca-1f3fb\":0,\"1f3ca-1f3fc\":0,\"1f3ca-1f3fd\":0,\"1f3ca-1f3fe\":0,\"1f3ca-1f3ff\":0,\"1f3cb-1f3fb-200d-2640\":0,\"1f3cb-1f3fc-200d-2640\":0,\"1f3cb-1f3fd-200d-2640\":0,\"1f3cb-1f3fe-200d-2640\":0,\"1f3cb-1f3ff-200d-2640\":0,\"1f3cb-1f3fb-200d-2642\":0,\"1f3cb-1f3fc-200d-2642\":0,\"1f3cb-1f3fd-200d-2642\":0,\"1f3cb-1f3fe-200d-2642\":0,\"1f3cb-1f3ff-200d-2642\":0,\"1f3cb-1f3fb\":0,\"1f3cb-1f3fc\":0,\"1f3cb-1f3fd\":0,\"1f3cb-1f3fe\":0,\"1f3cb-1f3ff\":0,\"1f3cc-1f3fb-200d-2640\":0,\"1f3cc-1f3fc-200d-2640\":0,\"1f3cc-1f3fd-200d-2640\":0,\"1f3cc-1f3fe-200d-2640\":0,\"1f3cc-1f3ff-200d-2640\":0,\"1f3cc-1f3fb-200d-2642\":0,\"1f3cc-1f3fc-200d-2642\":0,\"1f3cc-1f3fd-200d-2642\":0,\"1f3cc-1f3fe-200d-2642\":0,\"1f3cc-1f3ff-200d-2642\":0,\"1f3cc-1f3fb\":0,\"1f3cc-1f3fc\":0,\"1f3cc-1f3fd\":0,\"1f3cc-1f3fe\":0,\"1f3cc-1f3ff\":0,\"1f442-1f3fb\":0,\"1f442-1f3fc\":0,\"1f442-1f3fd\":0,\"1f442-1f3fe\":0,\"1f442-1f3ff\":0,\"1f443-1f3fb\":0,\"1f443-1f3fc\":0,\"1f443-1f3fd\":0,\"1f443-1f3fe\":0,\"1f443-1f3ff\":0,\"1f446-1f3fb\":0,\"1f446-1f3fc\":0,\"1f446-1f3fd\":0,\"1f446-1f3fe\":0,\"1f446-1f3ff\":0,\"1f447-1f3fb\":0,\"1f447-1f3fc\":0,\"1f447-1f3fd\":0,\"1f447-1f3fe\":0,\"1f447-1f3ff\":0,\"1f448-1f3fb\":0,\"1f448-1f3fc\":0,\"1f448-1f3fd\":0,\"1f448-1f3fe\":0,\"1f448-1f3ff\":0,\"1f449-1f3fb\":0,\"1f449-1f3fc\":0,\"1f449-1f3fd\":0,\"1f449-1f3fe\":0,\"1f449-1f3ff\":0,\"1f44a-1f3fb\":0,\"1f44a-1f3fc\":0,\"1f44a-1f3fd\":0,\"1f44a-1f3fe\":0,\"1f44a-1f3ff\":0,\"1f44b-1f3fb\":0,\"1f44b-1f3fc\":0,\"1f44b-1f3fd\":0,\"1f44b-1f3fe\":0,\"1f44b-1f3ff\":0,\"1f44c-1f3fb\":0,\"1f44c-1f3fc\":0,\"1f44c-1f3fd\":0,\"1f44c-1f3fe\":0,\"1f44c-1f3ff\":0,\"1f44d-1f3fb\":0,\"1f44d-1f3fc\":0,\"1f44d-1f3fd\":0,\"1f44d-1f3fe\":0,\"1f44d-1f3ff\":0,\"1f44e-1f3fb\":0,\"1f44e-1f3fc\":0,\"1f44e-1f3fd\":0,\"1f44e-1f3fe\":0,\"1f44e-1f3ff\":0,\"1f44f-1f3fb\":0,\"1f44f-1f3fc\":0,\"1f44f-1f3fd\":0,\"1f44f-1f3fe\":0,\"1f44f-1f3ff\":0,\"1f450-1f3fb\":0,\"1f450-1f3fc\":0,\"1f450-1f3fd\":0,\"1f450-1f3fe\":0,\"1f450-1f3ff\":0,\"1f466-1f3fb\":0,\"1f466-1f3fc\":0,\"1f466-1f3fd\":0,\"1f466-1f3fe\":0,\"1f466-1f3ff\":0,\"1f467-1f3fb\":0,\"1f467-1f3fc\":0,\"1f467-1f3fd\":0,\"1f467-1f3fe\":0,\"1f467-1f3ff\":0,\"1f468-1f3fb-200d-1f33e\":0,\"1f468-1f3fc-200d-1f33e\":0,\"1f468-1f3fd-200d-1f33e\":0,\"1f468-1f3fe-200d-1f33e\":0,\"1f468-1f3ff-200d-1f33e\":0,\"1f468-1f3fb-200d-1f373\":0,\"1f468-1f3fc-200d-1f373\":0,\"1f468-1f3fd-200d-1f373\":0,\"1f468-1f3fe-200d-1f373\":0,\"1f468-1f3ff-200d-1f373\":0,\"1f468-1f3fb-200d-1f37c\":0,\"1f468-1f3fc-200d-1f37c\":0,\"1f468-1f3fd-200d-1f37c\":0,\"1f468-1f3fe-200d-1f37c\":0,\"1f468-1f3ff-200d-1f37c\":0,\"1f468-1f3fb-200d-1f393\":0,\"1f468-1f3fc-200d-1f393\":0,\"1f468-1f3fd-200d-1f393\":0,\"1f468-1f3fe-200d-1f393\":0,\"1f468-1f3ff-200d-1f393\":0,\"1f468-1f3fb-200d-1f3a4\":0,\"1f468-1f3fc-200d-1f3a4\":0,\"1f468-1f3fd-200d-1f3a4\":0,\"1f468-1f3fe-200d-1f3a4\":0,\"1f468-1f3ff-200d-1f3a4\":0,\"1f468-1f3fb-200d-1f3a8\":0,\"1f468-1f3fc-200d-1f3a8\":0,\"1f468-1f3fd-200d-1f3a8\":0,\"1f468-1f3fe-200d-1f3a8\":0,\"1f468-1f3ff-200d-1f3a8\":0,\"1f468-1f3fb-200d-1f3eb\":0,\"1f468-1f3fc-200d-1f3eb\":0,\"1f468-1f3fd-200d-1f3eb\":0,\"1f468-1f3fe-200d-1f3eb\":0,\"1f468-1f3ff-200d-1f3eb\":0,\"1f468-1f3fb-200d-1f3ed\":0,\"1f468-1f3fc-200d-1f3ed\":0,\"1f468-1f3fd-200d-1f3ed\":0,\"1f468-1f3fe-200d-1f3ed\":0,\"1f468-1f3ff-200d-1f3ed\":0,\"1f468-1f3fb-200d-1f4bb\":0,\"1f468-1f3fc-200d-1f4bb\":0,\"1f468-1f3fd-200d-1f4bb\":0,\"1f468-1f3fe-200d-1f4bb\":0,\"1f468-1f3ff-200d-1f4bb\":0,\"1f468-1f3fb-200d-1f4bc\":0,\"1f468-1f3fc-200d-1f4bc\":0,\"1f468-1f3fd-200d-1f4bc\":0,\"1f468-1f3fe-200d-1f4bc\":0,\"1f468-1f3ff-200d-1f4bc\":0,\"1f468-1f3fb-200d-1f527\":0,\"1f468-1f3fc-200d-1f527\":0,\"1f468-1f3fd-200d-1f527\":0,\"1f468-1f3fe-200d-1f527\":0,\"1f468-1f3ff-200d-1f527\":0,\"1f468-1f3fb-200d-1f52c\":0,\"1f468-1f3fc-200d-1f52c\":0,\"1f468-1f3fd-200d-1f52c\":0,\"1f468-1f3fe-200d-1f52c\":0,\"1f468-1f3ff-200d-1f52c\":0,\"1f468-1f3fb-200d-1f680\":0,\"1f468-1f3fc-200d-1f680\":0,\"1f468-1f3fd-200d-1f680\":0,\"1f468-1f3fe-200d-1f680\":0,\"1f468-1f3ff-200d-1f680\":0,\"1f468-1f3fb-200d-1f692\":0,\"1f468-1f3fc-200d-1f692\":0,\"1f468-1f3fd-200d-1f692\":0,\"1f468-1f3fe-200d-1f692\":0,\"1f468-1f3ff-200d-1f692\":0,\"1f468-1f3fb-200d-1f9af\":0,\"1f468-1f3fc-200d-1f9af\":0,\"1f468-1f3fd-200d-1f9af\":0,\"1f468-1f3fe-200d-1f9af\":0,\"1f468-1f3ff-200d-1f9af\":0,\"1f468-1f3fb-200d-1f9b0\":0,\"1f468-1f3fc-200d-1f9b0\":0,\"1f468-1f3fd-200d-1f9b0\":0,\"1f468-1f3fe-200d-1f9b0\":0,\"1f468-1f3ff-200d-1f9b0\":0,\"1f468-1f3fb-200d-1f9b1\":0,\"1f468-1f3fc-200d-1f9b1\":0,\"1f468-1f3fd-200d-1f9b1\":0,\"1f468-1f3fe-200d-1f9b1\":0,\"1f468-1f3ff-200d-1f9b1\":0,\"1f468-1f3fb-200d-1f9b2\":0,\"1f468-1f3fc-200d-1f9b2\":0,\"1f468-1f3fd-200d-1f9b2\":0,\"1f468-1f3fe-200d-1f9b2\":0,\"1f468-1f3ff-200d-1f9b2\":0,\"1f468-1f3fb-200d-1f9b3\":0,\"1f468-1f3fc-200d-1f9b3\":0,\"1f468-1f3fd-200d-1f9b3\":0,\"1f468-1f3fe-200d-1f9b3\":0,\"1f468-1f3ff-200d-1f9b3\":0,\"1f468-1f3fb-200d-1f9bc\":0,\"1f468-1f3fc-200d-1f9bc\":0,\"1f468-1f3fd-200d-1f9bc\":0,\"1f468-1f3fe-200d-1f9bc\":0,\"1f468-1f3ff-200d-1f9bc\":0,\"1f468-1f3fb-200d-1f9bd\":0,\"1f468-1f3fc-200d-1f9bd\":0,\"1f468-1f3fd-200d-1f9bd\":0,\"1f468-1f3fe-200d-1f9bd\":0,\"1f468-1f3ff-200d-1f9bd\":0,\"1f468-1f3fb-200d-2695\":0,\"1f468-1f3fc-200d-2695\":0,\"1f468-1f3fd-200d-2695\":0,\"1f468-1f3fe-200d-2695\":0,\"1f468-1f3ff-200d-2695\":0,\"1f468-1f3fb-200d-2696\":0,\"1f468-1f3fc-200d-2696\":0,\"1f468-1f3fd-200d-2696\":0,\"1f468-1f3fe-200d-2696\":0,\"1f468-1f3ff-200d-2696\":0,\"1f468-1f3fb-200d-2708\":0,\"1f468-1f3fc-200d-2708\":0,\"1f468-1f3fd-200d-2708\":0,\"1f468-1f3fe-200d-2708\":0,\"1f468-1f3ff-200d-2708\":0,\"1f468-1f3fb\":0,\"1f468-1f3fc\":0,\"1f468-1f3fd\":0,\"1f468-1f3fe\":0,\"1f468-1f3ff\":0,\"1f469-1f3fb-200d-1f33e\":0,\"1f469-1f3fc-200d-1f33e\":0,\"1f469-1f3fd-200d-1f33e\":0,\"1f469-1f3fe-200d-1f33e\":0,\"1f469-1f3ff-200d-1f33e\":0,\"1f469-1f3fb-200d-1f373\":0,\"1f469-1f3fc-200d-1f373\":0,\"1f469-1f3fd-200d-1f373\":0,\"1f469-1f3fe-200d-1f373\":0,\"1f469-1f3ff-200d-1f373\":0,\"1f469-1f3fb-200d-1f37c\":0,\"1f469-1f3fc-200d-1f37c\":0,\"1f469-1f3fd-200d-1f37c\":0,\"1f469-1f3fe-200d-1f37c\":0,\"1f469-1f3ff-200d-1f37c\":0,\"1f469-1f3fb-200d-1f393\":0,\"1f469-1f3fc-200d-1f393\":0,\"1f469-1f3fd-200d-1f393\":0,\"1f469-1f3fe-200d-1f393\":0,\"1f469-1f3ff-200d-1f393\":0,\"1f469-1f3fb-200d-1f3a4\":0,\"1f469-1f3fc-200d-1f3a4\":0,\"1f469-1f3fd-200d-1f3a4\":0,\"1f469-1f3fe-200d-1f3a4\":0,\"1f469-1f3ff-200d-1f3a4\":0,\"1f469-1f3fb-200d-1f3a8\":0,\"1f469-1f3fc-200d-1f3a8\":0,\"1f469-1f3fd-200d-1f3a8\":0,\"1f469-1f3fe-200d-1f3a8\":0,\"1f469-1f3ff-200d-1f3a8\":0,\"1f469-1f3fb-200d-1f3eb\":0,\"1f469-1f3fc-200d-1f3eb\":0,\"1f469-1f3fd-200d-1f3eb\":0,\"1f469-1f3fe-200d-1f3eb\":0,\"1f469-1f3ff-200d-1f3eb\":0,\"1f469-1f3fb-200d-1f3ed\":0,\"1f469-1f3fc-200d-1f3ed\":0,\"1f469-1f3fd-200d-1f3ed\":0,\"1f469-1f3fe-200d-1f3ed\":0,\"1f469-1f3ff-200d-1f3ed\":0,\"1f469-1f3fb-200d-1f4bb\":0,\"1f469-1f3fc-200d-1f4bb\":0,\"1f469-1f3fd-200d-1f4bb\":0,\"1f469-1f3fe-200d-1f4bb\":0,\"1f469-1f3ff-200d-1f4bb\":0,\"1f469-1f3fb-200d-1f4bc\":0,\"1f469-1f3fc-200d-1f4bc\":0,\"1f469-1f3fd-200d-1f4bc\":0,\"1f469-1f3fe-200d-1f4bc\":0,\"1f469-1f3ff-200d-1f4bc\":0,\"1f469-1f3fb-200d-1f527\":0,\"1f469-1f3fc-200d-1f527\":0,\"1f469-1f3fd-200d-1f527\":0,\"1f469-1f3fe-200d-1f527\":0,\"1f469-1f3ff-200d-1f527\":0,\"1f469-1f3fb-200d-1f52c\":0,\"1f469-1f3fc-200d-1f52c\":0,\"1f469-1f3fd-200d-1f52c\":0,\"1f469-1f3fe-200d-1f52c\":0,\"1f469-1f3ff-200d-1f52c\":0,\"1f469-1f3fb-200d-1f680\":0,\"1f469-1f3fc-200d-1f680\":0,\"1f469-1f3fd-200d-1f680\":0,\"1f469-1f3fe-200d-1f680\":0,\"1f469-1f3ff-200d-1f680\":0,\"1f469-1f3fb-200d-1f692\":0,\"1f469-1f3fc-200d-1f692\":0,\"1f469-1f3fd-200d-1f692\":0,\"1f469-1f3fe-200d-1f692\":0,\"1f469-1f3ff-200d-1f692\":0,\"1f469-1f3fb-200d-1f9af\":0,\"1f469-1f3fc-200d-1f9af\":0,\"1f469-1f3fd-200d-1f9af\":0,\"1f469-1f3fe-200d-1f9af\":0,\"1f469-1f3ff-200d-1f9af\":0,\"1f469-1f3fb-200d-1f9b0\":0,\"1f469-1f3fc-200d-1f9b0\":0,\"1f469-1f3fd-200d-1f9b0\":0,\"1f469-1f3fe-200d-1f9b0\":0,\"1f469-1f3ff-200d-1f9b0\":0,\"1f469-1f3fb-200d-1f9b1\":0,\"1f469-1f3fc-200d-1f9b1\":0,\"1f469-1f3fd-200d-1f9b1\":0,\"1f469-1f3fe-200d-1f9b1\":0,\"1f469-1f3ff-200d-1f9b1\":0,\"1f469-1f3fb-200d-1f9b2\":0,\"1f469-1f3fc-200d-1f9b2\":0,\"1f469-1f3fd-200d-1f9b2\":0,\"1f469-1f3fe-200d-1f9b2\":0,\"1f469-1f3ff-200d-1f9b2\":0,\"1f469-1f3fb-200d-1f9b3\":0,\"1f469-1f3fc-200d-1f9b3\":0,\"1f469-1f3fd-200d-1f9b3\":0,\"1f469-1f3fe-200d-1f9b3\":0,\"1f469-1f3ff-200d-1f9b3\":0,\"1f469-1f3fb-200d-1f9bc\":0,\"1f469-1f3fc-200d-1f9bc\":0,\"1f469-1f3fd-200d-1f9bc\":0,\"1f469-1f3fe-200d-1f9bc\":0,\"1f469-1f3ff-200d-1f9bc\":0,\"1f469-1f3fb-200d-1f9bd\":0,\"1f469-1f3fc-200d-1f9bd\":0,\"1f469-1f3fd-200d-1f9bd\":0,\"1f469-1f3fe-200d-1f9bd\":0,\"1f469-1f3ff-200d-1f9bd\":0,\"1f469-1f3fb-200d-2695\":0,\"1f469-1f3fc-200d-2695\":0,\"1f469-1f3fd-200d-2695\":0,\"1f469-1f3fe-200d-2695\":0,\"1f469-1f3ff-200d-2695\":0,\"1f469-1f3fb-200d-2696\":0,\"1f469-1f3fc-200d-2696\":0,\"1f469-1f3fd-200d-2696\":0,\"1f469-1f3fe-200d-2696\":0,\"1f469-1f3ff-200d-2696\":0,\"1f469-1f3fb-200d-2708\":0,\"1f469-1f3fc-200d-2708\":0,\"1f469-1f3fd-200d-2708\":0,\"1f469-1f3fe-200d-2708\":0,\"1f469-1f3ff-200d-2708\":0,\"1f469-1f3fb\":0,\"1f469-1f3fc\":0,\"1f469-1f3fd\":0,\"1f469-1f3fe\":0,\"1f469-1f3ff\":0,\"1f46b-1f3fb\":0,\"1f46b-1f3fc\":0,\"1f46b-1f3fd\":0,\"1f46b-1f3fe\":0,\"1f46b-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46c-1f3fb\":0,\"1f46c-1f3fc\":0,\"1f46c-1f3fd\":0,\"1f46c-1f3fe\":0,\"1f46c-1f3ff\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe\":0,\"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd\":0,\"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe\":0,\"1f46d-1f3fb\":0,\"1f46d-1f3fc\":0,\"1f46d-1f3fd\":0,\"1f46d-1f3fe\":0,\"1f46d-1f3ff\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe\":0,\"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd\":0,\"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe\":0,\"1f46e-1f3fb-200d-2640\":0,\"1f46e-1f3fc-200d-2640\":0,\"1f46e-1f3fd-200d-2640\":0,\"1f46e-1f3fe-200d-2640\":0,\"1f46e-1f3ff-200d-2640\":0,\"1f46e-1f3fb-200d-2642\":0,\"1f46e-1f3fc-200d-2642\":0,\"1f46e-1f3fd-200d-2642\":0,\"1f46e-1f3fe-200d-2642\":0,\"1f46e-1f3ff-200d-2642\":0,\"1f46e-1f3fb\":0,\"1f46e-1f3fc\":0,\"1f46e-1f3fd\":0,\"1f46e-1f3fe\":0,\"1f46e-1f3ff\":0,\"1f470-1f3fb-200d-2640\":0,\"1f470-1f3fc-200d-2640\":0,\"1f470-1f3fd-200d-2640\":0,\"1f470-1f3fe-200d-2640\":0,\"1f470-1f3ff-200d-2640\":0,\"1f470-1f3fb-200d-2642\":0,\"1f470-1f3fc-200d-2642\":0,\"1f470-1f3fd-200d-2642\":0,\"1f470-1f3fe-200d-2642\":0,\"1f470-1f3ff-200d-2642\":0,\"1f470-1f3fb\":0,\"1f470-1f3fc\":0,\"1f470-1f3fd\":0,\"1f470-1f3fe\":0,\"1f470-1f3ff\":0,\"1f471-1f3fb-200d-2640\":0,\"1f471-1f3fc-200d-2640\":0,\"1f471-1f3fd-200d-2640\":0,\"1f471-1f3fe-200d-2640\":0,\"1f471-1f3ff-200d-2640\":0,\"1f471-1f3fb-200d-2642\":0,\"1f471-1f3fc-200d-2642\":0,\"1f471-1f3fd-200d-2642\":0,\"1f471-1f3fe-200d-2642\":0,\"1f471-1f3ff-200d-2642\":0,\"1f471-1f3fb\":0,\"1f471-1f3fc\":0,\"1f471-1f3fd\":0,\"1f471-1f3fe\":0,\"1f471-1f3ff\":0,\"1f472-1f3fb\":0,\"1f472-1f3fc\":0,\"1f472-1f3fd\":0,\"1f472-1f3fe\":0,\"1f472-1f3ff\":0,\"1f473-1f3fb-200d-2640\":0,\"1f473-1f3fc-200d-2640\":0,\"1f473-1f3fd-200d-2640\":0,\"1f473-1f3fe-200d-2640\":0,\"1f473-1f3ff-200d-2640\":0,\"1f473-1f3fb-200d-2642\":0,\"1f473-1f3fc-200d-2642\":0,\"1f473-1f3fd-200d-2642\":0,\"1f473-1f3fe-200d-2642\":0,\"1f473-1f3ff-200d-2642\":0,\"1f473-1f3fb\":0,\"1f473-1f3fc\":0,\"1f473-1f3fd\":0,\"1f473-1f3fe\":0,\"1f473-1f3ff\":0,\"1f474-1f3fb\":0,\"1f474-1f3fc\":0,\"1f474-1f3fd\":0,\"1f474-1f3fe\":0,\"1f474-1f3ff\":0,\"1f475-1f3fb\":0,\"1f475-1f3fc\":0,\"1f475-1f3fd\":0,\"1f475-1f3fe\":0,\"1f475-1f3ff\":0,\"1f476-1f3fb\":0,\"1f476-1f3fc\":0,\"1f476-1f3fd\":0,\"1f476-1f3fe\":0,\"1f476-1f3ff\":0,\"1f477-1f3fb-200d-2640\":0,\"1f477-1f3fc-200d-2640\":0,\"1f477-1f3fd-200d-2640\":0,\"1f477-1f3fe-200d-2640\":0,\"1f477-1f3ff-200d-2640\":0,\"1f477-1f3fb-200d-2642\":0,\"1f477-1f3fc-200d-2642\":0,\"1f477-1f3fd-200d-2642\":0,\"1f477-1f3fe-200d-2642\":0,\"1f477-1f3ff-200d-2642\":0,\"1f477-1f3fb\":0,\"1f477-1f3fc\":0,\"1f477-1f3fd\":0,\"1f477-1f3fe\":0,\"1f477-1f3ff\":0,\"1f478-1f3fb\":0,\"1f478-1f3fc\":0,\"1f478-1f3fd\":0,\"1f478-1f3fe\":0,\"1f478-1f3ff\":0,\"1f47c-1f3fb\":0,\"1f47c-1f3fc\":0,\"1f47c-1f3fd\":0,\"1f47c-1f3fe\":0,\"1f47c-1f3ff\":0,\"1f481-1f3fb-200d-2640\":0,\"1f481-1f3fc-200d-2640\":0,\"1f481-1f3fd-200d-2640\":0,\"1f481-1f3fe-200d-2640\":0,\"1f481-1f3ff-200d-2640\":0,\"1f481-1f3fb-200d-2642\":0,\"1f481-1f3fc-200d-2642\":0,\"1f481-1f3fd-200d-2642\":0,\"1f481-1f3fe-200d-2642\":0,\"1f481-1f3ff-200d-2642\":0,\"1f481-1f3fb\":0,\"1f481-1f3fc\":0,\"1f481-1f3fd\":0,\"1f481-1f3fe\":0,\"1f481-1f3ff\":0,\"1f482-1f3fb-200d-2640\":0,\"1f482-1f3fc-200d-2640\":0,\"1f482-1f3fd-200d-2640\":0,\"1f482-1f3fe-200d-2640\":0,\"1f482-1f3ff-200d-2640\":0,\"1f482-1f3fb-200d-2642\":0,\"1f482-1f3fc-200d-2642\":0,\"1f482-1f3fd-200d-2642\":0,\"1f482-1f3fe-200d-2642\":0,\"1f482-1f3ff-200d-2642\":0,\"1f482-1f3fb\":0,\"1f482-1f3fc\":0,\"1f482-1f3fd\":0,\"1f482-1f3fe\":0,\"1f482-1f3ff\":0,\"1f483-1f3fb\":0,\"1f483-1f3fc\":0,\"1f483-1f3fd\":0,\"1f483-1f3fe\":0,\"1f483-1f3ff\":0,\"1f485-1f3fb\":0,\"1f485-1f3fc\":0,\"1f485-1f3fd\":0,\"1f485-1f3fe\":0,\"1f485-1f3ff\":0,\"1f486-1f3fb-200d-2640\":0,\"1f486-1f3fc-200d-2640\":0,\"1f486-1f3fd-200d-2640\":0,\"1f486-1f3fe-200d-2640\":0,\"1f486-1f3ff-200d-2640\":0,\"1f486-1f3fb-200d-2642\":0,\"1f486-1f3fc-200d-2642\":0,\"1f486-1f3fd-200d-2642\":0,\"1f486-1f3fe-200d-2642\":0,\"1f486-1f3ff-200d-2642\":0,\"1f486-1f3fb\":0,\"1f486-1f3fc\":0,\"1f486-1f3fd\":0,\"1f486-1f3fe\":0,\"1f486-1f3ff\":0,\"1f487-1f3fb-200d-2640\":0,\"1f487-1f3fc-200d-2640\":0,\"1f487-1f3fd-200d-2640\":0,\"1f487-1f3fe-200d-2640\":0,\"1f487-1f3ff-200d-2640\":0,\"1f487-1f3fb-200d-2642\":0,\"1f487-1f3fc-200d-2642\":0,\"1f487-1f3fd-200d-2642\":0,\"1f487-1f3fe-200d-2642\":0,\"1f487-1f3ff-200d-2642\":0,\"1f487-1f3fb\":0,\"1f487-1f3fc\":0,\"1f487-1f3fd\":0,\"1f487-1f3fe\":0,\"1f487-1f3ff\":0,\"1f4aa-1f3fb\":0,\"1f4aa-1f3fc\":0,\"1f4aa-1f3fd\":0,\"1f4aa-1f3fe\":0,\"1f4aa-1f3ff\":0,\"1f574-1f3fb\":0,\"1f574-1f3fc\":0,\"1f574-1f3fd\":0,\"1f574-1f3fe\":0,\"1f574-1f3ff\":0,\"1f575-1f3fb-200d-2640\":0,\"1f575-1f3fc-200d-2640\":0,\"1f575-1f3fd-200d-2640\":0,\"1f575-1f3fe-200d-2640\":0,\"1f575-1f3ff-200d-2640\":0,\"1f575-1f3fb-200d-2642\":0,\"1f575-1f3fc-200d-2642\":0,\"1f575-1f3fd-200d-2642\":0,\"1f575-1f3fe-200d-2642\":0,\"1f575-1f3ff-200d-2642\":0,\"1f575-1f3fb\":0,\"1f575-1f3fc\":0,\"1f575-1f3fd\":0,\"1f575-1f3fe\":0,\"1f575-1f3ff\":0,\"1f57a-1f3fb\":0,\"1f57a-1f3fc\":0,\"1f57a-1f3fd\":0,\"1f57a-1f3fe\":0,\"1f57a-1f3ff\":0,\"1f590-1f3fb\":0,\"1f590-1f3fc\":0,\"1f590-1f3fd\":0,\"1f590-1f3fe\":0,\"1f590-1f3ff\":0,\"1f595-1f3fb\":0,\"1f595-1f3fc\":0,\"1f595-1f3fd\":0,\"1f595-1f3fe\":0,\"1f595-1f3ff\":0,\"1f596-1f3fb\":0,\"1f596-1f3fc\":0,\"1f596-1f3fd\":0,\"1f596-1f3fe\":0,\"1f596-1f3ff\":0,\"1f645-1f3fb-200d-2640\":0,\"1f645-1f3fc-200d-2640\":0,\"1f645-1f3fd-200d-2640\":0,\"1f645-1f3fe-200d-2640\":0,\"1f645-1f3ff-200d-2640\":0,\"1f645-1f3fb-200d-2642\":0,\"1f645-1f3fc-200d-2642\":0,\"1f645-1f3fd-200d-2642\":0,\"1f645-1f3fe-200d-2642\":0,\"1f645-1f3ff-200d-2642\":0,\"1f645-1f3fb\":0,\"1f645-1f3fc\":0,\"1f645-1f3fd\":0,\"1f645-1f3fe\":0,\"1f645-1f3ff\":0,\"1f646-1f3fb-200d-2640\":0,\"1f646-1f3fc-200d-2640\":0,\"1f646-1f3fd-200d-2640\":0,\"1f646-1f3fe-200d-2640\":0,\"1f646-1f3ff-200d-2640\":0,\"1f646-1f3fb-200d-2642\":0,\"1f646-1f3fc-200d-2642\":0,\"1f646-1f3fd-200d-2642\":0,\"1f646-1f3fe-200d-2642\":0,\"1f646-1f3ff-200d-2642\":0,\"1f646-1f3fb\":0,\"1f646-1f3fc\":0,\"1f646-1f3fd\":0,\"1f646-1f3fe\":0,\"1f646-1f3ff\":0,\"1f647-1f3fb-200d-2640\":0,\"1f647-1f3fc-200d-2640\":0,\"1f647-1f3fd-200d-2640\":0,\"1f647-1f3fe-200d-2640\":0,\"1f647-1f3ff-200d-2640\":0,\"1f647-1f3fb-200d-2642\":0,\"1f647-1f3fc-200d-2642\":0,\"1f647-1f3fd-200d-2642\":0,\"1f647-1f3fe-200d-2642\":0,\"1f647-1f3ff-200d-2642\":0,\"1f647-1f3fb\":0,\"1f647-1f3fc\":0,\"1f647-1f3fd\":0,\"1f647-1f3fe\":0,\"1f647-1f3ff\":0,\"1f64b-1f3fb-200d-2640\":0,\"1f64b-1f3fc-200d-2640\":0,\"1f64b-1f3fd-200d-2640\":0,\"1f64b-1f3fe-200d-2640\":0,\"1f64b-1f3ff-200d-2640\":0,\"1f64b-1f3fb-200d-2642\":0,\"1f64b-1f3fc-200d-2642\":0,\"1f64b-1f3fd-200d-2642\":0,\"1f64b-1f3fe-200d-2642\":0,\"1f64b-1f3ff-200d-2642\":0,\"1f64b-1f3fb\":0,\"1f64b-1f3fc\":0,\"1f64b-1f3fd\":0,\"1f64b-1f3fe\":0,\"1f64b-1f3ff\":0,\"1f64c-1f3fb\":0,\"1f64c-1f3fc\":0,\"1f64c-1f3fd\":0,\"1f64c-1f3fe\":0,\"1f64c-1f3ff\":0,\"1f64d-1f3fb-200d-2640\":0,\"1f64d-1f3fc-200d-2640\":0,\"1f64d-1f3fd-200d-2640\":0,\"1f64d-1f3fe-200d-2640\":0,\"1f64d-1f3ff-200d-2640\":0,\"1f64d-1f3fb-200d-2642\":0,\"1f64d-1f3fc-200d-2642\":0,\"1f64d-1f3fd-200d-2642\":0,\"1f64d-1f3fe-200d-2642\":0,\"1f64d-1f3ff-200d-2642\":0,\"1f64d-1f3fb\":0,\"1f64d-1f3fc\":0,\"1f64d-1f3fd\":0,\"1f64d-1f3fe\":0,\"1f64d-1f3ff\":0,\"1f64e-1f3fb-200d-2640\":0,\"1f64e-1f3fc-200d-2640\":0,\"1f64e-1f3fd-200d-2640\":0,\"1f64e-1f3fe-200d-2640\":0,\"1f64e-1f3ff-200d-2640\":0,\"1f64e-1f3fb-200d-2642\":0,\"1f64e-1f3fc-200d-2642\":0,\"1f64e-1f3fd-200d-2642\":0,\"1f64e-1f3fe-200d-2642\":0,\"1f64e-1f3ff-200d-2642\":0,\"1f64e-1f3fb\":0,\"1f64e-1f3fc\":0,\"1f64e-1f3fd\":0,\"1f64e-1f3fe\":0,\"1f64e-1f3ff\":0,\"1f64f-1f3fb\":0,\"1f64f-1f3fc\":0,\"1f64f-1f3fd\":0,\"1f64f-1f3fe\":0,\"1f64f-1f3ff\":0,\"1f6a3-1f3fb-200d-2640\":0,\"1f6a3-1f3fc-200d-2640\":0,\"1f6a3-1f3fd-200d-2640\":0,\"1f6a3-1f3fe-200d-2640\":0,\"1f6a3-1f3ff-200d-2640\":0,\"1f6a3-1f3fb-200d-2642\":0,\"1f6a3-1f3fc-200d-2642\":0,\"1f6a3-1f3fd-200d-2642\":0,\"1f6a3-1f3fe-200d-2642\":0,\"1f6a3-1f3ff-200d-2642\":0,\"1f6a3-1f3fb\":0,\"1f6a3-1f3fc\":0,\"1f6a3-1f3fd\":0,\"1f6a3-1f3fe\":0,\"1f6a3-1f3ff\":0,\"1f6b4-1f3fb-200d-2640\":0,\"1f6b4-1f3fc-200d-2640\":0,\"1f6b4-1f3fd-200d-2640\":0,\"1f6b4-1f3fe-200d-2640\":0,\"1f6b4-1f3ff-200d-2640\":0,\"1f6b4-1f3fb-200d-2642\":0,\"1f6b4-1f3fc-200d-2642\":0,\"1f6b4-1f3fd-200d-2642\":0,\"1f6b4-1f3fe-200d-2642\":0,\"1f6b4-1f3ff-200d-2642\":0,\"1f6b4-1f3fb\":0,\"1f6b4-1f3fc\":0,\"1f6b4-1f3fd\":0,\"1f6b4-1f3fe\":0,\"1f6b4-1f3ff\":0,\"1f6b5-1f3fb-200d-2640\":0,\"1f6b5-1f3fc-200d-2640\":0,\"1f6b5-1f3fd-200d-2640\":0,\"1f6b5-1f3fe-200d-2640\":0,\"1f6b5-1f3ff-200d-2640\":0,\"1f6b5-1f3fb-200d-2642\":0,\"1f6b5-1f3fc-200d-2642\":0,\"1f6b5-1f3fd-200d-2642\":0,\"1f6b5-1f3fe-200d-2642\":0,\"1f6b5-1f3ff-200d-2642\":0,\"1f6b5-1f3fb\":0,\"1f6b5-1f3fc\":0,\"1f6b5-1f3fd\":0,\"1f6b5-1f3fe\":0,\"1f6b5-1f3ff\":0,\"1f6b6-1f3fb-200d-2640\":0,\"1f6b6-1f3fc-200d-2640\":0,\"1f6b6-1f3fd-200d-2640\":0,\"1f6b6-1f3fe-200d-2640\":0,\"1f6b6-1f3ff-200d-2640\":0,\"1f6b6-1f3fb-200d-2642\":0,\"1f6b6-1f3fc-200d-2642\":0,\"1f6b6-1f3fd-200d-2642\":0,\"1f6b6-1f3fe-200d-2642\":0,\"1f6b6-1f3ff-200d-2642\":0,\"1f6b6-1f3fb\":0,\"1f6b6-1f3fc\":0,\"1f6b6-1f3fd\":0,\"1f6b6-1f3fe\":0,\"1f6b6-1f3ff\":0,\"1f6c0-1f3fb\":0,\"1f6c0-1f3fc\":0,\"1f6c0-1f3fd\":0,\"1f6c0-1f3fe\":0,\"1f6c0-1f3ff\":0,\"1f6cc-1f3fb\":0,\"1f6cc-1f3fc\":0,\"1f6cc-1f3fd\":0,\"1f6cc-1f3fe\":0,\"1f6cc-1f3ff\":0,\"1f90c-1f3fb\":0,\"1f90c-1f3fc\":0,\"1f90c-1f3fd\":0,\"1f90c-1f3fe\":0,\"1f90c-1f3ff\":0,\"1f90f-1f3fb\":0,\"1f90f-1f3fc\":0,\"1f90f-1f3fd\":0,\"1f90f-1f3fe\":0,\"1f90f-1f3ff\":0,\"1f918-1f3fb\":0,\"1f918-1f3fc\":0,\"1f918-1f3fd\":0,\"1f918-1f3fe\":0,\"1f918-1f3ff\":0,\"1f919-1f3fb\":0,\"1f919-1f3fc\":0,\"1f919-1f3fd\":0,\"1f919-1f3fe\":0,\"1f919-1f3ff\":0,\"1f91a-1f3fb\":0,\"1f91a-1f3fc\":0,\"1f91a-1f3fd\":0,\"1f91a-1f3fe\":0,\"1f91a-1f3ff\":0,\"1f91b-1f3fb\":0,\"1f91b-1f3fc\":0,\"1f91b-1f3fd\":0,\"1f91b-1f3fe\":0,\"1f91b-1f3ff\":0,\"1f91c-1f3fb\":0,\"1f91c-1f3fc\":0,\"1f91c-1f3fd\":0,\"1f91c-1f3fe\":0,\"1f91c-1f3ff\":0,\"1f91e-1f3fb\":0,\"1f91e-1f3fc\":0,\"1f91e-1f3fd\":0,\"1f91e-1f3fe\":0,\"1f91e-1f3ff\":0,\"1f91f-1f3fb\":0,\"1f91f-1f3fc\":0,\"1f91f-1f3fd\":0,\"1f91f-1f3fe\":0,\"1f91f-1f3ff\":0,\"1f926-1f3fb-200d-2640\":0,\"1f926-1f3fc-200d-2640\":0,\"1f926-1f3fd-200d-2640\":0,\"1f926-1f3fe-200d-2640\":0,\"1f926-1f3ff-200d-2640\":0,\"1f926-1f3fb-200d-2642\":0,\"1f926-1f3fc-200d-2642\":0,\"1f926-1f3fd-200d-2642\":0,\"1f926-1f3fe-200d-2642\":0,\"1f926-1f3ff-200d-2642\":0,\"1f926-1f3fb\":0,\"1f926-1f3fc\":0,\"1f926-1f3fd\":0,\"1f926-1f3fe\":0,\"1f926-1f3ff\":0,\"1f930-1f3fb\":0,\"1f930-1f3fc\":0,\"1f930-1f3fd\":0,\"1f930-1f3fe\":0,\"1f930-1f3ff\":0,\"1f931-1f3fb\":0,\"1f931-1f3fc\":0,\"1f931-1f3fd\":0,\"1f931-1f3fe\":0,\"1f931-1f3ff\":0,\"1f932-1f3fb\":0,\"1f932-1f3fc\":0,\"1f932-1f3fd\":0,\"1f932-1f3fe\":0,\"1f932-1f3ff\":0,\"1f933-1f3fb\":0,\"1f933-1f3fc\":0,\"1f933-1f3fd\":0,\"1f933-1f3fe\":0,\"1f933-1f3ff\":0,\"1f934-1f3fb\":0,\"1f934-1f3fc\":0,\"1f934-1f3fd\":0,\"1f934-1f3fe\":0,\"1f934-1f3ff\":0,\"1f935-1f3fb-200d-2640\":0,\"1f935-1f3fc-200d-2640\":0,\"1f935-1f3fd-200d-2640\":0,\"1f935-1f3fe-200d-2640\":0,\"1f935-1f3ff-200d-2640\":0,\"1f935-1f3fb-200d-2642\":0,\"1f935-1f3fc-200d-2642\":0,\"1f935-1f3fd-200d-2642\":0,\"1f935-1f3fe-200d-2642\":0,\"1f935-1f3ff-200d-2642\":0,\"1f935-1f3fb\":0,\"1f935-1f3fc\":0,\"1f935-1f3fd\":0,\"1f935-1f3fe\":0,\"1f935-1f3ff\":0,\"1f936-1f3fb\":0,\"1f936-1f3fc\":0,\"1f936-1f3fd\":0,\"1f936-1f3fe\":0,\"1f936-1f3ff\":0,\"1f937-1f3fb-200d-2640\":0,\"1f937-1f3fc-200d-2640\":0,\"1f937-1f3fd-200d-2640\":0,\"1f937-1f3fe-200d-2640\":0,\"1f937-1f3ff-200d-2640\":0,\"1f937-1f3fb-200d-2642\":0,\"1f937-1f3fc-200d-2642\":0,\"1f937-1f3fd-200d-2642\":0,\"1f937-1f3fe-200d-2642\":0,\"1f937-1f3ff-200d-2642\":0,\"1f937-1f3fb\":0,\"1f937-1f3fc\":0,\"1f937-1f3fd\":0,\"1f937-1f3fe\":0,\"1f937-1f3ff\":0,\"1f938-1f3fb-200d-2640\":0,\"1f938-1f3fc-200d-2640\":0,\"1f938-1f3fd-200d-2640\":0,\"1f938-1f3fe-200d-2640\":0,\"1f938-1f3ff-200d-2640\":0,\"1f938-1f3fb-200d-2642\":0,\"1f938-1f3fc-200d-2642\":0,\"1f938-1f3fd-200d-2642\":0,\"1f938-1f3fe-200d-2642\":0,\"1f938-1f3ff-200d-2642\":0,\"1f938-1f3fb\":0,\"1f938-1f3fc\":0,\"1f938-1f3fd\":0,\"1f938-1f3fe\":0,\"1f938-1f3ff\":0,\"1f939-1f3fb-200d-2640\":0,\"1f939-1f3fc-200d-2640\":0,\"1f939-1f3fd-200d-2640\":0,\"1f939-1f3fe-200d-2640\":0,\"1f939-1f3ff-200d-2640\":0,\"1f939-1f3fb-200d-2642\":0,\"1f939-1f3fc-200d-2642\":0,\"1f939-1f3fd-200d-2642\":0,\"1f939-1f3fe-200d-2642\":0,\"1f939-1f3ff-200d-2642\":0,\"1f939-1f3fb\":0,\"1f939-1f3fc\":0,\"1f939-1f3fd\":0,\"1f939-1f3fe\":0,\"1f939-1f3ff\":0,\"1f93d-1f3fb-200d-2640\":0,\"1f93d-1f3fc-200d-2640\":0,\"1f93d-1f3fd-200d-2640\":0,\"1f93d-1f3fe-200d-2640\":0,\"1f93d-1f3ff-200d-2640\":0,\"1f93d-1f3fb-200d-2642\":0,\"1f93d-1f3fc-200d-2642\":0,\"1f93d-1f3fd-200d-2642\":0,\"1f93d-1f3fe-200d-2642\":0,\"1f93d-1f3ff-200d-2642\":0,\"1f93d-1f3fb\":0,\"1f93d-1f3fc\":0,\"1f93d-1f3fd\":0,\"1f93d-1f3fe\":0,\"1f93d-1f3ff\":0,\"1f93e-1f3fb-200d-2640\":0,\"1f93e-1f3fc-200d-2640\":0,\"1f93e-1f3fd-200d-2640\":0,\"1f93e-1f3fe-200d-2640\":0,\"1f93e-1f3ff-200d-2640\":0,\"1f93e-1f3fb-200d-2642\":0,\"1f93e-1f3fc-200d-2642\":0,\"1f93e-1f3fd-200d-2642\":0,\"1f93e-1f3fe-200d-2642\":0,\"1f93e-1f3ff-200d-2642\":0,\"1f93e-1f3fb\":0,\"1f93e-1f3fc\":0,\"1f93e-1f3fd\":0,\"1f93e-1f3fe\":0,\"1f93e-1f3ff\":0,\"1f977-1f3fb\":0,\"1f977-1f3fc\":0,\"1f977-1f3fd\":0,\"1f977-1f3fe\":0,\"1f977-1f3ff\":0,\"1f9b5-1f3fb\":0,\"1f9b5-1f3fc\":0,\"1f9b5-1f3fd\":0,\"1f9b5-1f3fe\":0,\"1f9b5-1f3ff\":0,\"1f9b6-1f3fb\":0,\"1f9b6-1f3fc\":0,\"1f9b6-1f3fd\":0,\"1f9b6-1f3fe\":0,\"1f9b6-1f3ff\":0,\"1f9b8-1f3fb-200d-2640\":0,\"1f9b8-1f3fc-200d-2640\":0,\"1f9b8-1f3fd-200d-2640\":0,\"1f9b8-1f3fe-200d-2640\":0,\"1f9b8-1f3ff-200d-2640\":0,\"1f9b8-1f3fb-200d-2642\":0,\"1f9b8-1f3fc-200d-2642\":0,\"1f9b8-1f3fd-200d-2642\":0,\"1f9b8-1f3fe-200d-2642\":0,\"1f9b8-1f3ff-200d-2642\":0,\"1f9b8-1f3fb\":0,\"1f9b8-1f3fc\":0,\"1f9b8-1f3fd\":0,\"1f9b8-1f3fe\":0,\"1f9b8-1f3ff\":0,\"1f9b9-1f3fb-200d-2640\":0,\"1f9b9-1f3fc-200d-2640\":0,\"1f9b9-1f3fd-200d-2640\":0,\"1f9b9-1f3fe-200d-2640\":0,\"1f9b9-1f3ff-200d-2640\":0,\"1f9b9-1f3fb-200d-2642\":0,\"1f9b9-1f3fc-200d-2642\":0,\"1f9b9-1f3fd-200d-2642\":0,\"1f9b9-1f3fe-200d-2642\":0,\"1f9b9-1f3ff-200d-2642\":0,\"1f9b9-1f3fb\":0,\"1f9b9-1f3fc\":0,\"1f9b9-1f3fd\":0,\"1f9b9-1f3fe\":0,\"1f9b9-1f3ff\":0,\"1f9bb-1f3fb\":0,\"1f9bb-1f3fc\":0,\"1f9bb-1f3fd\":0,\"1f9bb-1f3fe\":0,\"1f9bb-1f3ff\":0,\"1f9cd-1f3fb-200d-2640\":0,\"1f9cd-1f3fc-200d-2640\":0,\"1f9cd-1f3fd-200d-2640\":0,\"1f9cd-1f3fe-200d-2640\":0,\"1f9cd-1f3ff-200d-2640\":0,\"1f9cd-1f3fb-200d-2642\":0,\"1f9cd-1f3fc-200d-2642\":0,\"1f9cd-1f3fd-200d-2642\":0,\"1f9cd-1f3fe-200d-2642\":0,\"1f9cd-1f3ff-200d-2642\":0,\"1f9cd-1f3fb\":0,\"1f9cd-1f3fc\":0,\"1f9cd-1f3fd\":0,\"1f9cd-1f3fe\":0,\"1f9cd-1f3ff\":0,\"1f9ce-1f3fb-200d-2640\":0,\"1f9ce-1f3fc-200d-2640\":0,\"1f9ce-1f3fd-200d-2640\":0,\"1f9ce-1f3fe-200d-2640\":0,\"1f9ce-1f3ff-200d-2640\":0,\"1f9ce-1f3fb-200d-2642\":0,\"1f9ce-1f3fc-200d-2642\":0,\"1f9ce-1f3fd-200d-2642\":0,\"1f9ce-1f3fe-200d-2642\":0,\"1f9ce-1f3ff-200d-2642\":0,\"1f9ce-1f3fb\":0,\"1f9ce-1f3fc\":0,\"1f9ce-1f3fd\":0,\"1f9ce-1f3fe\":0,\"1f9ce-1f3ff\":0,\"1f9cf-1f3fb-200d-2640\":0,\"1f9cf-1f3fc-200d-2640\":0,\"1f9cf-1f3fd-200d-2640\":0,\"1f9cf-1f3fe-200d-2640\":0,\"1f9cf-1f3ff-200d-2640\":0,\"1f9cf-1f3fb-200d-2642\":0,\"1f9cf-1f3fc-200d-2642\":0,\"1f9cf-1f3fd-200d-2642\":0,\"1f9cf-1f3fe-200d-2642\":0,\"1f9cf-1f3ff-200d-2642\":0,\"1f9cf-1f3fb\":0,\"1f9cf-1f3fc\":0,\"1f9cf-1f3fd\":0,\"1f9cf-1f3fe\":0,\"1f9cf-1f3ff\":0,\"1f9d1-1f3fb-200d-1f33e\":0,\"1f9d1-1f3fc-200d-1f33e\":0,\"1f9d1-1f3fd-200d-1f33e\":0,\"1f9d1-1f3fe-200d-1f33e\":0,\"1f9d1-1f3ff-200d-1f33e\":0,\"1f9d1-1f3fb-200d-1f373\":0,\"1f9d1-1f3fc-200d-1f373\":0,\"1f9d1-1f3fd-200d-1f373\":0,\"1f9d1-1f3fe-200d-1f373\":0,\"1f9d1-1f3ff-200d-1f373\":0,\"1f9d1-1f3fb-200d-1f37c\":0,\"1f9d1-1f3fc-200d-1f37c\":0,\"1f9d1-1f3fd-200d-1f37c\":0,\"1f9d1-1f3fe-200d-1f37c\":0,\"1f9d1-1f3ff-200d-1f37c\":0,\"1f9d1-1f3fb-200d-1f384\":0,\"1f9d1-1f3fc-200d-1f384\":0,\"1f9d1-1f3fd-200d-1f384\":0,\"1f9d1-1f3fe-200d-1f384\":0,\"1f9d1-1f3ff-200d-1f384\":0,\"1f9d1-1f3fb-200d-1f393\":0,\"1f9d1-1f3fc-200d-1f393\":0,\"1f9d1-1f3fd-200d-1f393\":0,\"1f9d1-1f3fe-200d-1f393\":0,\"1f9d1-1f3ff-200d-1f393\":0,\"1f9d1-1f3fb-200d-1f3a4\":0,\"1f9d1-1f3fc-200d-1f3a4\":0,\"1f9d1-1f3fd-200d-1f3a4\":0,\"1f9d1-1f3fe-200d-1f3a4\":0,\"1f9d1-1f3ff-200d-1f3a4\":0,\"1f9d1-1f3fb-200d-1f3a8\":0,\"1f9d1-1f3fc-200d-1f3a8\":0,\"1f9d1-1f3fd-200d-1f3a8\":0,\"1f9d1-1f3fe-200d-1f3a8\":0,\"1f9d1-1f3ff-200d-1f3a8\":0,\"1f9d1-1f3fb-200d-1f3eb\":0,\"1f9d1-1f3fc-200d-1f3eb\":0,\"1f9d1-1f3fd-200d-1f3eb\":0,\"1f9d1-1f3fe-200d-1f3eb\":0,\"1f9d1-1f3ff-200d-1f3eb\":0,\"1f9d1-1f3fb-200d-1f3ed\":0,\"1f9d1-1f3fc-200d-1f3ed\":0,\"1f9d1-1f3fd-200d-1f3ed\":0,\"1f9d1-1f3fe-200d-1f3ed\":0,\"1f9d1-1f3ff-200d-1f3ed\":0,\"1f9d1-1f3fb-200d-1f4bb\":0,\"1f9d1-1f3fc-200d-1f4bb\":0,\"1f9d1-1f3fd-200d-1f4bb\":0,\"1f9d1-1f3fe-200d-1f4bb\":0,\"1f9d1-1f3ff-200d-1f4bb\":0,\"1f9d1-1f3fb-200d-1f4bc\":0,\"1f9d1-1f3fc-200d-1f4bc\":0,\"1f9d1-1f3fd-200d-1f4bc\":0,\"1f9d1-1f3fe-200d-1f4bc\":0,\"1f9d1-1f3ff-200d-1f4bc\":0,\"1f9d1-1f3fb-200d-1f527\":0,\"1f9d1-1f3fc-200d-1f527\":0,\"1f9d1-1f3fd-200d-1f527\":0,\"1f9d1-1f3fe-200d-1f527\":0,\"1f9d1-1f3ff-200d-1f527\":0,\"1f9d1-1f3fb-200d-1f52c\":0,\"1f9d1-1f3fc-200d-1f52c\":0,\"1f9d1-1f3fd-200d-1f52c\":0,\"1f9d1-1f3fe-200d-1f52c\":0,\"1f9d1-1f3ff-200d-1f52c\":0,\"1f9d1-1f3fb-200d-1f680\":0,\"1f9d1-1f3fc-200d-1f680\":0,\"1f9d1-1f3fd-200d-1f680\":0,\"1f9d1-1f3fe-200d-1f680\":0,\"1f9d1-1f3ff-200d-1f680\":0,\"1f9d1-1f3fb-200d-1f692\":0,\"1f9d1-1f3fc-200d-1f692\":0,\"1f9d1-1f3fd-200d-1f692\":0,\"1f9d1-1f3fe-200d-1f692\":0,\"1f9d1-1f3ff-200d-1f692\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe\":0,\"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff\":0,\"1f9d1-1f3fb-200d-1f9af\":0,\"1f9d1-1f3fc-200d-1f9af\":0,\"1f9d1-1f3fd-200d-1f9af\":0,\"1f9d1-1f3fe-200d-1f9af\":0,\"1f9d1-1f3ff-200d-1f9af\":0,\"1f9d1-1f3fb-200d-1f9b0\":0,\"1f9d1-1f3fc-200d-1f9b0\":0,\"1f9d1-1f3fd-200d-1f9b0\":0,\"1f9d1-1f3fe-200d-1f9b0\":0,\"1f9d1-1f3ff-200d-1f9b0\":0,\"1f9d1-1f3fb-200d-1f9b1\":0,\"1f9d1-1f3fc-200d-1f9b1\":0,\"1f9d1-1f3fd-200d-1f9b1\":0,\"1f9d1-1f3fe-200d-1f9b1\":0,\"1f9d1-1f3ff-200d-1f9b1\":0,\"1f9d1-1f3fb-200d-1f9b2\":0,\"1f9d1-1f3fc-200d-1f9b2\":0,\"1f9d1-1f3fd-200d-1f9b2\":0,\"1f9d1-1f3fe-200d-1f9b2\":0,\"1f9d1-1f3ff-200d-1f9b2\":0,\"1f9d1-1f3fb-200d-1f9b3\":0,\"1f9d1-1f3fc-200d-1f9b3\":0,\"1f9d1-1f3fd-200d-1f9b3\":0,\"1f9d1-1f3fe-200d-1f9b3\":0,\"1f9d1-1f3ff-200d-1f9b3\":0,\"1f9d1-1f3fb-200d-1f9bc\":0,\"1f9d1-1f3fc-200d-1f9bc\":0,\"1f9d1-1f3fd-200d-1f9bc\":0,\"1f9d1-1f3fe-200d-1f9bc\":0,\"1f9d1-1f3ff-200d-1f9bc\":0,\"1f9d1-1f3fb-200d-1f9bd\":0,\"1f9d1-1f3fc-200d-1f9bd\":0,\"1f9d1-1f3fd-200d-1f9bd\":0,\"1f9d1-1f3fe-200d-1f9bd\":0,\"1f9d1-1f3ff-200d-1f9bd\":0,\"1f9d1-1f3fb-200d-2695\":0,\"1f9d1-1f3fc-200d-2695\":0,\"1f9d1-1f3fd-200d-2695\":0,\"1f9d1-1f3fe-200d-2695\":0,\"1f9d1-1f3ff-200d-2695\":0,\"1f9d1-1f3fb-200d-2696\":0,\"1f9d1-1f3fc-200d-2696\":0,\"1f9d1-1f3fd-200d-2696\":0,\"1f9d1-1f3fe-200d-2696\":0,\"1f9d1-1f3ff-200d-2696\":0,\"1f9d1-1f3fb-200d-2708\":0,\"1f9d1-1f3fc-200d-2708\":0,\"1f9d1-1f3fd-200d-2708\":0,\"1f9d1-1f3fe-200d-2708\":0,\"1f9d1-1f3ff-200d-2708\":0,\"1f9d1-1f3fb\":0,\"1f9d1-1f3fc\":0,\"1f9d1-1f3fd\":0,\"1f9d1-1f3fe\":0,\"1f9d1-1f3ff\":0,\"1f9d2-1f3fb\":0,\"1f9d2-1f3fc\":0,\"1f9d2-1f3fd\":0,\"1f9d2-1f3fe\":0,\"1f9d2-1f3ff\":0,\"1f9d3-1f3fb\":0,\"1f9d3-1f3fc\":0,\"1f9d3-1f3fd\":0,\"1f9d3-1f3fe\":0,\"1f9d3-1f3ff\":0,\"1f9d4-1f3fb\":0,\"1f9d4-1f3fc\":0,\"1f9d4-1f3fd\":0,\"1f9d4-1f3fe\":0,\"1f9d4-1f3ff\":0,\"1f9d5-1f3fb\":0,\"1f9d5-1f3fc\":0,\"1f9d5-1f3fd\":0,\"1f9d5-1f3fe\":0,\"1f9d5-1f3ff\":0,\"1f9d6-1f3fb-200d-2640\":0,\"1f9d6-1f3fc-200d-2640\":0,\"1f9d6-1f3fd-200d-2640\":0,\"1f9d6-1f3fe-200d-2640\":0,\"1f9d6-1f3ff-200d-2640\":0,\"1f9d6-1f3fb-200d-2642\":0,\"1f9d6-1f3fc-200d-2642\":0,\"1f9d6-1f3fd-200d-2642\":0,\"1f9d6-1f3fe-200d-2642\":0,\"1f9d6-1f3ff-200d-2642\":0,\"1f9d6-1f3fb\":0,\"1f9d6-1f3fc\":0,\"1f9d6-1f3fd\":0,\"1f9d6-1f3fe\":0,\"1f9d6-1f3ff\":0,\"1f9d7-1f3fb-200d-2640\":0,\"1f9d7-1f3fc-200d-2640\":0,\"1f9d7-1f3fd-200d-2640\":0,\"1f9d7-1f3fe-200d-2640\":0,\"1f9d7-1f3ff-200d-2640\":0,\"1f9d7-1f3fb-200d-2642\":0,\"1f9d7-1f3fc-200d-2642\":0,\"1f9d7-1f3fd-200d-2642\":0,\"1f9d7-1f3fe-200d-2642\":0,\"1f9d7-1f3ff-200d-2642\":0,\"1f9d7-1f3fb\":0,\"1f9d7-1f3fc\":0,\"1f9d7-1f3fd\":0,\"1f9d7-1f3fe\":0,\"1f9d7-1f3ff\":0,\"1f9d8-1f3fb-200d-2640\":0,\"1f9d8-1f3fc-200d-2640\":0,\"1f9d8-1f3fd-200d-2640\":0,\"1f9d8-1f3fe-200d-2640\":0,\"1f9d8-1f3ff-200d-2640\":0,\"1f9d8-1f3fb-200d-2642\":0,\"1f9d8-1f3fc-200d-2642\":0,\"1f9d8-1f3fd-200d-2642\":0,\"1f9d8-1f3fe-200d-2642\":0,\"1f9d8-1f3ff-200d-2642\":0,\"1f9d8-1f3fb\":0,\"1f9d8-1f3fc\":0,\"1f9d8-1f3fd\":0,\"1f9d8-1f3fe\":0,\"1f9d8-1f3ff\":0,\"1f9d9-1f3fb-200d-2640\":0,\"1f9d9-1f3fc-200d-2640\":0,\"1f9d9-1f3fd-200d-2640\":0,\"1f9d9-1f3fe-200d-2640\":0,\"1f9d9-1f3ff-200d-2640\":0,\"1f9d9-1f3fb-200d-2642\":0,\"1f9d9-1f3fc-200d-2642\":0,\"1f9d9-1f3fd-200d-2642\":0,\"1f9d9-1f3fe-200d-2642\":0,\"1f9d9-1f3ff-200d-2642\":0,\"1f9d9-1f3fb\":0,\"1f9d9-1f3fc\":0,\"1f9d9-1f3fd\":0,\"1f9d9-1f3fe\":0,\"1f9d9-1f3ff\":0,\"1f9da-1f3fb-200d-2640\":0,\"1f9da-1f3fc-200d-2640\":0,\"1f9da-1f3fd-200d-2640\":0,\"1f9da-1f3fe-200d-2640\":0,\"1f9da-1f3ff-200d-2640\":0,\"1f9da-1f3fb-200d-2642\":0,\"1f9da-1f3fc-200d-2642\":0,\"1f9da-1f3fd-200d-2642\":0,\"1f9da-1f3fe-200d-2642\":0,\"1f9da-1f3ff-200d-2642\":0,\"1f9da-1f3fb\":0,\"1f9da-1f3fc\":0,\"1f9da-1f3fd\":0,\"1f9da-1f3fe\":0,\"1f9da-1f3ff\":0,\"1f9db-1f3fb-200d-2640\":0,\"1f9db-1f3fc-200d-2640\":0,\"1f9db-1f3fd-200d-2640\":0,\"1f9db-1f3fe-200d-2640\":0,\"1f9db-1f3ff-200d-2640\":0,\"1f9db-1f3fb-200d-2642\":0,\"1f9db-1f3fc-200d-2642\":0,\"1f9db-1f3fd-200d-2642\":0,\"1f9db-1f3fe-200d-2642\":0,\"1f9db-1f3ff-200d-2642\":0,\"1f9db-1f3fb\":0,\"1f9db-1f3fc\":0,\"1f9db-1f3fd\":0,\"1f9db-1f3fe\":0,\"1f9db-1f3ff\":0,\"1f9dc-1f3fb-200d-2640\":0,\"1f9dc-1f3fc-200d-2640\":0,\"1f9dc-1f3fd-200d-2640\":0,\"1f9dc-1f3fe-200d-2640\":0,\"1f9dc-1f3ff-200d-2640\":0,\"1f9dc-1f3fb-200d-2642\":0,\"1f9dc-1f3fc-200d-2642\":0,\"1f9dc-1f3fd-200d-2642\":0,\"1f9dc-1f3fe-200d-2642\":0,\"1f9dc-1f3ff-200d-2642\":0,\"1f9dc-1f3fb\":0,\"1f9dc-1f3fc\":0,\"1f9dc-1f3fd\":0,\"1f9dc-1f3fe\":0,\"1f9dc-1f3ff\":0,\"1f9dd-1f3fb-200d-2640\":0,\"1f9dd-1f3fc-200d-2640\":0,\"1f9dd-1f3fd-200d-2640\":0,\"1f9dd-1f3fe-200d-2640\":0,\"1f9dd-1f3ff-200d-2640\":0,\"1f9dd-1f3fb-200d-2642\":0,\"1f9dd-1f3fc-200d-2642\":0,\"1f9dd-1f3fd-200d-2642\":0,\"1f9dd-1f3fe-200d-2642\":0,\"1f9dd-1f3ff-200d-2642\":0,\"1f9dd-1f3fb\":0,\"1f9dd-1f3fc\":0,\"1f9dd-1f3fd\":0,\"1f9dd-1f3fe\":0,\"1f9dd-1f3ff\":0,\"261d-1f3fb\":0,\"261d-1f3fc\":0,\"261d-1f3fd\":0,\"261d-1f3fe\":0,\"261d-1f3ff\":0,\"26f9-1f3fb-200d-2640\":0,\"26f9-1f3fc-200d-2640\":0,\"26f9-1f3fd-200d-2640\":0,\"26f9-1f3fe-200d-2640\":0,\"26f9-1f3ff-200d-2640\":0,\"26f9-1f3fb-200d-2642\":0,\"26f9-1f3fc-200d-2642\":0,\"26f9-1f3fd-200d-2642\":0,\"26f9-1f3fe-200d-2642\":0,\"26f9-1f3ff-200d-2642\":0,\"26f9-1f3fb\":0,\"26f9-1f3fc\":0,\"26f9-1f3fd\":0,\"26f9-1f3fe\":0,\"26f9-1f3ff\":0,\"270a-1f3fb\":0,\"270a-1f3fc\":0,\"270a-1f3fd\":0,\"270a-1f3fe\":0,\"270a-1f3ff\":0,\"270b-1f3fb\":0,\"270b-1f3fc\":0,\"270b-1f3fd\":0,\"270b-1f3fe\":0,\"270b-1f3ff\":0,\"270c-1f3fb\":0,\"270c-1f3fc\":0,\"270c-1f3fd\":0,\"270c-1f3fe\":0,\"270c-1f3ff\":0,\"270d-1f3fb\":0,\"270d-1f3fc\":0,\"270d-1f3fd\":0,\"270d-1f3fe\":0,\"270d-1f3ff\":0};\r\n\r\n/* Emoji[\"00a9-fe0f\"] = 6362;\r\nEmoji[\"00ae-fe0f\"] = 6363;\r\nEmoji[\"2122-fe0f\"] = 6364; */\r\n\r\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\r\nexport const TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\r\n\r\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\r\nexport const LatinizeMap: {[k: string]: string} = {'Á': 'A','Ă': 'A','Ắ': 'A','Ặ': 'A','Ằ': 'A','Ẳ': 'A','Ẵ': 'A','Ǎ': 'A','Â': 'A','Ấ': 'A','Ậ': 'A','Ầ': 'A','Ẩ': 'A','Ẫ': 'A','Ä': 'A','Ǟ': 'A','Ȧ': 'A','Ǡ': 'A','Ạ': 'A','Ȁ': 'A','À': 'A','Ả': 'A','Ȃ': 'A','Ā': 'A','Ą': 'A','Å': 'A','Ǻ': 'A','Ḁ': 'A','Ⱥ': 'A','Ã': 'A','Ꜳ': 'AA','Æ': 'AE','Ǽ': 'AE','Ǣ': 'AE','Ꜵ': 'AO','Ꜷ': 'AU','Ꜹ': 'AV','Ꜻ': 'AV','Ꜽ': 'AY','Ḃ': 'B','Ḅ': 'B','Ɓ': 'B','Ḇ': 'B','Ƀ': 'B','Ƃ': 'B','Ć': 'C','Č': 'C','Ç': 'C','Ḉ': 'C','Ĉ': 'C','Ċ': 'C','Ƈ': 'C','Ȼ': 'C','Ď': 'D','Ḑ': 'D','Ḓ': 'D','Ḋ': 'D','Ḍ': 'D','Ɗ': 'D','Ḏ': 'D','Dz': 'D','Dž': 'D','Đ': 'D','Ƌ': 'D','DZ': 'DZ','DŽ': 'DZ','É': 'E','Ĕ': 'E','Ě': 'E','Ȩ': 'E','Ḝ': 'E','Ê': 'E','Ế': 'E','Ệ': 'E','Ề': 'E','Ể': 'E','Ễ': 'E','Ḙ': 'E','Ë': 'E','Ė': 'E','Ẹ': 'E','Ȅ': 'E','È': 'E','Ẻ': 'E','Ȇ': 'E','Ē': 'E','Ḗ': 'E','Ḕ': 'E','Ę': 'E','Ɇ': 'E','Ẽ': 'E','Ḛ': 'E','Ꝫ': 'ET','Ḟ': 'F','Ƒ': 'F','Ǵ': 'G','Ğ': 'G','Ǧ': 'G','Ģ': 'G','Ĝ': 'G','Ġ': 'G','Ɠ': 'G','Ḡ': 'G','Ǥ': 'G','Ḫ': 'H','Ȟ': 'H','Ḩ': 'H','Ĥ': 'H','Ⱨ': 'H','Ḧ': 'H','Ḣ': 'H','Ḥ': 'H','Ħ': 'H','Í': 'I','Ĭ': 'I','Ǐ': 'I','Î': 'I','Ï': 'I','Ḯ': 'I','İ': 'I','Ị': 'I','Ȉ': 'I','Ì': 'I','Ỉ': 'I','Ȋ': 'I','Ī': 'I','Į': 'I','Ɨ': 'I','Ĩ': 'I','Ḭ': 'I','Ꝺ': 'D','Ꝼ': 'F','Ᵹ': 'G','Ꞃ': 'R','Ꞅ': 'S','Ꞇ': 'T','Ꝭ': 'IS','Ĵ': 'J','Ɉ': 'J','Ḱ': 'K','Ǩ': 'K','Ķ': 'K','Ⱪ': 'K','Ꝃ': 'K','Ḳ': 'K','Ƙ': 'K','Ḵ': 'K','Ꝁ': 'K','Ꝅ': 'K','Ĺ': 'L','Ƚ': 'L','Ľ': 'L','Ļ': 'L','Ḽ': 'L','Ḷ': 'L','Ḹ': 'L','Ⱡ': 'L','Ꝉ': 'L','Ḻ': 'L','Ŀ': 'L','Ɫ': 'L','Lj': 'L','Ł': 'L','LJ': 'LJ','Ḿ': 'M','Ṁ': 'M','Ṃ': 'M','Ɱ': 'M','Ń': 'N','Ň': 'N','Ņ': 'N','Ṋ': 'N','Ṅ': 'N','Ṇ': 'N','Ǹ': 'N','Ɲ': 'N','Ṉ': 'N','Ƞ': 'N','Nj': 'N','Ñ': 'N','NJ': 'NJ','Ó': 'O','Ŏ': 'O','Ǒ': 'O','Ô': 'O','Ố': 'O','Ộ': 'O','Ồ': 'O','Ổ': 'O','Ỗ': 'O','Ö': 'O','Ȫ': 'O','Ȯ': 'O','Ȱ': 'O','Ọ': 'O','Ő': 'O','Ȍ': 'O','Ò': 'O','Ỏ': 'O','Ơ': 'O','Ớ': 'O','Ợ': 'O','Ờ': 'O','Ở': 'O','Ỡ': 'O','Ȏ': 'O','Ꝋ': 'O','Ꝍ': 'O','Ō': 'O','Ṓ': 'O','Ṑ': 'O','Ɵ': 'O','Ǫ': 'O','Ǭ': 'O','Ø': 'O','Ǿ': 'O','Õ': 'O','Ṍ': 'O','Ṏ': 'O','Ȭ': 'O','Ƣ': 'OI','Ꝏ': 'OO','Ɛ': 'E','Ɔ': 'O','Ȣ': 'OU','Ṕ': 'P','Ṗ': 'P','Ꝓ': 'P','Ƥ': 'P','Ꝕ': 'P','Ᵽ': 'P','Ꝑ': 'P','Ꝙ': 'Q','Ꝗ': 'Q','Ŕ': 'R','Ř': 'R','Ŗ': 'R','Ṙ': 'R','Ṛ': 'R','Ṝ': 'R','Ȑ': 'R','Ȓ': 'R','Ṟ': 'R','Ɍ': 'R','Ɽ': 'R','Ꜿ': 'C','Ǝ': 'E','Ś': 'S','Ṥ': 'S','Š': 'S','Ṧ': 'S','Ş': 'S','Ŝ': 'S','Ș': 'S','Ṡ': 'S','Ṣ': 'S','Ṩ': 'S','ẞ': 'SS','Ť': 'T','Ţ': 'T','Ṱ': 'T','Ț': 'T','Ⱦ': 'T','Ṫ': 'T','Ṭ': 'T','Ƭ': 'T','Ṯ': 'T','Ʈ': 'T','Ŧ': 'T','Ɐ': 'A','Ꞁ': 'L','Ɯ': 'M','Ʌ': 'V','Ꜩ': 'TZ','Ú': 'U','Ŭ': 'U','Ǔ': 'U','Û': 'U','Ṷ': 'U','Ü': 'U','Ǘ': 'U','Ǚ': 'U','Ǜ': 'U','Ǖ': 'U','Ṳ': 'U','Ụ': 'U','Ű': 'U','Ȕ': 'U','Ù': 'U','Ủ': 'U','Ư': 'U','Ứ': 'U','Ự': 'U','Ừ': 'U','Ử': 'U','Ữ': 'U','Ȗ': 'U','Ū': 'U','Ṻ': 'U','Ų': 'U','Ů': 'U','Ũ': 'U','Ṹ': 'U','Ṵ': 'U','Ꝟ': 'V','Ṿ': 'V','Ʋ': 'V','Ṽ': 'V','Ꝡ': 'VY','Ẃ': 'W','Ŵ': 'W','Ẅ': 'W','Ẇ': 'W','Ẉ': 'W','Ẁ': 'W','Ⱳ': 'W','Ẍ': 'X','Ẋ': 'X','Ý': 'Y','Ŷ': 'Y','Ÿ': 'Y','Ẏ': 'Y','Ỵ': 'Y','Ỳ': 'Y','Ƴ': 'Y','Ỷ': 'Y','Ỿ': 'Y','Ȳ': 'Y','Ɏ': 'Y','Ỹ': 'Y','Ź': 'Z','Ž': 'Z','Ẑ': 'Z','Ⱬ': 'Z','Ż': 'Z','Ẓ': 'Z','Ȥ': 'Z','Ẕ': 'Z','Ƶ': 'Z','IJ': 'IJ','Œ': 'OE','ᴀ': 'A','ᴁ': 'AE','ʙ': 'B','ᴃ': 'B','ᴄ': 'C','ᴅ': 'D','ᴇ': 'E','ꜰ': 'F','ɢ': 'G','ʛ': 'G','ʜ': 'H','ɪ': 'I','ʁ': 'R','ᴊ': 'J','ᴋ': 'K','ʟ': 'L','ᴌ': 'L','ᴍ': 'M','ɴ': 'N','ᴏ': 'O','ɶ': 'OE','ᴐ': 'O','ᴕ': 'OU','ᴘ': 'P','ʀ': 'R','ᴎ': 'N','ᴙ': 'R','ꜱ': 'S','ᴛ': 'T','ⱻ': 'E','ᴚ': 'R','ᴜ': 'U','ᴠ': 'V','ᴡ': 'W','ʏ': 'Y','ᴢ': 'Z','á': 'a','ă': 'a','ắ': 'a','ặ': 'a','ằ': 'a','ẳ': 'a','ẵ': 'a','ǎ': 'a','â': 'a','ấ': 'a','ậ': 'a','ầ': 'a','ẩ': 'a','ẫ': 'a','ä': 'a','ǟ': 'a','ȧ': 'a','ǡ': 'a','ạ': 'a','ȁ': 'a','à': 'a','ả': 'a','ȃ': 'a','ā': 'a','ą': 'a','ᶏ': 'a','ẚ': 'a','å': 'a','ǻ': 'a','ḁ': 'a','ⱥ': 'a','ã': 'a','ꜳ': 'aa','æ': 'ae','ǽ': 'ae','ǣ': 'ae','ꜵ': 'ao','ꜷ': 'au','ꜹ': 'av','ꜻ': 'av','ꜽ': 'ay','ḃ': 'b','ḅ': 'b','ɓ': 'b','ḇ': 'b','ᵬ': 'b','ᶀ': 'b','ƀ': 'b','ƃ': 'b','ɵ': 'o','ć': 'c','č': 'c','ç': 'c','ḉ': 'c','ĉ': 'c','ɕ': 'c','ċ': 'c','ƈ': 'c','ȼ': 'c','ď': 'd','ḑ': 'd','ḓ': 'd','ȡ': 'd','ḋ': 'd','ḍ': 'd','ɗ': 'd','ᶑ': 'd','ḏ': 'd','ᵭ': 'd','ᶁ': 'd','đ': 'd','ɖ': 'd','ƌ': 'd','ı': 'i','ȷ': 'j','ɟ': 'j','ʄ': 'j','dz': 'dz','dž': 'dz','é': 'e','ĕ': 'e','ě': 'e','ȩ': 'e','ḝ': 'e','ê': 'e','ế': 'e','ệ': 'e','ề': 'e','ể': 'e','ễ': 'e','ḙ': 'e','ë': 'e','ė': 'e','ẹ': 'e','ȅ': 'e','è': 'e','ẻ': 'e','ȇ': 'e','ē': 'e','ḗ': 'e','ḕ': 'e','ⱸ': 'e','ę': 'e','ᶒ': 'e','ɇ': 'e','ẽ': 'e','ḛ': 'e','ꝫ': 'et','ḟ': 'f','ƒ': 'f','ᵮ': 'f','ᶂ': 'f','ǵ': 'g','ğ': 'g','ǧ': 'g','ģ': 'g','ĝ': 'g','ġ': 'g','ɠ': 'g','ḡ': 'g','ᶃ': 'g','ǥ': 'g','ḫ': 'h','ȟ': 'h','ḩ': 'h','ĥ': 'h','ⱨ': 'h','ḧ': 'h','ḣ': 'h','ḥ': 'h','ɦ': 'h','ẖ': 'h','ħ': 'h','ƕ': 'hv','í': 'i','ĭ': 'i','ǐ': 'i','î': 'i','ï': 'i','ḯ': 'i','ị': 'i','ȉ': 'i','ì': 'i','ỉ': 'i','ȋ': 'i','ī': 'i','į': 'i','ᶖ': 'i','ɨ': 'i','ĩ': 'i','ḭ': 'i','ꝺ': 'd','ꝼ': 'f','ᵹ': 'g','ꞃ': 'r','ꞅ': 's','ꞇ': 't','ꝭ': 'is','ǰ': 'j','ĵ': 'j','ʝ': 'j','ɉ': 'j','ḱ': 'k','ǩ': 'k','ķ': 'k','ⱪ': 'k','ꝃ': 'k','ḳ': 'k','ƙ': 'k','ḵ': 'k','ᶄ': 'k','ꝁ': 'k','ꝅ': 'k','ĺ': 'l','ƚ': 'l','ɬ': 'l','ľ': 'l','ļ': 'l','ḽ': 'l','ȴ': 'l','ḷ': 'l','ḹ': 'l','ⱡ': 'l','ꝉ': 'l','ḻ': 'l','ŀ': 'l','ɫ': 'l','ᶅ': 'l','ɭ': 'l','ł': 'l','lj': 'lj','ſ': 's','ẜ': 's','ẛ': 's','ẝ': 's','ḿ': 'm','ṁ': 'm','ṃ': 'm','ɱ': 'm','ᵯ': 'm','ᶆ': 'm','ń': 'n','ň': 'n','ņ': 'n','ṋ': 'n','ȵ': 'n','ṅ': 'n','ṇ': 'n','ǹ': 'n','ɲ': 'n','ṉ': 'n','ƞ': 'n','ᵰ': 'n','ᶇ': 'n','ɳ': 'n','ñ': 'n','nj': 'nj','ó': 'o','ŏ': 'o','ǒ': 'o','ô': 'o','ố': 'o','ộ': 'o','ồ': 'o','ổ': 'o','ỗ': 'o','ö': 'o','ȫ': 'o','ȯ': 'o','ȱ': 'o','ọ': 'o','ő': 'o','ȍ': 'o','ò': 'o','ỏ': 'o','ơ': 'o','ớ': 'o','ợ': 'o','ờ': 'o','ở': 'o','ỡ': 'o','ȏ': 'o','ꝋ': 'o','ꝍ': 'o','ⱺ': 'o','ō': 'o','ṓ': 'o','ṑ': 'o','ǫ': 'o','ǭ': 'o','ø': 'o','ǿ': 'o','õ': 'o','ṍ': 'o','ṏ': 'o','ȭ': 'o','ƣ': 'oi','ꝏ': 'oo','ɛ': 'e','ᶓ': 'e','ɔ': 'o','ᶗ': 'o','ȣ': 'ou','ṕ': 'p','ṗ': 'p','ꝓ': 'p','ƥ': 'p','ᵱ': 'p','ᶈ': 'p','ꝕ': 'p','ᵽ': 'p','ꝑ': 'p','ꝙ': 'q','ʠ': 'q','ɋ': 'q','ꝗ': 'q','ŕ': 'r','ř': 'r','ŗ': 'r','ṙ': 'r','ṛ': 'r','ṝ': 'r','ȑ': 'r','ɾ': 'r','ᵳ': 'r','ȓ': 'r','ṟ': 'r','ɼ': 'r','ᵲ': 'r','ᶉ': 'r','ɍ': 'r','ɽ': 'r','ↄ': 'c','ꜿ': 'c','ɘ': 'e','ɿ': 'r','ś': 's','ṥ': 's','š': 's','ṧ': 's','ş': 's','ŝ': 's','ș': 's','ṡ': 's','ṣ': 's','ṩ': 's','ʂ': 's','ᵴ': 's','ᶊ': 's','ȿ': 's','ɡ': 'g','ß': 'ss','ᴑ': 'o','ᴓ': 'o','ᴝ': 'u','ť': 't','ţ': 't','ṱ': 't','ț': 't','ȶ': 't','ẗ': 't','ⱦ': 't','ṫ': 't','ṭ': 't','ƭ': 't','ṯ': 't','ᵵ': 't','ƫ': 't','ʈ': 't','ŧ': 't','ᵺ': 'th','ɐ': 'a','ᴂ': 'ae','ǝ': 'e','ᵷ': 'g','ɥ': 'h','ʮ': 'h','ʯ': 'h','ᴉ': 'i','ʞ': 'k','ꞁ': 'l','ɯ': 'm','ɰ': 'm','ᴔ': 'oe','ɹ': 'r','ɻ': 'r','ɺ': 'r','ⱹ': 'r','ʇ': 't','ʌ': 'v','ʍ': 'w','ʎ': 'y','ꜩ': 'tz','ú': 'u','ŭ': 'u','ǔ': 'u','û': 'u','ṷ': 'u','ü': 'u','ǘ': 'u','ǚ': 'u','ǜ': 'u','ǖ': 'u','ṳ': 'u','ụ': 'u','ű': 'u','ȕ': 'u','ù': 'u','ủ': 'u','ư': 'u','ứ': 'u','ự': 'u','ừ': 'u','ử': 'u','ữ': 'u','ȗ': 'u','ū': 'u','ṻ': 'u','ų': 'u','ᶙ': 'u','ů': 'u','ũ': 'u','ṹ': 'u','ṵ': 'u','ᵫ': 'ue','ꝸ': 'um','ⱴ': 'v','ꝟ': 'v','ṿ': 'v','ʋ': 'v','ᶌ': 'v','ⱱ': 'v','ṽ': 'v','ꝡ': 'vy','ẃ': 'w','ŵ': 'w','ẅ': 'w','ẇ': 'w','ẉ': 'w','ẁ': 'w','ⱳ': 'w','ẘ': 'w','ẍ': 'x','ẋ': 'x','ᶍ': 'x','ý': 'y','ŷ': 'y','ÿ': 'y','ẏ': 'y','ỵ': 'y','ỳ': 'y','ƴ': 'y','ỷ': 'y','ỿ': 'y','ȳ': 'y','ẙ': 'y','ɏ': 'y','ỹ': 'y','ź': 'z','ž': 'z','ẑ': 'z','ʑ': 'z','ⱬ': 'z','ż': 'z','ẓ': 'z','ȥ': 'z','ẕ': 'z','ᵶ': 'z','ᶎ': 'z','ʐ': 'z','ƶ': 'z','ɀ': 'z','ff': 'ff','ffi': 'ffi','ffl': 'ffl','fi': 'fi','fl': 'fl','ij': 'ij','œ': 'oe','st': 'st','ₐ': 'a','ₑ': 'e','ᵢ': 'i','ⱼ': 'j','ₒ': 'o','ᵣ': 'r','ᵤ': 'u','ᵥ': 'v','ₓ': 'x','Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\r\n\r\nconst Config = {\r\n Emoji,\r\n LatinizeMap,\r\n TLD,\r\n MediaSizes: mediaSizes\r\n};\r\nMOUNT_CLASS_TO.Config = Config;\r\nexport default Config;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport { logger } from \"../logger\";\nimport rootScope from \"../rootScope\";\nimport sessionStorage from \"../sessionStorage\";\nimport apiManager from \"./mtprotoworker\";\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nconst CHECK_INSTANCE_INTERVAL = 5000; \nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\n\nexport class SingleInstance {\n private instanceID: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: boolean;\n private initial: boolean;\n private log = logger('INSTANCE');\n\n public start() {\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n this.reset();\n //IdleManager.start();\n\n rootScope.addEventListener('idle', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n public reset() {\n this.instanceID = nextRandomUint(32);\n this.masterInstance = false;\n if(this.deactivateTimeout) clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n this.deactivated = false;\n this.initial = false;\n }\n\n public clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n rootScope.dispatchEvent('instance_activated');\n }\n }\n\n public deactivateInstance = () => {\n if(this.masterInstance || this.deactivated) {\n return false;\n }\n\n this.log('deactivate');\n this.deactivateTimeout = 0;\n this.deactivated = true;\n this.clearInstance();\n //$modalStack.dismissAll();\n\n //document.title = _('inactive_tab_title_raw')\n\n rootScope.idle.deactivated = true;\n rootScope.dispatchEvent('instance_deactivated');\n };\n\n public checkInstance = (idle = rootScope.idle && rootScope.idle.isIDLE) => {\n if(this.deactivated) {\n return false;\n }\n \n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceID, \n idle, \n time\n };\n\n sessionStorage.get('xt_instance', false).then((curInstance: AppInstance) => {\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceID ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n apiManager.startAll();\n if(!this.initial) {\n this.initial = true;\n } else {\n this.log.warn('now master instance', newInstance);\n }\n\n this.masterInstance = true;\n }\n\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n } else {\n if(this.masterInstance) {\n apiManager.stopAll();\n this.log.warn('now idle instance', newInstance);\n if(!this.deactivateTimeout) {\n this.deactivateTimeout = window.setTimeout(this.deactivateInstance, DEACTIVATE_TIMEOUT);\n }\n\n this.masterInstance = false;\n }\n }\n });\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG, { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { deepEqual, safeAssign } from \"../helpers/object\";\nimport { capitalizeFirstLetter } from \"../helpers/string\";\nimport type lang from \"../lang\";\nimport type langSign from \"../langSign\";\nimport type { State } from \"./appManagers/appStateManager\";\nimport { HelpCountriesList, HelpCountry, LangPackDifference, LangPackString } from \"../layer\";\nimport apiManager from \"./mtproto/mtprotoworker\";\nimport stateStorage from \"./stateStorage\";\nimport App from \"../config/app\";\nimport rootScope from \"./rootScope\";\nimport RichTextProcessor from \"./richtextprocessor\";\nimport { IS_MOBILE } from \"../environment/userAgent\";\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n \"messageActionChatCreate\": \"ActionCreateGroup\",\n \"messageActionChatCreateYou\": \"ActionYouCreateGroup\",\n\t\"messageActionChatEditTitle\": \"ActionChangedTitle\",\n\t\"messageActionChatEditPhoto\": \"ActionChangedPhoto\",\n\t\"messageActionChatEditVideo\": \"ActionChangedVideo\",\n\t\"messageActionChatDeletePhoto\": \"ActionRemovedPhoto\",\n\t\"messageActionChatReturn\": \"ActionAddUserSelf\",\n\t\"messageActionChatReturnYou\": \"ActionAddUserSelfYou\",\n\t\"messageActionChatJoined\": \"ActionAddUserSelfMega\",\n\t\"messageActionChatJoinedYou\": \"ChannelMegaJoined\",\n \"messageActionChatAddUser\": \"ActionAddUser\",\n \"messageActionChatAddUsers\": \"ActionAddUser\",\n\t\"messageActionChatLeave\": \"ActionLeftUser\",\n\t\"messageActionChatLeaveYou\": \"YouLeft\",\n\t\"messageActionChatDeleteUser\": \"ActionKickUser\",\n\t\"messageActionChatJoinedByLink\": \"ActionInviteUser\",\n \"messageActionPinMessage\": \"Chat.Service.Group.UpdatedPinnedMessage\",\n \"messageActionContactSignUp\": \"Chat.Service.PeerJoinedTelegram\",\n\t\"messageActionChannelCreate\": \"ActionCreateChannel\",\n\t\"messageActionChannelEditTitle\": \"Chat.Service.Channel.UpdatedTitle\",\n\t\"messageActionChannelEditPhoto\": \"Chat.Service.Channel.UpdatedPhoto\",\n\t\"messageActionChannelEditVideo\": \"Chat.Service.Channel.UpdatedVideo\",\n \"messageActionChannelDeletePhoto\": \"Chat.Service.Channel.RemovedPhoto\",\n \"messageActionHistoryClear\": \"HistoryCleared\",\n\t\"messageActionDiscussionStarted\": \"DiscussionStarted\",\n\n \"messageActionChannelMigrateFrom\": \"ActionMigrateFromGroup\",\n\n \"messageActionPhoneCall.video_in_ok\": \"ChatList.Service.VideoCall.incoming\",\n\t\"messageActionPhoneCall.video_out_ok\": \"ChatList.Service.VideoCall.outgoing\",\n\t\"messageActionPhoneCall.video_missed\": \"ChatList.Service.VideoCall.Missed\",\n\t\"messageActionPhoneCall.video_cancelled\": \"ChatList.Service.VideoCall.Cancelled\",\n \"messageActionPhoneCall.in_ok\": \"ChatList.Service.Call.incoming\",\n\t\"messageActionPhoneCall.out_ok\": \"ChatList.Service.Call.outgoing\",\n\t\"messageActionPhoneCall.missed\": \"ChatList.Service.Call.Missed\",\n\t\"messageActionPhoneCall.cancelled\": \"ChatList.Service.Call.Cancelled\",\n\n\t\"messageActionGroupCall.started\": \"Chat.Service.VoiceChatStarted.Channel\",\n\t\"messageActionGroupCall.started_by\": \"Chat.Service.VoiceChatStarted\",\n\t\"messageActionGroupCall.started_byYou\": \"Chat.Service.VoiceChatStartedYou\",\n\t\"messageActionGroupCall.ended\": \"Chat.Service.VoiceChatFinished.Channel\",\n\t\"messageActionGroupCall.ended_by\": \"Chat.Service.VoiceChatFinished\",\n\t\"messageActionGroupCall.ended_byYou\": \"Chat.Service.VoiceChatFinishedYou\",\n\n\t\"messageActionBotAllowed\": \"Chat.Service.BotPermissionAllowed\"\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n\texport const strings: Map = new Map();\n\texport const countriesList: HelpCountry[] = [];\n\tlet pluralRules: Intl.PluralRules;\n\n\tlet cacheLangPackPromise: Promise;\n\texport let lastRequestedLangCode: string;\n\texport let lastAppliedLangCode: string;\n\texport let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n\texport function getCacheLangPack(): Promise {\n\t\tif(cacheLangPackPromise) return cacheLangPackPromise;\n\t\treturn cacheLangPackPromise = Promise.all([\n\t\t\tstateStorage.get('langPack') as Promise,\n\t\t\tpolyfillPromise\n\t\t]).then(([langPack]) => {\n\t\t\tif(!langPack/* || true */) {\n\t\t\t\treturn loadLocalLangPack();\n\t\t\t} else if(DEBUG && false) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t}/* else if(langPack.appVersion !== App.langPackVersion) {\n\t\t\t\treturn getLangPack(langPack.lang_code);\n\t\t\t} */\n\t\t\t\n\t\t\tif(!lastRequestedLangCode) {\n\t\t\t\tlastRequestedLangCode = langPack.lang_code;\n\t\t\t}\n\t\t\t\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t}).finally(() => {\n\t\t\tcacheLangPackPromise = undefined;\n\t\t});\n\t}\n\n export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\n\n if(haveToUpdate) {\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach(element => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n\texport function loadLocalLangPack() {\n\t\tconst defaultCode = App.langPackCode;\n\t\tlastRequestedLangCode = defaultCode;\n\t\treturn Promise.all([\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\timport('../countries')\n\t\t]).then(([lang, langSign, countries]) => {\n\t\t\tconst strings: LangPackString[] = [];\n\t\t\tformatLocalStrings(lang.default, strings);\n\t\t\tformatLocalStrings(langSign.default, strings);\n\n\t\t\tconst langPack: LangPackDifference = {\n\t\t\t\t_: 'langPackDifference',\n\t\t\t\tfrom_version: 0,\n\t\t\t\tlang_code: defaultCode,\n\t\t\t\tstrings,\n\t\t\t\tversion: 0,\n\t\t\t\tlocal: true,\n\t\t\t\tcountries: countries.default\n\t\t\t};\n\t\t\treturn saveLangPack(langPack);\n\t\t});\n\t}\n\n\texport function loadLangPack(langCode: string) {\n\t\trequestedServerLanguage = true;\n\t\treturn Promise.all([\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: App.langPack\n\t\t\t}),\n\t\t\tapiManager.invokeApiCacheable('langpack.getLangPack', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\tlang_pack: 'android'\n\t\t\t}),\n\t\t\timport('../lang'),\n\t\t\timport('../langSign'),\n\t\t\tapiManager.invokeApiCacheable('help.getCountriesList', {\n\t\t\t\tlang_code: langCode,\n\t\t\t\thash: 0\n\t\t\t}) as Promise,\n\t\t\tpolyfillPromise,\n\t\t]);\n\t}\n\n\texport function getStrings(langCode: string, strings: string[]) {\n\t\treturn apiManager.invokeApi('langpack.getStrings', {\n\t\t\tlang_pack: App.langPack,\n\t\t\tlang_code: langCode,\n\t\t\tkeys: strings\n\t\t});\n\t}\n\n\texport function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n\t\tfor(const i in strings) {\n\t\t\t// @ts-ignore\n\t\t\tconst v = strings[i];\n\t\t\tif(typeof(v) === 'string') {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\tkey: i,\n\t\t\t\t\tvalue: v\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tpushTo.push({\n\t\t\t\t\t_: 'langPackStringPluralized',\n\t\t\t\t\tkey: i,\n\t\t\t\t\t...v\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn pushTo;\n\t}\n\n\texport function getLangPack(langCode: string) {\n\t\tlastRequestedLangCode = langCode;\n\t\treturn loadLangPack(langCode).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n\t\t\tlet strings: LangPackString[] = [];\n\n\t\t\t[localLangPack1, localLangPack2].forEach(l => {\n\t\t\t\tformatLocalStrings(l.default as any, strings);\n\t\t\t});\n\n\t\t\tstrings = strings.concat(langPack1.strings);\n\n\t\t\tfor(const string of langPack2.strings) {\n\t\t\t\tstrings.push(string);\n\t\t\t}\n\n\t\t\tlangPack1.strings = strings;\n\t\t\tlangPack1.countries = countries;\n\t\t\treturn saveLangPack(langPack1);\n\t\t});\n\t}\n\n\texport function saveLangPack(langPack: LangPackDifference) {\n\t\tlangPack.appVersion = App.langPackVersion;\n\n\t\treturn stateStorage.set({langPack}).then(() => {\n\t\t\tapplyLangPack(langPack);\n\t\t\treturn langPack;\n\t\t});\n\t}\n\n\texport const polyfillPromise = (function checkIfPolyfillNeeded() {\n\t\tif(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n\t\t\treturn Promise.resolve();\n\t\t} else {\n\t\t\treturn import('./pluralPolyfill').then((_Intl) => {\n\t\t\t\t(window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n\t\t\t});\n\t\t}\n\t})();\n\t\n\texport function applyLangPack(langPack: LangPackDifference) {\n\t\tif(langPack.lang_code !== lastRequestedLangCode) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code);\n\t\t} catch(err) {\n\t\t\tconsole.error('pluralRules error', err);\n\t\t\tpluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n\t\t}\n\n\t\tstrings.clear();\n\n\t\tfor(const string of langPack.strings) {\n\t\t\tstrings.set(string.key as LangPackKey, string);\n\t\t}\n\n\t\tif(langPack.countries) {\n\t\t\tcountriesList.length = 0;\n\t\t\tcountriesList.push(...langPack.countries.countries);\n\n\t\t\tlangPack.countries.countries.forEach(country => {\n\t\t\t\tif(country.name) {\n\t\t\t\t\tconst langPackKey: any = country.default_name;\n\t\t\t\t\tstrings.set(langPackKey, {\n\t\t\t\t\t\t_: 'langPackString',\n\t\t\t\t\t\tkey: langPackKey,\n\t\t\t\t\t\tvalue: country.name\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif(lastAppliedLangCode !== langPack.lang_code) {\n\t\t\trootScope.dispatchEvent('language_change', langPack.lang_code);\n\t\t\tlastAppliedLangCode = langPack.lang_code;\n\t\t}\n\n\t\tconst elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n\t\telements.forEach(element => {\n\t\t\tconst instance = weakMap.get(element);\n\n\t\t\tif(instance) {\n\t\t\t\tinstance.update();\n\t\t\t}\n\t\t});\n\t}\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n\t\tif(Array.isArray(arg)) {\n\t\t\tout.push(...arg as any);\n\t\t} else {\n\t\t\tout.push(arg);\n\t\t}\n }\n\n\texport function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n\t\tlet out: ReturnType = [];\n\t\tconst regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n\t\tlet lastIndex = 0;\n\t\tinput.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n\t\t\t//console.table({match, p1, p2, offset, string});\n\n\t\t\tout.push(string.slice(lastIndex, offset));\n\n\t\t\tif(p1) {\n\t\t\t\t//offset += p1.length;\n let element: HTMLElement;\n\t\t\t\tswitch(p1) {\n\t\t\t\t\tcase '**': {\n element = document.createElement('b');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n\t\t\t\t}\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n\t\t\t} else if(p3) {\n\t\t\t\tout.push(document.createElement('br'));\n\t\t\t} else if(p4) {\n const idx = p4.lastIndexOf(']');\n\t\t\t\tconst text = p4.slice(1, idx);\n \n\t\t\t\tconst url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n\t\t\t\tif(url && RichTextProcessor.matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = RichTextProcessor.wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n\t\t\t\t} else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n\t\t\t\tout.push(a);\n\t\t\t} else if(args) {\n pushNextArgument(out, args, indexHolder);\n\t\t\t}\n\n\t\t\tlastIndex = offset + match.length;\n\t\t\treturn '';\n\t\t});\n\t\n\t\tif(lastIndex !== input.length) {\n\t\t\tout.push(input.slice(lastIndex));\n\t\t}\n\n\t\treturn out;\n\t}\n\t\n\texport function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n\texport function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n\texport function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n\t\tconst str = strings.get(key);\n\t\tlet input: string;\n\t\tif(str) {\n\t\t\tif(str._ === 'langPackStringPluralized' && args?.length) {\n\t\t\t\tlet v = args[0] as number | string;\n\t\t\t\tif(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n\t\t\t\tconst s = pluralRules.select(v);\n\t\t\t\t// @ts-ignore\n\t\t\t\tinput = str[s + '_value'] || str['other_value'];\n\t\t\t} else if(str._ === 'langPackString') {\n\t\t\t\tinput = str.value;\n\t\t\t} else {\n\t\t\t\t//input = '[' + key + ']';\n\t\t\t\tinput = key;\n\t\t\t}\n\t\t} else {\n\t\t\t//input = '[' + key + ']';\n\t\t\tinput = key;\n\t\t}\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map(item => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\t\t\n\t\t/* if(plain) {\n\t\t\tif(args?.length) {\n\t\t\t\tconst regExp = /un\\d|%\\d\\$.|%./g;\n\t\t\t\tlet i = 0;\n\t\t\t\tinput = input.replace(regExp, (match, offset, string) => {\n\t\t\t\t\treturn '' + args[i++];\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn input;\n\t\t} else {\n\t\t\treturn superFormatter(input, args);\n\t\t} */\n\t}\n\n\texport const weakMap: WeakMap> = new WeakMap();\n\n\texport type IntlElementBaseOptions = {\n\t\telement?: HTMLElement,\n\t\tproperty?: /* 'innerText' | */'innerHTML' | 'placeholder',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\n\t\n\t\tconstructor(options?: Options) {\n\t\t\tthis.element = options?.element || document.createElement('span');\n\t\t\tthis.element.classList.add('i18n');\n\t\t\t\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n\t\t\tweakMap.set(this.element, this);\n\t\t}\n\n\t\tabstract update(options?: Options): void;\n\t}\n\n\texport type IntlElementOptions = IntlElementBaseOptions & {\n\t\tkey?: LangPackKey,\n\t\targs?: FormatterArguments\n\t};\n\texport class IntlElement extends IntlElementBase {\n\t\tpublic key: IntlElementOptions['key'];\n\t\tpublic args: IntlElementOptions['args'];\n\n\t\tpublic update(options?: IntlElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\tif(this.property === 'innerHTML') {\n\t\t\t\tthis.element.textContent = '';\n\t\t\t\tthis.element.append(...format(this.key, false, this.args) as any);\n\t\t\t} else {\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst v = this.element[this.property];\n\t\t\t\tconst formatted = format(this.key, true, this.args);\n\n\t\t\t\t// * hasOwnProperty won't work here\n\t\t\t\tif(v === undefined) this.element.dataset[this.property] = formatted;\n\t\t\t\telse (this.element as HTMLInputElement)[this.property] = formatted;\n\t\t\t}\n\t\t}\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n\t}\n\n\texport type IntlDateElementOptions = IntlElementBaseOptions & {\n\t\tdate?: Date,\n\t\toptions: Intl.DateTimeFormatOptions\n\t};\n\texport class IntlDateElement extends IntlElementBase {\n\t\tpublic date: IntlDateElementOptions['date'];\n\t\tpublic options: IntlDateElementOptions['options'];\n\n\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = new Intl.DateTimeFormat(lastRequestedLangCode + '-u-hc-' + timeFormat, this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n\t\t}\n\t}\n\n\texport function i18n(key: LangPackKey, args?: FormatterArguments) {\n\t\treturn new IntlElement({key, args}).element;\n\t}\n\t\n\texport function i18n_(options: IntlElementOptions) {\n\t\treturn new IntlElement(options).element;\n\t}\n\n\texport function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n\t\treturn new IntlElement({element, key, args, property}).element;\n\t}\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n\tconst arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n\treturn arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n\tconst joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'WordDelimiterLast' : 'WordDelimiter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"webp.worker.db1ce269f081e74b2c5a.bundle.worker.js\");\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport WebpWorker from 'worker-loader!./webp.worker';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport apiManagerProxy from '../mtproto/mtprotoworker';\r\n\r\nexport type WebpConvertTask = {\r\n type: 'convertWebp', \r\n payload: {\r\n fileName: string, \r\n bytes: Uint8Array\r\n }\r\n};\r\n\r\nexport class WebpWorkerController {\r\n private worker: Worker;\r\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\r\n \r\n private init() {\r\n this.worker = new WebpWorker();\r\n this.worker.addEventListener('message', (e) => {\r\n const payload = (e.data as WebpConvertTask).payload;\r\n\r\n if(payload.fileName.indexOf('main-') === 0) {\r\n const promise = this.convertPromises[payload.fileName];\r\n if(promise) {\r\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\r\n delete this.convertPromises[payload.fileName];\r\n }\r\n } else {\r\n apiManagerProxy.postMessage(e.data);\r\n }\r\n });\r\n }\r\n\r\n public postMessage(data: WebpConvertTask) {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.worker.postMessage(data);\r\n }\r\n\r\n public convert(fileName: string, bytes: Uint8Array) {\r\n fileName = 'main-' + fileName;\r\n\r\n if(this.convertPromises.hasOwnProperty(fileName)) {\r\n return this.convertPromises[fileName];\r\n }\r\n \r\n const convertPromise = deferredPromise();\r\n\r\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\r\n\r\n return this.convertPromises[fileName] = convertPromise;\r\n }\r\n}\r\n\r\nconst webpWorkerController = new WebpWorkerController();\r\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\r\nexport default webpWorkerController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport sessionStorage from '../sessionStorage';\r\n\r\nexport class TelegramMeWebManager {\r\n private disabled = /* false && */(Modes.test || App.domains.indexOf(location.hostname) === -1);\r\n\r\n public setAuthorized(canRedirect: boolean) {\r\n if(this.disabled) {\r\n return;\r\n }\r\n\r\n return sessionStorage.get('tgme_sync').then((curValue) => {\r\n const ts = tsNow(true);\r\n if(canRedirect &&\r\n curValue &&\r\n curValue.canRedirect === canRedirect &&\r\n (curValue.ts + 86400) > ts) {\r\n return;\r\n }\r\n\r\n sessionStorage.set({\r\n tgme_sync: {\r\n canRedirect, \r\n ts\r\n }\r\n });\r\n\r\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\r\n const urls = [\r\n '//telegram.me/' + path,\r\n '//t.me/' + path\r\n ];\r\n\r\n const promises = urls.map(url => {\r\n const script = document.createElement('script');\r\n const promise = new Promise((resolve) => {\r\n script.onload = script.onerror = () => {\r\n script.remove();\r\n resolve();\r\n };\r\n });\r\n script.src = url;\r\n document.body.appendChild(script);\r\n return promise;\r\n });\r\n\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n\r\nconst telegramMeWebManager = new TelegramMeWebManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\r\nexport default telegramMeWebManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { NotificationSettings } from \"../appManagers/appNotificationsManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { logger } from \"../logger\";\r\nimport rootScope from \"../rootScope\";\r\nimport { ServiceWorkerNotificationsClearTask, ServiceWorkerPingTask, ServiceWorkerPushClickTask } from \"../serviceWorker/index.service\";\r\nimport apiManager from \"./mtprotoworker\";\r\nimport I18n, { LangPackKey } from \"../langPack\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appRuntimeManager from \"../appManagers/appRuntimeManager\";\r\n\r\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\r\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\r\n\r\nexport type PushSubscriptionNotify = {\r\n tokenType: number,\r\n tokenValue: string\r\n};\r\n\r\nexport class WebPushApiManager {\r\n public isAvailable = true;\r\n private isPushEnabled = false;\r\n private localNotificationsAvailable = true;\r\n private started = false;\r\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\r\n private isAliveTO: any;\r\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n private userVisibleOnly = this.isFirefox ? false : true;\r\n private log = logger('PM');\r\n\r\n constructor() {\r\n if(!('PushManager' in window) ||\r\n !('Notification' in window) ||\r\n !('serviceWorker' in navigator)) {\r\n this.log.warn('Push messaging is not supported.');\r\n this.isAvailable = false;\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n if(this.isAvailable && Notification.permission === 'denied') {\r\n this.log.warn('The user has blocked notifications.');\r\n }\r\n }\r\n\r\n public start() {\r\n if(!this.started) {\r\n this.started = true;\r\n this.getSubscription();\r\n this.setUpServiceWorkerChannel();\r\n }\r\n }\r\n\r\n public setLocalNotificationsDisabled() {\r\n this.localNotificationsAvailable = false;\r\n }\r\n\r\n public getSubscription() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = !!subscription;\r\n this.pushSubscriptionNotify('init', subscription);\r\n }).catch((err) => {\r\n this.log.error('Error during getSubscription()', err);\r\n });\r\n });\r\n }\r\n\r\n public subscribe = () => {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\r\n // The subscription was successful\r\n this.isPushEnabled = true;\r\n this.pushSubscriptionNotify('subscribe', subscription);\r\n }).catch((e) => {\r\n if(Notification.permission === 'denied') {\r\n this.log('Permission for Notifications was denied');\r\n } else {\r\n this.log('Unable to subscribe to push.', e);\r\n if(!this.userVisibleOnly) {\r\n this.userVisibleOnly = true;\r\n setTimeout(this.subscribe, 0);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n public unsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n \r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.isPushEnabled = false;\r\n\r\n if(subscription) {\r\n this.pushSubscriptionNotify('unsubscribe', subscription);\r\n\r\n setTimeout(() => {\r\n subscription.unsubscribe().then((successful) => {\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }, 3000);\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public forceUnsubscribe() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n navigator.serviceWorker.ready.then((reg) => {\r\n reg.pushManager.getSubscription().then((subscription) => {\r\n this.log.warn('force unsubscribe', subscription);\r\n if(subscription) {\r\n subscription.unsubscribe().then((successful) => {\r\n this.log.warn('force unsubscribe successful', successful);\r\n this.isPushEnabled = false;\r\n }).catch((e) => {\r\n this.log.error('Unsubscription error: ', e);\r\n });\r\n }\r\n }).catch((e) => {\r\n this.log.error('Error thrown while unsubscribing from ' +\r\n 'push messaging.', e);\r\n });\r\n });\r\n }\r\n\r\n public isAliveNotify = () => {\r\n if(!this.isAvailable || rootScope.idle && rootScope.idle.deactivated) {\r\n return;\r\n }\r\n\r\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '') + '#/im';\r\n\r\n const lang: ServiceWorkerPingTask['payload']['lang'] = {} as any;\r\n const ACTIONS_LANG_MAP: Record = {\r\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\r\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\r\n push_message_nopreview: 'PushNotification.Message.NoPreview'\r\n };\r\n\r\n for(const action in ACTIONS_LANG_MAP) {\r\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\r\n }\r\n\r\n const task: ServiceWorkerPingTask = {\r\n type: 'ping',\r\n payload: {\r\n localNotifications: this.localNotificationsAvailable,\r\n lang: lang,\r\n settings: this.settings\r\n }\r\n };\r\n\r\n apiManager.postSWMessage(task);\r\n\r\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\r\n }\r\n\r\n public setSettings(newSettings: WebPushApiManager['settings']) {\r\n this.settings = copy(newSettings);\r\n clearTimeout(this.isAliveTO);\r\n this.isAliveNotify();\r\n }\r\n\r\n public hidePushNotifications() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n const task: ServiceWorkerNotificationsClearTask = {type: 'notifications_clear'};\r\n apiManager.postSWMessage(task);\r\n }\r\n\r\n public setUpServiceWorkerChannel() {\r\n if(!this.isAvailable) {\r\n return;\r\n }\r\n\r\n apiManager.addServiceWorkerTaskListener('push_click', (task: ServiceWorkerPushClickTask) => {\r\n if(rootScope.idle && rootScope.idle.deactivated) {\r\n appRuntimeManager.reload();\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('push_notification_click', task.payload);\r\n });\r\n\r\n navigator.serviceWorker.ready.then(this.isAliveNotify);\r\n }\r\n\r\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\r\n if(subscription) {\r\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\r\n if(!subscriptionObj ||\r\n !subscriptionObj.endpoint ||\r\n !subscriptionObj.keys ||\r\n !subscriptionObj.keys.p256dh ||\r\n !subscriptionObj.keys.auth) {\r\n this.log.warn('Invalid push subscription', subscriptionObj);\r\n this.unsubscribe();\r\n this.isAvailable = false;\r\n this.pushSubscriptionNotify(event);\r\n return;\r\n }\r\n \r\n this.log.warn('Push', event, subscriptionObj);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\r\n tokenType: 10,\r\n tokenValue: JSON.stringify(subscriptionObj)\r\n });\r\n } else {\r\n this.log.warn('Push', event, false);\r\n rootScope.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\r\n }\r\n }\r\n}\r\n\r\nconst webPushApiManager = new WebPushApiManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\r\nexport default webPushApiManager;\r\n","// Copyright Twitter Inc. Licensed under MIT\r\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\r\n\r\nconst originalString = \"((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d])|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f?\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd1d\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78\\udd7a-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcb\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7a\\ude80-\\ude86\\ude90-\\udea8\\udeb0-\\udeb6\\udec0-\\udec2\\uded0-\\uded6]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)\";\r\nexport default originalString;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from './config';\n\nimport emojiRegExp from '../vendor/emoji/regex';\nimport { encodeEmoji, toCodePoints } from '../vendor/emoji';\nimport { MessageEntity } from '../layer';\nimport { encodeEntities } from '../helpers/string';\nimport { IS_SAFARI } from '../environment/userAgent';\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport { copy } from '../helpers/object';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nconst emojiData = Config.Emoji;\n\nconst alphaCharsRegExp = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nconst alphaNumericRegExp = '0-9\\_' + alphaCharsRegExp;\nconst domainAddChars = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nconst urlAlphanumericRegExpPart = '[' + alphaCharsRegExp + '0-9]';\nconst urlProtocolRegExpPart = '((?:https?|ftp)://|mailto:)?';\nconst urlRegExp = urlProtocolRegExpPart +\n // user:pass authentication\n '(?:' + urlAlphanumericRegExpPart + '{1,64}(?::' + urlAlphanumericRegExpPart + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + urlAlphanumericRegExpPart + '[' + alphaCharsRegExp + domainAddChars + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + alphaCharsRegExp + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nconst urlProtocolRegExp = new RegExp('^' + urlProtocolRegExpPart.slice(0, -1), 'i');\nconst urlAnyProtocolRegExp = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nconst usernameRegExp = '[a-zA-Z\\\\d_]{5,32}';\nconst botCommandRegExp = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + usernameRegExp + '))?(\\\\b|$)';\nconst fullRegExp = new RegExp('(^| )(@)(' + usernameRegExp + ')|(' + urlRegExp + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + alphaNumericRegExp + ']{2,64})|(^|\\\\s)' + botCommandRegExp, 'i');\nconst emailRegExp = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n//const markdownTestRegExp = /[`_*@~]/;\nconst markdownRegExp = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nconst siteHashtags: {[siteName: string]: string} = {\n Telegram: 'tg://search_hashtag?hashtag={1}',\n Twitter: 'https://twitter.com/hashtag/{1}',\n Instagram: 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\nconst siteMentions: {[siteName: string]: string} = {\n Telegram: '#/im?p=%40{1}',\n Twitter: 'https://twitter.com/{1}',\n Instagram: 'https://instagram.com/{1}/',\n GitHub: 'https://github.com/{1}'\n};\nconst markdownEntities: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nconst passConflictingEntities: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(let i in markdownEntities) {\n passConflictingEntities.add(markdownEntities[i]);\n}\n\nnamespace RichTextProcessor {\n export function getEmojiSpritesheetCoords(emojiCode: string) {\n let unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n \n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n \n if(!emojiData.hasOwnProperty(unified) \n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n //console.error('lol', unified);\n return null;\n }\n \n return unified;\n }\n\n export function parseEntities(text: string) {\n let match: any;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n fullRegExp.lastIndex = 0;\n while((match = raw.match(fullRegExp))) {\n matchIndex = rawOffset + match.index;\n \n //console.log('parseEntities match:', match);\n \n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(emailRegExp.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || Config.TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n \n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n \n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n \n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n //console.log('hit', match[8]);\n const emojiCoords = getEmojiSpritesheetCoords(match[8]);\n if(emojiCoords) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: emojiCoords\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n }\n \n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n \n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n }\n\n /* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n } */\n\n export function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n   /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(markdownRegExp)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n //text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n \n newTextParts.push(match[1] + text + match[5]);\n \n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: markdownEntities[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n //offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n \n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n \n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n \n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach(entity => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n }\n\n export function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n return currentEntities.find(currentEntity => {\n const isConflictingTypes = newEntity._ === currentEntity._ || \n (!passConflictingEntities.has(newEntity._) && !passConflictingEntities.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset && \n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n }\n\n export function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter(e => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n }\n\n const CAN_COMBINE_ENTITIES: Set = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n ]);\n export function combineSameEntities(entities: MessageEntity[]) {\n //entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n //return entities;\n }\n\n export function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n }\n\n /**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\n export function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n //mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n\n contextHashtag?: string,\n }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n entity.length = entity.offset + entity.length - textLength;\n }\n\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\n }\n\n break;\n }\n\n case 'messageEntityEmoji': {\n //if(!(options.wrappingDraft && IS_EMOJI_SUPPORTED)) { // * fix safari emoji\n if(!IS_EMOJI_SUPPORTED) { // no wrapping needed\n // if(IS_EMOJI_SUPPORTED) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!IS_EMOJI_SUPPORTED) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n \n case 'messageEntityCaret': {\n const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\n break;\n }\n\n /* case 'messageEntityLinebreak': {\n if(options.noLinebreaks) {\n insertPart(entity, ' ');\n } else {\n insertPart(entity, '
');\n }\n \n break;\n } */\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\n masked = true;\n }\n } else {\n //inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') \n ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\n }\n\n export function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach(entity => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n \n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n }\n\n export function wrapDraftText(text: string, options: Partial<{\n entities: MessageEntity[]\n }> = {}) {\n if(!text) {\n return '';\n }\n\n return wrapRichText(text, {\n entities: options.entities, \n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n }\n\n export function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n }\n\n export function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n \n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n let char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.join('');\n }\n \n /* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n } */\n \n /**\n * ! This function is still unsafe to use with .innerHTML\n */\n export function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n if(entities?.length) {\n entities = entities.filter(entity => entity._ === 'messageEntitySpoiler');\n }\n \n return wrapRichText(text, {\n entities, \n noEncoding: true,\n noTextFormat: true,\n noLinebreaks: true,\n noLinks: true\n });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\n \n let entities = parseEntities(text).filter(e => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n }\n\n export function wrapUrl(url: string, unsafe?: number | boolean): {url: string, onclick: string} {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n \n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: string;\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?t(?:elegram)?\\.me\\/(.+)/))) {\n const fullPath = tgMeMatch[1];\n\n if(/^\\W/.test(fullPath)) {\n onclick = 'joinchat';\n return {url, onclick};\n }\n\n const path = fullPath.split('/');\n switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'voicechat':\n onclick = path[0];\n break;\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1];\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n \n return {url, onclick};\n }\n\n export function matchUrlProtocol(text: string) {\n return !text ? null : text.match(urlAnyProtocolRegExp);\n }\n \n export function matchUrl(text: string) {\n return !text ? null : text.match(urlRegExp);\n }\n\n export function matchEmail(text: string) {\n return !text ? null : text.match(emailRegExp);\n }\n\n export function getAbbreviation(str: string, onlyFirst = false) {\n if(!str) return '';\n const splitted = str.trim().split(' ');\n if(!splitted[0]) return '';\n\n const first = [...splitted[0]][0];\n\n if(onlyFirst || splitted.length === 1) return wrapEmojiText(first);\n\n const last = [...splitted[splitted.length - 1]][0];\n\n return wrapEmojiText(first + last);\n }\n\n export function isUsernameValid(username: string) {\n return ((username.length >= 5 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n }\n\n export function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n }\n\n export function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n }\n}\n\nMOUNT_CLASS_TO.RichTextProcessor = RichTextProcessor;\n\nexport {RichTextProcessor};\nexport default RichTextProcessor;\n\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LocalStorageProxyTask, LocalStorageProxyTaskResponse } from '../localStorage';\n//import type { LocalStorageProxyDeleteTask, LocalStorageProxySetTask } from '../storage';\nimport type { Awaited, InvokeApiOptions, WorkerTaskVoidTemplate } from '../../types';\nimport type { Config, InputFile, JSONValue, MethodDeclMap, User } from '../../layer';\nimport MTProtoWorker from 'worker-loader!./mtproto.worker';\n//import './mtproto.worker';\nimport { isObject } from '../../helpers/object';\nimport CryptoWorkerMethods, { CryptoMethods } from '../crypto/crypto_methods';\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport { ApiFileManager, DownloadOptions } from './apiFileManager';\nimport type { RequestFilePartTask, RequestFilePartTaskResponse, ServiceWorkerTask } from '../serviceWorker/index.service';\nimport { UserAuth } from './mtproto_config';\nimport type { MTMessage } from './networker';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport Socket from './transports/websocket';\nimport singleInstance from './singleInstance';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport AppStorage from '../storage';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport { SocketProxyTask } from './transports/socketProxied';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport { CacheStorageDbName } from '../cacheStorage';\nimport { pause } from '../../helpers/schedulers/pause';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport type { ApiError } from './apiManager';\nimport { MTAppConfig } from './appConfig';\n\ntype Task = {\n taskId: number,\n task: string,\n args: any[]\n};\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport interface ToggleStorageTask extends WorkerTaskVoidTemplate {\n type: 'toggleStorage',\n payload: boolean\n};\n\nexport class ApiManagerProxy extends CryptoWorkerMethods {\n public worker: /* Window */Worker;\n private afterMessageIdTemp = 0;\n\n private taskId = 0;\n private awaiting: {\n [id: number]: {\n resolve: any,\n reject: any,\n taskName: string\n }\n } = {} as any;\n private pending: Array = [];\n\n public updatesProcessor: (obj: any) => void = null;\n\n private log = logger('API-PROXY');\n\n private hashes: {[method: string]: HashOptions} = {};\n\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n private isSWRegistered = true;\n\n private debug = DEBUG /* && false */;\n\n private sockets: Map = new Map();\n\n private taskListeners: {[taskType: string]: (task: any) => void} = {};\n private taskListenersSW: {[taskType: string]: (task: any) => void} = {};\n\n public onServiceWorkerFail: () => void;\n\n private postMessagesWaiting: any[][] = [];\n\n private getConfigPromise: Promise;\n private getAppConfigPromise: Promise;\n\n constructor() {\n super();\n this.log('constructor');\n\n singleInstance.start();\n\n this.registerServiceWorker();\n\n this.addTaskListener('clear', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n AppStorage.toggleStorage(false), \n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map(cacheName => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n this.addTaskListener('connectionStatusChange', (task: any) => {\n rootScope.dispatchEvent('connection_status_change', task.payload);\n });\n\n this.addTaskListener('convertWebp', (task) => {\n webpWorkerController.postMessage(task);\n });\n\n this.addTaskListener('socketProxy', (task: SocketProxyTask) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n //console.log('socketProxy', socketTask, id);\n\n if(socketTask.type === 'send') {\n const socket = this.sockets.get(id);\n socket.send(socketTask.payload);\n } else if(socketTask.type === 'close') { // will remove from map in onClose\n const socket = this.sockets.get(id);\n socket.close();\n } else if(socketTask.type === 'setup') {\n const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n \n const onOpen = () => {\n //console.log('socketProxy onOpen');\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'open',\n id\n }\n });\n };\n const onClose = () => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'close',\n id\n }\n });\n\n socket.removeEventListener('open', onOpen);\n socket.removeEventListener('close', onClose);\n socket.removeEventListener('message', onMessage);\n this.sockets.delete(id);\n };\n const onMessage = (buffer: ArrayBuffer) => {\n this.postMessage({\n type: 'socketProxy', \n payload: {\n type: 'message',\n id,\n payload: buffer\n }\n });\n };\n\n socket.addEventListener('open', onOpen);\n socket.addEventListener('close', onClose);\n socket.addEventListener('message', onMessage);\n this.sockets.set(id, socket);\n }\n });\n\n this.addTaskListener('localStorageProxy', (task: LocalStorageProxyTask) => {\n const storageTask = task.payload;\n // @ts-ignore\n sessionStorage[storageTask.type](...storageTask.args).then(res => {\n this.postMessage({\n type: 'localStorageProxy',\n id: task.id,\n payload: res\n } as LocalStorageProxyTaskResponse);\n });\n });\n\n rootScope.addEventListener('language_change', (language) => {\n this.performTaskWorkerVoid('setLanguage', language);\n });\n\n window.addEventListener('online', (event) => {\n this.forceReconnectTimeout();\n });\n\n \n this.registerWorker();\n \n\n setTimeout(() => {\n this.getConfig();\n }, 5000);\n }\n\n public isServiceWorkerOnline() {\n return this.isSWRegistered;\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n \n const worker = navigator.serviceWorker;\n worker.register('./sw.js', {scope: './'}).then(registration => {\n this.log('SW registered', registration);\n this.isSWRegistered = true;\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n //this.postSWMessage = worker.controller.postMessage.bind(worker.controller);\n\n \n \n \n \n }, (err) => {\n this.isSWRegistered = false;\n this.log.error('SW registration failed!', err);\n\n if(this.onServiceWorkerFail) {\n this.onServiceWorkerFail();\n }\n });\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n this.releasePending();\n\n worker.controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n worker.addEventListener('message', (e) => {\n const task: ServiceWorkerTask = e.data;\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListenersSW[task.type];\n if(callback) {\n callback(task);\n }\n });\n\n this.addServiceWorkerTaskListener('requestFilePart', (task: RequestFilePartTask) => {\n const responseTask: RequestFilePartTaskResponse = {\n type: task.type,\n id: task.id\n };\n \n this.performTaskWorker>>('requestFilePart', ...task.payload)\n .then((uploadFile) => {\n responseTask.payload = uploadFile;\n this.postSWMessage(responseTask);\n }, (err) => {\n responseTask.originalPayload = task.payload;\n responseTask.error = err;\n this.postSWMessage(responseTask);\n });\n });\n\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n public postMessage(...args: any[]) {\n this.postMessagesWaiting.push(args);\n }\n\n public postSWMessage(message: any) {\n if(navigator.serviceWorker.controller) {\n navigator.serviceWorker.controller.postMessage(message);\n }\n }\n\n private onWorkerFirstMessage(worker: any) {\n if(!this.worker) {\n this.worker = worker;\n this.log('set webWorker');\n\n this.postMessage = this.worker.postMessage.bind(this.worker);\n\n this.postMessagesWaiting.forEach(args => this.postMessage(...args));\n this.postMessagesWaiting.length = 0;\n\n const isWebpSupported = IS_WEBP_SUPPORTED;\n this.log('WebP supported:', isWebpSupported);\n this.postMessage({type: 'webpSupport', payload: isWebpSupported});\n this.postMessage({type: 'userAgent', payload: navigator.userAgent});\n\n this.releasePending();\n }\n }\n\n public addTaskListener(name: keyof ApiManagerProxy['taskListeners'], callback: ApiManagerProxy['taskListeners'][typeof name]) {\n this.taskListeners[name] = callback;\n }\n\n public addServiceWorkerTaskListener(name: keyof ApiManagerProxy['taskListenersSW'], callback: ApiManagerProxy['taskListenersSW'][typeof name]) {\n this.taskListenersSW[name] = callback;\n }\n\n private onWorkerMessage = (e: MessageEvent) => {\n //this.log('got message from worker:', e.data);\n\n const task = e.data;\n\n if(!isObject(task)) {\n return;\n }\n\n const callback = this.taskListeners[task.type];\n if(callback) {\n callback(task);\n return;\n }\n\n if(task.update) {\n if(this.updatesProcessor) {\n this.updatesProcessor(task.update);\n }\n } else if(task.progress) {\n rootScope.dispatchEvent('download_progress', task.progress);\n } else if(task.hasOwnProperty('result') || task.hasOwnProperty('error')) {\n this.finalizeTask(task.taskId, task.result, task.error);\n }\n };\n\n \n private registerWorker() {\n // return;\n\n const worker = new MTProtoWorker();\n //const worker = window;\n worker.addEventListener('message', this.onWorkerFirstMessage.bind(this, worker), {once: true});\n worker.addEventListener('message', this.onWorkerMessage);\n\n worker.addEventListener('error', (err) => {\n this.log.error('WORKER ERROR', err);\n });\n }\n \n\n private finalizeTask(taskId: number, result: any, error: any) {\n const deferred = this.awaiting[taskId];\n if(deferred !== undefined) {\n this.debug && this.log.debug('done', deferred.taskName, result, error);\n error ? deferred.reject(error) : deferred.resolve(result);\n delete this.awaiting[taskId];\n }\n }\n\n private createTask(task: string, type: string, args: any[]): any {\n return {\n task,\n taskId: this.taskId++,\n type,\n args,\n };\n }\n\n public performTaskWorkerVoid(taskName: string, ...args: any[]) {\n const task = this.createTask(taskName, undefined, args);\n this.pending.push(task);\n this.releasePending();\n }\n\n public performTaskWorkerNew(taskName: string, type: string, ...args: any[]) {\n this.debug && this.log.debug('start', taskName, args);\n\n return new Promise((resolve, reject) => {\n const task = this.createTask(taskName, type, args);\n this.pending.push(task);\n this.awaiting[task.taskId] = {resolve, reject, taskName: taskName};\n this.releasePending();\n });\n }\n\n public performTaskWorker(task: string, ...args: any[]) {\n return this.performTaskWorkerNew(task, undefined, ...args);\n }\n\n private releasePending() {\n //return;\n\n if(this.postMessage) {\n this.debug && this.log.debug('releasing tasks, length:', this.pending.length);\n this.pending.forEach(pending => {\n this.postMessage(pending);\n });\n \n this.debug && this.log.debug('released tasks');\n this.pending.length = 0;\n }\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return this.performTaskWorkerNew(method, 'crypto', ...args);\n }\n \n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n //console.log('will invokeApi:', method, params, options);\n return this.performTaskWorker('invokeApi', method, params, options);\n }\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n \n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n //console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T, \n processResult?: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: Omit, \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n //console.log('will invokeApi:', method, params, options);\n\n const {params, options, method} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n (params as any).hash = cached.hash;\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n \n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n \n if(!this.hashes[method]) this.hashes[method] = {};\n this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n return o.processResult(result);\n }\n \n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T, \n processResult: (response: MethodDeclMap[T]['res']) => R, \n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'], \n options?: InvokeApiOptions & {cacheKey?: string}\n }): Promise {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n \n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise = originalPromise.then(processResult, processError);\n\n const p = newPromise.finally(() => {\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = window.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n \n delete cache[queryJSON];\n }\n } catch(err) {\n this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n /* private computeHash(smth: any[]) {\n smth = smth.slice().sort((a, b) => a.id - b.id);\n //return smth.reduce((hash, v) => (((hash * 0x4F25) & 0x7FFFFFFF) + v.id) & 0x7FFFFFFF, 0);\n return smth.reduce((hash, v) => ((hash * 20261) + 0x80000000 + v.id) % 0x80000000, 0);\n } */\n\n public setBaseDcId(dcId: number) {\n return this.performTaskWorker('setBaseDcId', dcId);\n }\n\n public setQueueId(queueId: number) {\n return this.performTaskWorker('setQueueId', queueId);\n }\n\n public setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n \n rootScope.dispatchEvent('user_auth', userAuth);\n return this.performTaskWorker('setUserAuth', userAuth);\n }\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n public getNetworker(dc_id: number, options?: InvokeApiOptions) {\n return this.performTaskWorker('getNetworker', dc_id, options);\n }\n\n public logOut(): Promise {\n // AppStorage.toggleStorage(false);\n return this.performTaskWorker('logOut');\n }\n\n public cancelDownload(fileName: string) {\n return this.performTaskWorker('cancelDownload', fileName);\n }\n\n public downloadFile(options: DownloadOptions) {\n return this.performTaskWorker('downloadFile', options);\n }\n\n public uploadFile(options: {file: Blob | File, fileName: string}) {\n return this.performTaskWorker('uploadFile', options);\n }\n\n public toggleStorage(enabled: boolean) {\n const task: ToggleStorageTask = {type: 'toggleStorage', payload: enabled};\n this.postMessage(task);\n this.postSWMessage(task);\n }\n\n public stopAll() {\n return this.performTaskWorkerVoid('stopAll');\n }\n\n public startAll() {\n return this.performTaskWorkerVoid('startAll');\n }\n\n public forceReconnectTimeout() {\n this.postMessage({type: 'online'});\n }\n\n public forceReconnect() {\n this.postMessage({type: 'forceReconnect'});\n }\n\n public getConfig() {\n if(this.getConfigPromise) return this.getConfigPromise;\n return this.getConfigPromise = this.invokeApi('help.getConfig').then(config => {\n rootScope.config = config;\n return config;\n });\n }\n\n public getAppConfig(overwrite?: boolean): Promise {\n if(this.getAppConfigPromise && !overwrite) return this.getAppConfigPromise;\n return this.getAppConfigPromise = this.invokeApi('help.getAppConfig').then(config => {\n rootScope.appConfig = config;\n return config;\n });\n }\n}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize\r\n};\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport I18n, { i18n } from \"../lib/langPack\";\r\nimport { capitalizeFirstLetter } from \"./string\";\r\nimport tsNow from './tsNow';\r\n\r\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nexport const ONE_DAY = 86400;\r\n\r\n// https://stackoverflow.com/a/6117889\r\nexport const getWeekNumber = (date: Date) => {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n const dayNum = d.getUTCDay() || 7;\r\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\r\n};\r\n\r\nexport function formatDateAccordingToTodayNew(time: Date) {\r\n const today = new Date();\r\n const now = today.getTime() / 1000 | 0;\r\n const timestamp = time.getTime() / 1000 | 0;\r\n\r\n const options: Intl.DateTimeFormatOptions = {};\r\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\r\n options.hour = options.minute = '2-digit';\r\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\r\n options.year = options.day = 'numeric';\r\n options.month = '2-digit';\r\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\r\n options.weekday = 'short';\r\n } else { // same year\r\n options.month = 'short';\r\n options.day = 'numeric';\r\n }\r\n\r\n return new I18n.IntlDateElement({\r\n date: time,\r\n options\r\n }).element;\r\n}\r\n\r\nexport function formatFullSentTimeRaw(timestamp: number, options: {\r\n capitalize?: boolean\r\n} = {}) {\r\n const date = new Date();\r\n const time = new Date(timestamp * 1000);\r\n const now = date.getTime() / 1000;\r\n\r\n const timeEl = formatTime(time);\r\n\r\n let dateEl: Node | string;\r\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\r\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\r\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\r\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\r\n\r\n if(options.capitalize) {\r\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\r\n }\r\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric',\r\n year: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\r\n } else {\r\n dateEl = new I18n.IntlDateElement({\r\n date: time,\r\n options: {\r\n month: 'short',\r\n day: 'numeric'\r\n }\r\n }).element;\r\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\r\n }\r\n\r\n return {dateEl, timeEl};\r\n}\r\n\r\nexport function formatFullSentTime(timestamp: number) {\r\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\r\n capitalize: true\r\n });\r\n\r\n const fragment = document.createDocumentFragment();\r\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\r\n return fragment;\r\n}\r\n\r\nexport function formatTime(date: Date) {\r\n return new I18n.IntlDateElement({\r\n date,\r\n options: {\r\n hour: '2-digit',\r\n minute: '2-digit'\r\n }\r\n }).element;\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\r\n\r\nexport const getFullDate = (date: Date, options: Partial<{\r\n noTime: true, \r\n noSeconds: true,\r\n monthAsNumber: true,\r\n leadingZero: true\r\n}> = {}) => {\r\n const joiner = options.monthAsNumber ? '.' : ' ';\r\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\r\n\r\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \r\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \r\n joiner + date.getFullYear() + \r\n (options.noTime ? '' : ', ' + time);\r\n};\r\n\r\nexport {tsNow};\r\n\r\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\r\nconst minYear = 2013;\r\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\r\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\r\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\r\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\r\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\nexport type DateData = {\r\n title: string,\r\n minDate: number,\r\n maxDate: number,\r\n};\r\nexport function fillTipDates(query: string, dates: DateData[]) {\r\n const q = query.trim().toLowerCase();\r\n\r\n if(q.length < 3) {\r\n return;\r\n }\r\n\r\n if(\"today\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: 'Today',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n if(\"yesterday\".indexOf(q) === 0) {\r\n const date = new Date();\r\n const year = date.getFullYear();\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime() - 86400000;\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 86400001;\r\n dates.push({\r\n title: 'Yesterday',\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n const dayOfWeek = getDayOfWeek(q);\r\n if(dayOfWeek >= 0) {\r\n const date = new Date();\r\n const now = date.getTime();\r\n const currentDay = date.getDay();\r\n const distance = dayOfWeek - currentDay;\r\n date.setDate(date.getDate() + distance);\r\n if(date.getTime() > now) {\r\n date.setTime(date.getTime() - 604800000);\r\n }\r\n const year = date.getFullYear()\r\n const month = date.getMonth();\r\n const day = date.getDate();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatWeekLong(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n let matches: any[];\r\n if((matches = shortDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const k = parseInt(g1);\r\n const k1 = parseInt(g2);\r\n if(k > 0 && k <= 31) {\r\n if(k1 >= minYear && k <= 12) {\r\n const selectedYear = k1;\r\n const month = k - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n } else if (k1 <= 12) {\r\n const day = k - 1;\r\n const month = k1 - 1;\r\n createForDayMonth(dates, day, month);\r\n }\r\n } else if (k >= minYear && k1 <= 12) {\r\n const selectedYear = k;\r\n const month = k1 - 1;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = longDate.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[3];\r\n const g3 = matches[5];\r\n if(!matches[2] === matches[4]) {\r\n return;\r\n }\r\n\r\n const day = parseInt(g1);\r\n const month = parseInt(g2) - 1;\r\n let year = parseInt(g3);\r\n if(year >= 10 && year <= 99) {\r\n year += 2000;\r\n }\r\n\r\n const currentYear = new Date().getFullYear();\r\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(year, month, day);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n date.setFullYear(year, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = yearPattern.exec(q)) !== null) {\r\n let selectedYear = +q;\r\n const currentYear = new Date().getFullYear();\r\n if(selectedYear < minYear) {\r\n selectedYear = minYear;\r\n for(let i = currentYear; i >= selectedYear; i--) {\r\n const date = new Date();\r\n date.setFullYear(i, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(i + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + i,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n } else if(selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const minDate = date.getTime();\r\n date.setFullYear(selectedYear + 1, 0, 1);\r\n date.setHours(0, 0, 0);\r\n\r\n const maxDate = date.getTime() - 1;\r\n dates.push({\r\n title: '' + selectedYear,\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g1);\r\n if(month >= 0) {\r\n const k = +g2;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if(k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\r\n const g1 = matches[1];\r\n const g2 = matches[2];\r\n const month = getMonth(g2);\r\n if(month >= 0) {\r\n const k = +g1;\r\n if(k > 0 && k <= 31) {\r\n const day = k - 1;\r\n createForDayMonth(dates, day, month);\r\n return;\r\n } else if (k >= minYear) {\r\n const selectedYear = k;\r\n createForMonthYear(dates, month, selectedYear);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n if(selectedYear >= minYear && selectedYear <= currentYear) {\r\n const date = new Date();\r\n date.setFullYear(selectedYear, month, 1);\r\n date.setHours(0, 0, 0);\r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n return;\r\n }\r\n date.setMonth(date.getMonth() + 1);\r\n const maxDate = date.getTime() - 1;\r\n\r\n dates.push({\r\n title: formatterMonthYear(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n}\r\n\r\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\r\n if(validDateForMonth(day, month)) {\r\n const currentYear = new Date().getFullYear();\r\n const today = Date.now();\r\n \r\n for(let i = currentYear; i >= minYear; i--) {\r\n if(month === 1 && day === 28 && !isLeapYear(i)) {\r\n continue;\r\n }\r\n\r\n const date = new Date();\r\n date.setFullYear(i, month, day + 1);\r\n date.setHours(0, 0, 0);\r\n \r\n const minDate = date.getTime();\r\n if(minDate > today) {\r\n continue;\r\n }\r\n\r\n date.setFullYear(i, month, day + 2);\r\n date.setHours(0, 0, 0);\r\n const maxDate = date.getTime() - 1;\r\n if(i === currentYear) {\r\n dates.push({\r\n title: formatterDayMonth(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n } else {\r\n dates.push({\r\n title: formatterYearMax(minDate),\r\n minDate,\r\n maxDate\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction formatterMonthYear(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\r\n}\r\n\r\nfunction formatterDayMonth(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\r\n}\r\n\r\nfunction formatterYearMax(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\r\n}\r\n\r\nfunction formatWeekLong(timestamp: number) {\r\n const date = new Date(timestamp);\r\n return days[date.getDay()];\r\n}\r\n\r\nfunction validDateForMonth(day: number, month: number) {\r\n if(month >= 0 && month < 12) {\r\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isLeapYear(year: number) {\r\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\r\n}\r\n\r\nfunction getMonth(q: string) {\r\n /* String[] months = new String[]{\r\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\r\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\r\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\r\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\r\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\r\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\r\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\r\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\r\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\r\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\r\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\r\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\r\n }; */\r\n\r\n /* String[] monthsEng = new String[12];\r\n Calendar c = Calendar.getInstance();\r\n for (int i = 1; i <= 12; i++) {\r\n c.set(0, 0, 0, 0, 0, 0);\r\n c.set(Calendar.MONTH, i);\r\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\r\n } */\r\n\r\n q = q.toLowerCase();\r\n for(let i = 0; i < 12; i++) {\r\n const month = months[i].toLowerCase();\r\n if(month.indexOf(q) === 0) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction getDayOfWeek(q: string) {\r\n const c = new Date();\r\n if(q.length <= 3) {\r\n return -1;\r\n }\r\n \r\n for(let i = 0; i < 7; i++) {\r\n c.setDate(c.getDate() + 1);\r\n \r\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\r\n return c.getDay();\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* export function stringMiddleOverflow(str: string, maxLength: number) {\r\n return str.length > maxLength ? str.slice(0, maxLength / 2 | 0) + '...' + str.slice(-Math.round(maxLength / 2)) : str; \r\n} */\r\n\r\nexport function limitSymbols(str: string, length: number, limitFrom = length + 10) {\r\n str = str.trim();\r\n if(str.length > limitFrom) {\r\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\r\n }\r\n\r\n return str;\r\n}\r\n\r\n// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\r\nexport function escapeRegExp(str: string) {\r\n return str\r\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\r\n .replace(/-/g, '\\\\x2d');\r\n}\r\n\r\nexport function encodeEntities(value: string) {\r\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\r\n var hi = value.charCodeAt(0);\r\n var low = value.charCodeAt(1);\r\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\r\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\r\n return '&#' + value.charCodeAt(0) + ';';\r\n }).replace(//g, '>');\r\n}\r\n\r\nexport function splitStringByLength(str: string, maxLength: number) {\r\n if(str.length < maxLength) return [str];\r\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\r\n const delimiter = ' ';//'\\n';\r\n const out: string[] = [];\r\n\r\n const cut = (end?: number) => {\r\n let part = str.slice(lastSliceStartIndex, end);\r\n const _arrayIndex = arrayIndex++;\r\n if(part.length > maxLength) {\r\n let overflowPart = part.slice(maxLength);\r\n const splitted = splitStringByLength(overflowPart, maxLength);\r\n splitted.forEach(part => {\r\n out[arrayIndex++] = part;\r\n });\r\n\r\n part = part.slice(0, maxLength);\r\n }\r\n\r\n lastSliceStartIndex = end;\r\n length = 0;\r\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\r\n };\r\n\r\n let lastIndex = 0;\r\n do {\r\n let index = str.indexOf(delimiter, lastIndex);\r\n if(index === -1) {\r\n if(lastIndex !== (str.length - 1)) {\r\n cut();\r\n }\r\n\r\n break;\r\n }\r\n\r\n index += delimiter.length;\r\n\r\n const partLength = index - lastIndex;\r\n if((length + partLength) > maxLength) {\r\n cut(length);\r\n }\r\n \r\n lastIndex = index;\r\n length += partLength;\r\n } while(true);\r\n\r\n return out;\r\n}\r\n\r\n// https://stackoverflow.com/a/14824756\r\n/* export const checkRTL = (s: string) => { \r\n const ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\r\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\r\n rtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']');\r\n\r\n return rtlDirCheck.test(s);\r\n}; */\r\n\r\n//(window as any).checkRTL = checkRTL;\r\n\r\nexport function convertInputKeyToKey(inputKey: string) {\r\n const str = inputKey.replace('input', '');\r\n return (str[0].toLowerCase() + str.slice(1)) as T;\r\n}\r\n\r\nexport function convertKeyToInputKey(key: string) {\r\n key = key[0].toUpperCase() + key.slice(1);\r\n key = 'input' + key;\r\n return key;\r\n}\r\n\r\nexport function capitalizeFirstLetter(string: string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n}\r\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\r\n\r\nexport function encodeEmoji(emojiText: string) {\r\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\r\n return codepoints;\r\n}\r\n\r\nconst vs16RegExp = /\\uFE0F/g;\r\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\r\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\r\n\r\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\r\n\r\nexport function toCodePoints(unicodeSurrogates: string): Array {\r\n const points = [];\r\n let char = 0;\r\n let previous = 0;\r\n let i = 0;\r\n while(i < unicodeSurrogates.length) {\r\n char = unicodeSurrogates.charCodeAt(i++);\r\n if(previous) {\r\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\r\n previous = 0;\r\n } else if (char > 0xd800 && char <= 0xdbff) {\r\n previous = char;\r\n } else {\r\n points.push(char.toString(16));\r\n }\r\n }\r\n\r\n if(points.length && points[0].length === 2) {\r\n points[0] = '00' + points[0];\r\n }\r\n\r\n return points;\r\n}\r\n\r\nexport function getEmojiToneIndex(input: string) {\r\n let match = input.match(/[\\uDFFB-\\uDFFF]/);\r\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\r\n}\r\n\r\nexport function getCountryEmoji(iso2: string) {\r\n return String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\r\n}\r\n\r\nexport function emojiFromCodePoints(codePoints: string) {\r\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\r\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.88ffeed61735d3f9b2f9.chunk.js b/public/12.28d471f14ee77650d243.chunk.js similarity index 99% rename from public/12.88ffeed61735d3f9b2f9.chunk.js rename to public/12.28d471f14ee77650d243.chunk.js index 5ece5fe73..cacfce7c4 100644 --- a/public/12.88ffeed61735d3f9b2f9.chunk.js +++ b/public/12.28d471f14ee77650d243.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[12,15,18,20,23],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),a=n(9),o=n(16),r=n(33),c=n(15),l=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(a.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},109:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(79),s=n(85),a=n(0),o=n(40);class r extends o.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let n;a.IS_APPLE?n=-.16*e:a.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let o,r,c,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(s.a)(this.value),o=i.formatted,r=i.country,l=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},121:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(54);class s{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},122:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(40);class s extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const s=this.value.length;if(s===e.length)e.onFill(this.value);else if(s===n)return;n=s})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),a=n(1),o=n(15),r=n(71);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const o=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,a=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),o=n-a/2,c=s-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let f=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),s=n(46),a=n(17),o=n(33),r=n(32),c=n(69),l=n(40),d=n(50),u=n(34),h=n(83),p=n(1),m=n(7),f=n(16),g=n(54),v=n(18),b=n(60),y=n(6),E=n(61),w=n(92),L=n(127),S=n(22),O=n(102),_=n(5),T=n(30),k=n(36),x=n(53),A=n(62),P=n(79),j=n(99),C=n(57),I=n(87),D=n(15),R=n(109),M=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let N,F=null;const U=new c.a("page-sign",!0,()=>{const e=()=>{t=f.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,B;const V=document.createElement("div");V.classList.add("input-wrapper");const q=new l.b({label:"Login.CountrySelectorLabel",name:Object(E.b)()});q.container.classList.add("input-select");const z=q.input,X=document.createElement("div");X.classList.add("select-wrapper","z-depth-3","hide");const Q=document.createElement("span");Q.classList.add("arrow","arrow-down"),q.container.append(Q);const K=document.createElement("ul");X.appendChild(K);new s.b(X);let W=()=>{W=null,t.forEach(e=>{const t=Object(j.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const s=document.createElement("li");let a=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=a,s.append(e)}else s.innerHTML=a;const o=Object(f.i18n)(e.default_name);o.dataset.defaultName=e.default_name,s.append(o);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,s.appendChild(c),n.push(s),K.append(s)}),c.set(e.iso2,n)}),K.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");Y(t)}),q.container.appendChild(X)};const Y=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,s=i.replace(/\D/g,"");Object(k.a)(z,Object(f.i18n)(n)),Object(C.a)(z,"input"),v=t.find(e=>e.default_name===n),B=v.country_codes.find(e=>e.country_code===s),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(P.a)(te,!0)},0)};let $;W(),z.addEventListener("focus",(function(e){W?W():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout($),$=void 0,X.classList.remove("hide"),X.offsetWidth,X.classList.add("active"),q.select(),Object(h.b)({container:U.pageEl.parentElement.parentElement,element:z,position:"start",margin:4}),setTimeout(()=>{J||(document.addEventListener("mousedown",G,{capture:!0}),J=!0)},0)}));let J=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==z&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),J=!1)},Z=()=>{void 0===$&&(X.classList.remove("active"),$=window.setTimeout(()=>{X.classList.add("hide"),$=void 0},200))};z.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=q.value.toLowerCase(),s=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&s.push(e)}),0===s.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===s.length&&"Enter"===n&&Y(c.get(s[0].iso2)[0])}),Q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),z.matches(":focus")?z.blur():z.focus()}));const ee=new R.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===q.value||v&&t&&n&&(v===t||B.country_code===n.country_code)||(Object(k.a)(z,t?Object(f.i18n)(t.default_name):i),v=t,B=n),t||ee.value.length-1>1?F.style.visibility="":F.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!F.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;a.default.pushToState("keepSigned",e),w.a.toggleStorage(e),L.a.toggleStorage(e),o.a.toggleStorage(e),A.a.toggleStorage(e)}),a.default.getState().then(e=>{a.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),F=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),F.style.visibility="hidden";const ie=e=>{e&&Object(_.a)(e);const t=Object(x.a)([F,N],!0);Object(k.a)(F,Object(f.i18n)("PleaseWait")),Object(i.f)(F);let s=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:s,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:s})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(k.a)(ee.label,Object(f.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(k.a)(F,Object(f.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),F.innerText=e.type}})};Object(T.b)(F,ie),N=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});N.addEventListener("click",()=>{S.default.mount()}),V.append(q.container,ee.container,ne.label,F,N);const se=document.createElement("h4");se.classList.add("text-center"),Object(f._i18n)(se,"Login.Title");const ae=document.createElement("div");ae.classList.add("subtitle","text-center"),Object(f._i18n)(ae,"Login.StartText"),U.pageEl.querySelector(".container").append(se,ae,V);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(V),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&f.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),s=[e.this_dc];let a;return e.nearest_dc!==e.this_dc&&(a=o.a.getNetworker(e.nearest_dc).then(()=>{s.push(e.nearest_dc)})),(a||Promise.resolve()).then(()=>{s.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield A.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{q.value.length||ee.value.length||Y(c.get(e.country)[0])})},()=>{F&&(Object(k.a)(F,Object(f.i18n)("Login.Next")),Object(v.ripple)(F,void 0,void 0,!0),F.removeAttribute("disabled")),N&&N.removeAttribute("disabled"),a.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U},22:function(e,t,n){"use strict";n.r(t);var i=n(33),s=n(69),a=n(78),o=n(56),r=n(7),c=n(34),l=n(16),d=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let v;const b=new s.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=b.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(d),Object(p.a)(s);const y=e.parentElement,E=document.createElement("h4");Object(l._i18n)(E,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),w.append(t)}),y.append(E,w,s),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),S=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let S=!1;u.default.addEventListener("user_auth",()=>{S=!0,v=null},{once:!0});let O,_={ignoreErrors:!0};const T=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(o.b)(O,c.token)){O=c.token;let n=Object(o.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const s=window.getComputedStyle(document.documentElement),a=s.getPropertyValue("--surface-color").trim(),r=s.getPropertyValue("--primary-text-color").trim(),l=s.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:d,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:a},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(s){let e=Date.now()/1e3,t=c.expires-e-a.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),S=!0,v=null;break;default:console.error("pageSignQR: default error:",e),S=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(S=!1;!S&&!(yield T(!0)););}))}))),v.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=b},23:function(e,t,n){"use strict";n.r(t);var i=n(38),s=n(17),a=n(33),o=n(69),r=n(20),c=n(121),l=n(122),d=n(16),u=n(61),h=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let m,f=null,g=null,v=null;const b=new o.a("page-authCode",!0,()=>{const e=f.type.length,t=new l.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{o(e)}});m=t.input,b.pageEl.querySelector(".input-wrapper").append(t.container);b.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const s=()=>{setTimeout(()=>{y.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:f.phone_number,phone_code_hash:f.phone_code_hash,phone_code:e};a.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":a.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),s();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(6),n.e(25)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:f.phone_number,phone_code_hash:f.phone_code_hash})}),s()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(21).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},g=b.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,y=new c.a(t,v);return g.append(y.container),y.load()},e=>{if(f=e,g){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else g=b.pageEl.getElementsByClassName("phone")[0],v=b.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(g.innerText=f.phone_number,f.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[f.type._]}Object(h.a)(v,Object(d.i18n)(t,n)),s.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(a,t,n)}function r(e,t,n){e.removeEventListener(a,t,n)}function c(e){Object(s.a)(e,a)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return O}));var i=n(29),s=n(5),a=n(30),o=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,a=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||a>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,b=null;function y(e,t){f(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,e=>{Object(s.a)(e),m()})),g.parentElement.insertBefore(b,g),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:a}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=o.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-a},intermediateY:t=8},p={top:u.y.top+a+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let w=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,w=!1},400),w=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),a=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{w?r():(t(a.touches[0]),r(),g&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},46:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var i=n(1),s=n(37),a=n(83),o=n(77),r=n(5);class c{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(t?"-"+t:""),s.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class l extends c{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollTop;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends c{constructor(e,t="",n=300,s=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=n,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),a=n(37),o=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),s=n(31),a=n(18),o=n(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const a=Object(s.d)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(a):a,this.setValueSilently(o),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(o._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,s,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(o(s>>>18&63),o(s>>>12&63),o(s>>>6&63),o(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function o(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=l(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return a})),n.d(t,"b",(function(){return r})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),s=n(45),a=n(29),o=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},78:function(e,t,n){"use strict";var i=n(29),s=n(62),a=n(33);const o=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),a.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},79:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(1);function s(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(n)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(e),a.collapse(!1),a.select()}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},85:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const s=new Map;let a=0;const o=(e,t,n="")=>{n=t.country_code+n,a=Math.max(a,n.length),s.set(n,{country:e,code:t})};function r(e){e=e||"",s.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{o(e,t,n)}):o(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,a);for(let e=r.length-1;e>=0&&(t=s.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const c=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=l.length-1;e>=0;--e){u=l[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=u&&u.length>n.length?u.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:c,code:t.code,leftPattern:m}}}}]); -//# sourceMappingURL=12.88ffeed61735d3f9b2f9.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[12,15,18,20,23],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),a=n(9),o=n(16),r=n(33),c=n(15),l=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==o.default.lastRequestedLangCode?Promise.all([e,o.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),o.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=o.default.strings.get(e.key);t&&(r.push(t),o.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(a.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{o.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),o.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},109:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(79),s=n(85),a=n(0),o=n(40);class r extends o.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let n;a.IS_APPLE?n=-.16*e:a.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let o,r,c,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(s.a)(this.value),o=i.formatted,r=i.country,l=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},121:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(54);class s{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const n=e.input;n.addEventListener("blur",()=>{this.playAnimation(0)}),n.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const n=this.needFrame>t?-1:1;this.animation.setDirection(n),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},122:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(40);class s extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let n=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const s=this.value.length;if(s===e.length)e.onFill(this.value);else if(s===n)return;n=s})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),a=n(1),o=n(15),r=n(72);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const o=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,a=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),o=n-a/2,c=s-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let f=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),s=n(46),a=n(17),o=n(33),r=n(32),c=n(69),l=n(40),d=n(50),u=n(34),h=n(83),p=n(1),m=n(7),f=n(16),g=n(54),v=n(18),b=n(60),y=n(6),E=n(61),w=n(92),L=n(127),S=n(22),O=n(102),_=n(5),T=n(30),k=n(36),x=n(53),A=n(62),P=n(79),j=n(99),C=n(57),I=n(87),D=n(15),R=n(109),M=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let N,F=null;const U=new c.a("page-sign",!0,()=>{const e=()=>{t=f.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),D.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,B;const V=document.createElement("div");V.classList.add("input-wrapper");const q=new l.b({label:"Login.CountrySelectorLabel",name:Object(E.b)()});q.container.classList.add("input-select");const z=q.input,X=document.createElement("div");X.classList.add("select-wrapper","z-depth-3","hide");const Q=document.createElement("span");Q.classList.add("arrow","arrow-down"),q.container.append(Q);const K=document.createElement("ul");X.appendChild(K);new s.b(X);let W=()=>{W=null,t.forEach(e=>{const t=Object(j.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const s=document.createElement("li");let a=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=a,s.append(e)}else s.innerHTML=a;const o=Object(f.i18n)(e.default_name);o.dataset.defaultName=e.default_name,s.append(o);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,s.appendChild(c),n.push(s),K.append(s)}),c.set(e.iso2,n)}),K.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");Y(t)}),q.container.appendChild(X)};const Y=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,s=i.replace(/\D/g,"");Object(k.a)(z,Object(f.i18n)(n)),Object(C.a)(z,"input"),v=t.find(e=>e.default_name===n),B=v.country_codes.find(e=>e.country_code===s),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(P.a)(te,!0)},0)};let $;W(),z.addEventListener("focus",(function(e){W?W():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout($),$=void 0,X.classList.remove("hide"),X.offsetWidth,X.classList.add("active"),q.select(),Object(h.b)({container:U.pageEl.parentElement.parentElement,element:z,position:"start",margin:4}),setTimeout(()=>{J||(document.addEventListener("mousedown",G,{capture:!0}),J=!0)},0)}));let J=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==z&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),J=!1)},Z=()=>{void 0===$&&(X.classList.remove("active"),$=window.setTimeout(()=>{X.classList.add("hide"),$=void 0},200))};z.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=q.value.toLowerCase(),s=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&s.push(e)}),0===s.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===s.length&&"Enter"===n&&Y(c.get(s[0].iso2)[0])}),Q.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),z.matches(":focus")?z.blur():z.focus()}));const ee=new R.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===q.value||v&&t&&n&&(v===t||B.country_code===n.country_code)||(Object(k.a)(z,t?Object(f.i18n)(t.default_name):i),v=t,B=n),t||ee.value.length-1>1?F.style.visibility="":F.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!F.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;a.default.pushToState("keepSigned",e),w.a.toggleStorage(e),L.a.toggleStorage(e),o.a.toggleStorage(e),A.a.toggleStorage(e)}),a.default.getState().then(e=>{a.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),F=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),F.style.visibility="hidden";const ie=e=>{e&&Object(_.a)(e);const t=Object(x.a)([F,N],!0);Object(k.a)(F,Object(f.i18n)("PleaseWait")),Object(i.f)(F);let s=ee.value;o.a.invokeApi("auth.sendCode",{phone_number:s,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:s})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(k.a)(ee.label,Object(f.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(k.a)(F,Object(f.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),F.innerText=e.type}})};Object(T.b)(F,ie),N=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});N.addEventListener("click",()=>{S.default.mount()}),V.append(q.container,ee.container,ne.label,F,N);const se=document.createElement("h4");se.classList.add("text-center"),Object(f._i18n)(se,"Login.Title");const ae=document.createElement("div");ae.classList.add("subtitle","text-center"),Object(f._i18n)(ae,"Login.StartText"),U.pageEl.querySelector(".container").append(se,ae,V);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(V),o.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=I.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&f.default.getLangPack(n.lang_code).then(()=>{Object(C.a)(te,"input")});const i=new Set([1,2,3,4,5]),s=[e.this_dc];let a;return e.nearest_dc!==e.this_dc&&(a=o.a.getNetworker(e.nearest_dc).then(()=>{s.push(e.nearest_dc)})),(a||Promise.resolve()).then(()=>{s.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield A.a.get(i))return t();setTimeout(()=>{o.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{q.value.length||ee.value.length||Y(c.get(e.country)[0])})},()=>{F&&(Object(k.a)(F,Object(f.i18n)("Login.Next")),Object(v.ripple)(F,void 0,void 0,!0),F.removeAttribute("disabled")),N&&N.removeAttribute("disabled"),a.default.pushToState("authState",{_:"authStateSignIn"})});t.default=U},22:function(e,t,n){"use strict";n.r(t);var i=n(33),s=n(69),a=n(78),o=n(56),r=n(7),c=n(34),l=n(16),d=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let v;const b=new s.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=b.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(d),Object(p.a)(s);const y=e.parentElement,E=document.createElement("h4");Object(l._i18n)(E,"Login.QR.Title");const w=document.createElement("ol");w.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),w.append(t)}),y.append(E,w,s),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),S=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let S=!1;u.default.addEventListener("user_auth",()=>{S=!0,v=null},{once:!0});let O,_={ignoreErrors:!0};const T=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(o.b)(O,c.token)){O=c.token;let n=Object(o.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const s=window.getComputedStyle(document.documentElement),a=s.getPropertyValue("--surface-color").trim(),r=s.getPropertyValue("--primary-text-color").trim(),l=s.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:d,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:a},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(s){let e=Date.now()/1e3,t=c.expires-e-a.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),S=!0,v=null;break;default:console.error("pageSignQR: default error:",e),S=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(S=!1;!S&&!(yield T(!0)););}))}))),v.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=b},23:function(e,t,n){"use strict";n.r(t);var i=n(38),s=n(17),a=n(33),o=n(69),r=n(20),c=n(121),l=n(122),d=n(16),u=n(61),h=n(36),p=function(e,t,n,i){return new(n||(n=Promise))((function(s,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function r(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,r)}c((i=i.apply(e,t||[])).next())}))};let m,f=null,g=null,v=null;const b=new o.a("page-authCode",!0,()=>{const e=f.type.length,t=new l.a({label:"Code",name:Object(u.b)(),length:e,onFill:e=>{o(e)}});m=t.input,b.pageEl.querySelector(".input-wrapper").append(t.container);b.pageEl.querySelector(".phone-edit").addEventListener("click",(function(){return r.default.mount()}));const s=()=>{setTimeout(()=>{y.remove()},300)},o=e=>{m.setAttribute("disabled","true");const i={phone_number:f.phone_number,phone_code_hash:f.phone_code_hash,phone_code:e};a.a.invokeApi("auth.signIn",i,{ignoreErrors:!0}).then(e=>{switch(e._){case"auth.authorization":a.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()}),s();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(6),n.e(25)]).then(n.bind(null,25)).then(e=>{e.default.mount({phone_number:f.phone_number,phone_code_hash:f.phone_code_hash})}),s()}}).catch(e=>p(void 0,void 0,void 0,(function*(){let i=!1;switch(e.type){case"SESSION_PASSWORD_NEEDED":i=!0,e.handled=!0,yield(yield n.e(21).then(n.bind(null,21))).default.mount(),setTimeout(()=>{m.value=""},300);break;case"PHONE_CODE_EXPIRED":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_EXPIRED"));break;case"PHONE_CODE_EMPTY":case"PHONE_CODE_INVALID":m.classList.add("error"),Object(h.a)(t.label,Object(d.i18n)("PHONE_CODE_INVALID"));break;default:t.label.innerText=e.type}i||t.select(),m.removeAttribute("disabled")})))},g=b.pageEl.querySelector(".auth-image"),v=i.b.isMobile?100:166,y=new c.a(t,v);return g.append(y.container),y.load()},e=>{if(f=e,g){m.value="";const e=document.createEvent("HTMLEvents");e.initEvent("input",!1,!0),m.dispatchEvent(e)}else g=b.pageEl.getElementsByClassName("phone")[0],v=b.pageEl.getElementsByClassName("sent-type")[0];let t,n;switch(g.innerText=f.phone_number,f.type._){case"auth.sentCodeTypeSms":t="Login.Code.SentSms";break;case"auth.sentCodeTypeApp":t="Login.Code.SentInApp";break;case"auth.sentCodeTypeCall":t="Login.Code.SentCall";break;default:t="Login.Code.SentUnknown",n=[f.type._]}Object(h.a)(v,Object(d.i18n)(t,n)),s.default.pushToState("authState",{_:"authStateAuthCode",sentCode:e})},()=>{m.focus()});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(a,t,n)}function r(e,t,n){e.removeEventListener(a,t,n)}function c(e){Object(s.a)(e,a)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return O}));var i=n(29),s=n(5),a=n(30),o=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,a=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||a>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,b=null;function y(e,t){f(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,e=>{Object(s.a)(e),m()})),g.parentElement.insertBefore(b,g),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:a}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=o.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-a},intermediateY:t=8},p={top:u.y.top+a+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let w=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,w=!1},400),w=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),a=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const o={capture:!0},r=()=>{clearTimeout(n),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),n=window.setTimeout(()=>{w?r():(t(a.touches[0]),r(),g&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},46:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var i=n(1),s=n(37),a=n(83),o=n(77),r=n(5);class c{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(t?"-"+t:""),s.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class l extends c{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollTop;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends c{constructor(e,t="",n=300,s=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=n,this.splitCount=s,this.container=a,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),a=n(37),o=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),s=n(31),a=n(18),o=n(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const a=Object(s.d)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(a):a,this.setValueSilently(o),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(o._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const s=document.createElement("div");s.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,s,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-a!=1||(n+=String.fromCharCode(o(s>>>18&63),o(s>>>12&63),o(s>>>6&63),o(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function o(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=l(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return a})),n.d(t,"b",(function(){return r})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),s=n(45),a=n(29),o=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},78:function(e,t,n){"use strict";var i=n(29),s=n(62),a=n(33);const o=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),a.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=o),t.a=o},79:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(1);function s(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(n)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(e),a.collapse(!1),a.select()}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},85:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const s=new Map;let a=0;const o=(e,t,n="")=>{n=t.country_code+n,a=Math.max(a,n.length),s.set(n,{country:e,code:t})};function r(e){e=e||"",s.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{o(e,t,n)}):o(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,a);for(let e=r.length-1;e>=0&&(t=s.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const c=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=l.length-1;e>=0;--e){u=l[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=u&&u.length>n.length?u.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:c,code:t.code,leftPattern:m}}}}]); +//# sourceMappingURL=12.28d471f14ee77650d243.chunk.js.map \ No newline at end of file diff --git a/public/12.88ffeed61735d3f9b2f9.chunk.js.map b/public/12.28d471f14ee77650d243.chunk.js.map similarity index 99% rename from public/12.88ffeed61735d3f9b2f9.chunk.js.map rename to public/12.28d471f14ee77650d243.chunk.js.map index 70035c4da..41b2d11f1 100644 --- a/public/12.88ffeed61735d3f9b2f9.chunk.js.map +++ b/public/12.28d471f14ee77650d243.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","TelInputField","options","super","label","name","pasted","lastValue","this","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","test","metaKey","ctrlKey","shiftKey","preventDefault","TrackingMonkey","inputField","size","max","needFrame","document","createElement","playAnimation","animation","frame","min","round","idleAnimation","stop","canvas","display","direction","setDirection","setSpeed","play","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","waitForFirstFrame","_animation","currentFrame","pause","CodeInputField","plainText","setAttribute","lastLength","slice","onFill","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","cancelBubble","stopPropagation","passive","button","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","_value","toLowerCase","matches","good","Boolean","indexOf","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","imageDiv","preloader","btnBack","helpList","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","diff","expires","serverTimeOffset","warn","handled","func","codeInput","authCode","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","monkey","params","phone_code_hash","phone_code","response","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","putPreloader","returnDiv","html","div","insertAdjacentHTML","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","timeout","onCancel","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","log","Error","onScroll","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","lastScrollTop","lastScrollDirection","loadedAll","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","offsetHeight","getDistanceToEnd","ScrollableX","splitCount","scrollHorizontally","deltaX","clientWidth","scrollLeft","deltaY","appNavigationController","navigations","manual","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","disable","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","reduce","acc","v","byteLength","tmp","ArrayBuffer","bytesFromWordss","o","bytesToWordss","words","Uint32Array","simulateEvent","findUpTag","tag","closest","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","createTextRange","textRange","moveToElementText","isSwipingBackSafari","TouchEvent","prefixes","maxPrefixLength","setPrefix","prefix","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","split","symbol","idx"],"mappings":"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","file":"12.88ffeed61735d3f9b2f9.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/pages/pageAuthCode.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","TelInputField","options","super","label","name","pasted","lastValue","this","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","test","metaKey","ctrlKey","shiftKey","preventDefault","TrackingMonkey","inputField","size","max","needFrame","document","createElement","playAnimation","animation","frame","min","round","idleAnimation","stop","canvas","display","direction","setDirection","setSpeed","play","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","waitForFirstFrame","_animation","currentFrame","pause","CodeInputField","plainText","setAttribute","lastLength","slice","onFill","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","cancelBubble","stopPropagation","passive","button","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","_value","toLowerCase","matches","good","Boolean","indexOf","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","imageDiv","preloader","btnBack","helpList","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","children","Array","from","timestamp","diff","expires","serverTimeOffset","warn","handled","func","codeInput","authCode","headerElement","sentTypeElement","CODELENGTH","codeInputField","submitCode","cleanup","monkey","params","phone_code_hash","phone_code","response","isMobile","load","_authCode","evt","createEvent","initEvent","dispatchEvent","getElementsByClassName","args","sentCode","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","putPreloader","returnDiv","html","div","insertAdjacentHTML","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","timeout","onCancel","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","log","Error","onScroll","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","lastScrollTop","lastScrollDirection","loadedAll","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","offsetHeight","getDistanceToEnd","ScrollableX","splitCount","scrollHorizontally","deltaX","clientWidth","scrollLeft","deltaY","appNavigationController","navigations","manual","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","disable","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","reduce","acc","v","byteLength","tmp","ArrayBuffer","bytesFromWordss","o","bytesToWordss","words","Uint32Array","simulateEvent","findUpTag","tag","closest","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","createTextRange","textRange","moveToElementText","isSwipingBackSafari","TouchEvent","prefixes","maxPrefixLength","setPrefix","prefix","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","split","symbol","idx"],"mappings":"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","file":"12.28d471f14ee77650d243.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AuthSentCode, AuthSentCodeType, AuthSignIn } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport pageSignIn from './pageSignIn';\r\nimport TrackingMonkey from '../components/monkeys/tracking';\r\nimport CodeInputField from '../components/codeInputField';\r\nimport { i18n, LangPackKey } from '../lib/langPack';\r\nimport { randomLong } from '../helpers/random';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthSentCode.authSentCode = null;\r\n\r\nlet headerElement: HTMLHeadElement = null;\r\nlet sentTypeElement: HTMLParagraphElement = null;\r\nlet codeInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const CODELENGTH = (authCode.type as AuthSentCodeType.authSentCodeTypeApp).length;\r\n\r\n const codeInputField = new CodeInputField({\r\n label: 'Code',\r\n name: randomLong(),\r\n length: CODELENGTH,\r\n onFill: (code) => {\r\n submitCode(code);\r\n }\r\n });\r\n\r\n codeInput = codeInputField.input as HTMLInputElement;\r\n\r\n page.pageEl.querySelector('.input-wrapper').append(codeInputField.container);\r\n\r\n const editButton = page.pageEl.querySelector('.phone-edit') as HTMLElement;\r\n\r\n editButton.addEventListener('click', function() {\r\n return pageSignIn.mount();\r\n });\r\n\r\n const cleanup = () => {\r\n setTimeout(() => {\r\n monkey.remove();\r\n }, 300);\r\n };\r\n\r\n const submitCode = (code: string) => {\r\n codeInput.setAttribute('disabled', 'true');\r\n\r\n const params: AuthSignIn = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n phone_code: code\r\n };\r\n\r\n //console.log('invoking auth.signIn with params:', params);\r\n\r\n apiManager.invokeApi('auth.signIn', params, {ignoreErrors: true})\r\n .then((response) => {\r\n //console.log('auth.signIn response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n apiManager.setUser(response.user);\r\n\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n cleanup();\r\n break;\r\n case 'auth.authorizationSignUpRequired':\r\n //console.log('Registration needed!');\r\n\r\n import('./pageSignUp').then(m => {\r\n m.default.mount({\r\n 'phone_number': authCode.phone_number,\r\n 'phone_code_hash': authCode.phone_code_hash\r\n });\r\n });\r\n\r\n cleanup();\r\n break;\r\n /* default:\r\n codeInput.innerText = response._;\r\n break; */\r\n }\r\n }).catch(async(err) => {\r\n let good = false;\r\n switch(err.type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n //console.warn('pageAuthCode: SESSION_PASSWORD_NEEDED');\r\n good = true;\r\n err.handled = true;\r\n await (await import('./pagePassword')).default.mount(); // lol\r\n setTimeout(() => {\r\n codeInput.value = '';\r\n }, 300);\r\n break;\r\n case 'PHONE_CODE_EXPIRED':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_EXPIRED'));\r\n break;\r\n case 'PHONE_CODE_EMPTY':\r\n case 'PHONE_CODE_INVALID':\r\n codeInput.classList.add('error');\r\n replaceContent(codeInputField.label, i18n('PHONE_CODE_INVALID'));\r\n break;\r\n default:\r\n codeInputField.label.innerText = err.type;\r\n break;\r\n }\r\n\r\n if(!good) {\r\n codeInputField.select();\r\n }\r\n\r\n codeInput.removeAttribute('disabled');\r\n });\r\n };\r\n\r\n const imageDiv = page.pageEl.querySelector('.auth-image') as HTMLDivElement;\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new TrackingMonkey(codeInputField, size);\r\n imageDiv.append(monkey.container);\r\n return monkey.load();\r\n};\r\n\r\nconst page = new Page('page-authCode', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n if(!headerElement) {\r\n headerElement = page.pageEl.getElementsByClassName('phone')[0] as HTMLHeadElement;\r\n sentTypeElement = page.pageEl.getElementsByClassName('sent-type')[0] as HTMLParagraphElement;\r\n } else {\r\n codeInput.value = '';\r\n\r\n const evt = document.createEvent('HTMLEvents');\r\n evt.initEvent('input', false, true);\r\n codeInput.dispatchEvent(evt);\r\n }\r\n\r\n headerElement.innerText = authCode.phone_number;\r\n let key: LangPackKey, args: any[];\r\n switch(authCode.type._) {\r\n case 'auth.sentCodeTypeSms':\r\n key = 'Login.Code.SentSms';\r\n break;\r\n case 'auth.sentCodeTypeApp': \r\n key = 'Login.Code.SentInApp';\r\n break;\r\n case 'auth.sentCodeTypeCall': \r\n key = 'Login.Code.SentCall';\r\n break;\r\n default:\r\n key = 'Login.Code.SentUnknown';\r\n args = [authCode.type._];\r\n break;\r\n }\r\n\r\n replaceContent(sentTypeElement, i18n(key, args));\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateAuthCode', sentCode: _authCode});\r\n}, () => {\r\n codeInput.focus();\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.20324e79c22f5893ae52.chunk.js b/public/13.6f53ed67b434abfeb8b3.chunk.js similarity index 99% rename from public/13.20324e79c22f5893ae52.chunk.js rename to public/13.6f53ed67b434abfeb8b3.chunk.js index 61ed68d80..c5e19a18b 100644 --- a/public/13.20324e79c22f5893ae52.chunk.js +++ b/public/13.6f53ed67b434abfeb8b3.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[13,17,21],{100:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},101:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;t{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},107:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(90);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},110:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(54);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},18:function(t,e,i){"use strict";i.r(e),i.d(e,"ripple",(function(){return c}));var n=i(6),s=i(66),a=i(1),o=i(15),r=i(71);let l=0;function c(t,e=(()=>Promise.resolve()),i=null,c=!1,u=t){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let h;t.classList.contains("rp-square")&&d.classList.add("is-square"),t[c?"prepend":"append"](d);const p=(t,n)=>{const o=Date.now(),r=document.createElement("div"),c=l++,u=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{r.remove()}),i&&i(c)};if(tr.classList.add("hiding"),Math.max(i-u/2,0)),setTimeout(e,i)}else r.classList.add("hiding"),setTimeout(e,u/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,g=!1},e&&e(c),window.requestAnimationFrame(()=>{const e=d.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=t-e.left,s=n-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(i-e.width/2)+e.width/2,2)),o=i-a/2,l=s-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",d.append(r)})},m=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(n.a)(e.target,"c-ripple")!==d)&&(u===t||!Object(r.a)(e.target,u));let g=!1;if(a.IS_TOUCH_SUPPORTED){let t=()=>{h&&h()};u.addEventListener("touchstart",e=>{if(!o.default.settings.animationsEnabled)return;if(e.touches.length>1||g||m(e))return;g=!0;let{clientX:i,clientY:n}=e.touches[0];p(i,n),u.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",e=>{e.cancelBubble=!0,e.stopPropagation(),t(),u.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else u.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===u.dataset.ripple||m(t))return;if(g)return void(g=!1);let{clientX:e,clientY:i}=t;p(e,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(38),a=i(17),o=i(86),r=i(69),l=i(34),c=i(103),u=i(110),d=i(32),h=i(16),p=i(93),m=i(5),g=i(30),f=i(94),v=i(36),b=i(53);let w;const y=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let y;w=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(y||(y=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(v.a)(r.label,Object(f.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const S=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(b.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),O&&O.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),L()})};Object(g.b)(e,S),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return S()}));const T=s.b.isMobile?100:166,O=new u.a(r,T);return t.imageDiv.append(O.container),Promise.all([O.load(),L()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},30:function(t,e,i){"use strict";i.d(e,"a",(function(){return a})),i.d(e,"b",(function(){return o})),i.d(e,"c",(function(){return r})),i.d(e,"d",(function(){return l}));var n=i(1),s=i(57);const a=n.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,i={}){const n=i.listenerSetter?i.listenerSetter.add(t):t.addEventListener.bind(t);i.touchMouseDown=!0,n(a,e,i)}function r(t,e,i){t.removeEventListener(a,e,i)}function l(t){Object(s.a)(t,a)}},34:function(t,e,i){"use strict";var n=i(16),s=i(18);e.a=(t,e={})=>{const i=document.createElement(e.asDiv?"div":"button");return i.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&i.classList.add("rp-square"),Object(s.ripple)(i)),e.onlyMobile&&i.classList.add("only-handhelds"),e.disabled&&i.setAttribute("disabled","true"),e.text&&i.append(Object(n.i18n)(e.text)),i}},35:function(t,e,i){"use strict";i.d(e,"f",(function(){return d})),i.d(e,"g",(function(){return h})),i.d(e,"c",(function(){return g})),i.d(e,"d",(function(){return w})),i.d(e,"e",(function(){return y})),i.d(e,"b",(function(){return S})),i.d(e,"a",(function(){return T}));var n=i(29),s=i(5),a=i(30),o=i(38),r=i(1),l=i(0),c=i(15),u=i(49);function d(t,e=!1){const i='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=i,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",i),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,d(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}n.a.putPreloader=d;let p=t=>{let e=f.getBoundingClientRect(),{clientX:i,clientY:n}=t,s=i>=e.right?i-e.right:e.left-i,a=n>=e.bottom?n-e.bottom:e.top-n;(s>=100||a>=100)&&g()};const m=t=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function w(t,e){g(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{g()}}),f=t,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),f.parentElement.insertBefore(b,f),v=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:t,pageY:e},i,n){let{scrollWidth:s,scrollHeight:a}=i;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;n=o.b.isMobile?"right":"left";let u="top";const d={x:{left:t,right:t-s},intermediateX:"right"===n?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:d.y.top+a+8<=c,bottom:d.y.bottom-8>=8};{let t;t=h[n]?d.x[n]:(n="center",d.intermediateX),i.style.left=t+"px"}{let t;t=p[u]?d.y[u]:(u="center",d.intermediateY),i.style.top=t+"px"}i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===u?u:"bottom")+"-"+("center"===n?n:"left"===n?"right":"left"))}let E=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function T(t,e,i){const n=i?i.add(t):t.addEventListener.bind(t),a=i?i.removeManual.bind(i,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let i;const o={capture:!0},r=()=>{clearTimeout(i),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};n("touchstart",a=>{a.touches.length>1?r():(n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o),i=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),f&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else n("contextmenu",r.IS_TOUCH_SUPPORTED?i=>{e(i),f&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},40:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(57),s=i(100),a=i(90),o=i(107);var r=i(16),l=i(32),c=i(65);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r._i18n)(d,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},49:function(t,e,i){"use strict";var n=i(29),s=i(0),a=i(37),o=i(8),r=i(5),l=i(39),c=i(82);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const i=this.navigations.pop();i?(this.manual=!t,this.handleItem(i)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const i=this.navigations[e];if(i.type===t)return{item:i,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){t&&Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let i=this.navigations.length-1;i>=0;--i){if(this.navigations[i].type===t&&(this.navigations.splice(i,1),e))break}}};n.a.appNavigationController=u,e.a=u},53:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";function n(t,e){const i=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(i)}i.d(e,"a",(function(){return n}))},65:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},66:function(t,e,i){"use strict";var n=i(44),s=i(45),a=i(29),o=i(68);const r=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(t,e){let i=this.promises[t];return i||(this.scheduleFlush(),i=this.promises[t]=Object(s.a)()),void 0!==e&&i.then(()=>e()),i}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const i=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&i.then(()=>e()),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),e.a=r},82:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(0);function s(t){return n.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},86:function(t,e,i){"use strict";var n=i(29),s=i(33);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(32),a=i(101);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},93:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},94:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); -//# sourceMappingURL=13.20324e79c22f5893ae52.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[13,17,21],{100:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},101:function(t,e,i){"use strict";i.d(e,"b",(function(){return n})),i.d(e,"a",(function(){return a}));const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face="monospace"], pre',entityName:"messageEntityPre"},strikethrough:{match:'[style*="line-through"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},s=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR"]);function a(t,e,i,o,r,l,c={offset:0}){if(3===t.nodeType){let e=t.nodeValue;if(o===t?i.push(e.substr(0,r)+""+e.substr(r)):i.push(e),l&&e.length&&t.parentNode){const i=t.parentElement;for(const t in n){const s=n[t],a=i.closest(s.match+", [contenteditable]");null===(null==a?void 0:a.getAttribute("contenteditable"))&&("messageEntityTextUrl"===s.entityName?l.push({_:s.entityName,url:a.href,offset:c.offset,length:e.length}):"messageEntityMentionName"===s.entityName?l.push({_:s.entityName,offset:c.offset,length:e.length,user_id:a.dataset.follow.toUserId()}):l.push({_:s.entityName,offset:c.offset,length:e.length}))}}return void(c.offset+=e.length)}if(1!==t.nodeType)return;const u=o===t,d=s.has(t.tagName);if(d&&i.length)e.push(i.join("")),i.splice(0,i.length),++c.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),c.offset+=e.length)}u&&!r&&i.push("");const h=t.matches('[style*="table-cell"], th, td'),p=null==l?void 0:l.length;let m=t.firstChild;for(;m;)a(m,e,i,o,r,l,c),m=m.nextSibling;if(u&&r&&i.push(""),h&&t.nextSibling&&(i.push(" "),++c.offset,void 0!==p))for(let t=p,e=l.length;t{Object(n.a)(t),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const e=this.input;e.type="password",e.setAttribute("required",""),e.name="notsearch_password",e.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",e.parentElement.prepend(i),e.parentElement.insertBefore(i.cloneNode(),e.nextSibling);const s=this.toggleVisible=document.createElement("span");s.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(s),s.addEventListener("click",this.onVisibilityClick),s.addEventListener("touchend",this.onVisibilityClick)}}},107:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(90);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},110:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(54);class s{constructor(t,e){this.passwordInputField=t,this.size=e,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=n.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(t=>(this.animation=t,this.animation.addEventListener("enterFrame",t=>{(1===this.animation.direction&&t>=this.needFrame||-1===this.animation.direction&&t<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},n.a.waitForFirstFrame(t)))}remove(){this.animation&&this.animation.remove()}}},18:function(t,e,i){"use strict";i.r(e),i.d(e,"ripple",(function(){return c}));var n=i(6),s=i(66),a=i(1),o=i(15),r=i(72);let l=0;function c(t,e=(()=>Promise.resolve()),i=null,c=!1,u=t){if(t.querySelector(".c-ripple"))return;t.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let h;t.classList.contains("rp-square")&&d.classList.add("is-square"),t[c?"prepend":"append"](d);const p=(t,n)=>{const o=Date.now(),r=document.createElement("div"),c=l++,u=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let t=Date.now()-o;const e=()=>{s.a.mutate(()=>{r.remove()}),i&&i(c)};if(tr.classList.add("hiding"),Math.max(i-u/2,0)),setTimeout(e,i)}else r.classList.add("hiding"),setTimeout(e,u/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,g=!1},e&&e(c),window.requestAnimationFrame(()=>{const e=d.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=t-e.left,s=n-e.top,a=Math.sqrt(Math.pow(Math.abs(s-e.height/2)+e.height/2,2)+Math.pow(Math.abs(i-e.width/2)+e.width/2,2)),o=i-a/2,l=s-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",d.append(r)})},m=e=>e.target!==t&&(["BUTTON","A"].includes(e.target.tagName)||Object(n.a)(e.target,"c-ripple")!==d)&&(u===t||!Object(r.a)(e.target,u));let g=!1;if(a.IS_TOUCH_SUPPORTED){let t=()=>{h&&h()};u.addEventListener("touchstart",e=>{if(!o.default.settings.animationsEnabled)return;if(e.touches.length>1||g||m(e))return;g=!0;let{clientX:i,clientY:n}=e.touches[0];p(i,n),u.addEventListener("touchend",t,{once:!0}),window.addEventListener("touchmove",e=>{e.cancelBubble=!0,e.stopPropagation(),t(),u.removeEventListener("touchend",t)},{once:!0})},{passive:!0})}else u.addEventListener("mousedown",t=>{if(![0,2].includes(t.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===u.dataset.ripple||m(t))return;if(g)return void(g=!1);let{clientX:e,clientY:i}=t;p(e,i),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},21:function(t,e,i){"use strict";i.r(e);var n=i(35),s=i(38),a=i(17),o=i(86),r=i(69),l=i(34),c=i(103),u=i(110),d=i(32),h=i(16),p=i(93),m=i(5),g=i(30),f=i(94),v=i(36),b=i(53);let w;const y=new r.a("page-password",!0,()=>{const t=new p.a({className:"page-password",withInputWrapper:!0,titleLangKey:"Login.Password.Title",subtitleLangKey:"Login.Password.Subtitle"}),e=Object(l.a)("btn-primary btn-color-primary"),a=new h.default.IntlElement({key:"Login.Next"});e.append(a.element);const r=new c.a({label:"LoginPassword",name:"password"});let y;w=r.input,t.inputWrapper.append(r.container,e);let E,L=()=>(y||(y=window.setInterval(L,1e4)),o.a.getState().then(t=>{E=t,E.hint?Object(v.a)(r.label,Object(f.a)(d.b.wrapEmojiText(E.hint))):r.setLabel()}));const S=t=>{if(t&&Object(m.a)(t),!w.value.length)return void w.classList.add("error");const s=Object(b.a)([w,e],!0);let l=w.value;a.update({key:"PleaseWait"});const c=Object(n.f)(e);r.setValueSilently(""+Math.random()),r.setValueSilently(l),o.a.check(l,E).then(t=>{switch(t._){case"auth.authorization":clearInterval(y),i.e(4).then(i.bind(null,19)).then(t=>{t.default.mount()}),O&&O.remove();break;default:e.removeAttribute("disabled"),a.update({key:t._}),c.remove()}}).catch(t=>{s(),r.input.classList.add("error"),t.type,a.update({key:"PASSWORD_HASH_INVALID"}),w.select(),c.remove(),L()})};Object(g.b)(e,S),w.addEventListener("keypress",(function(t){if(this.classList.remove("error"),a.update({key:"Login.Next"}),"Enter"===t.key)return S()}));const T=s.b.isMobile?100:166,O=new u.a(r,T);return t.imageDiv.append(O.container),Promise.all([O.load(),L()])},null,()=>{w.focus(),a.default.pushToState("authState",{_:"authStatePassword"})});e.default=y},30:function(t,e,i){"use strict";i.d(e,"a",(function(){return a})),i.d(e,"b",(function(){return o})),i.d(e,"c",(function(){return r})),i.d(e,"d",(function(){return l}));var n=i(1),s=i(57);const a=n.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(t,e,i={}){const n=i.listenerSetter?i.listenerSetter.add(t):t.addEventListener.bind(t);i.touchMouseDown=!0,n(a,e,i)}function r(t,e,i){t.removeEventListener(a,e,i)}function l(t){Object(s.a)(t,a)}},34:function(t,e,i){"use strict";var n=i(16),s=i(18);e.a=(t,e={})=>{const i=document.createElement(e.asDiv?"div":"button");return i.className=t+(e.icon?" tgico-"+e.icon:""),e.noRipple||(e.rippleSquare&&i.classList.add("rp-square"),Object(s.ripple)(i)),e.onlyMobile&&i.classList.add("only-handhelds"),e.disabled&&i.setAttribute("disabled","true"),e.text&&i.append(Object(n.i18n)(e.text)),i}},35:function(t,e,i){"use strict";i.d(e,"f",(function(){return d})),i.d(e,"g",(function(){return h})),i.d(e,"c",(function(){return g})),i.d(e,"d",(function(){return w})),i.d(e,"e",(function(){return y})),i.d(e,"b",(function(){return S})),i.d(e,"a",(function(){return T}));var n=i(29),s=i(5),a=i(30),o=i(38),r=i(1),l=i(0),c=i(15),u=i(49);function d(t,e=!1){const i='\n \n \n ';if(e){const e=document.createElement("div");return e.classList.add("preloader"),e.innerHTML=i,t&&t.appendChild(e),e}return t.insertAdjacentHTML("beforeend",i),t.lastElementChild}function h(t,e="check"){return t.classList.remove("tgico-"+e),t.disabled=!0,d(t),()=>{t.innerHTML="",t.classList.add("tgico-"+e),t.removeAttribute("disabled")}}n.a.putPreloader=d;let p=t=>{let e=f.getBoundingClientRect(),{clientX:i,clientY:n}=t,s=i>=e.right?i-e.right:e.left-i,a=n>=e.bottom?n-e.bottom:e.top-n;(s>=100||a>=100)&&g()};const m=t=>{g()},g=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),b&&b.remove(),f=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||u.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&g()});let f=null,v=null,b=null;function w(t,e){g(),l.IS_MOBILE_SAFARI||u.a.pushItem({type:"menu",onPop:t=>{g()}}),f=t,f.classList.add("active"),f.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(a.a,t=>{Object(s.a)(t),m()})),f.parentElement.insertBefore(b,f),v=e,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:t,pageY:e},i,n){let{scrollWidth:s,scrollHeight:a}=i;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;n=o.b.isMobile?"right":"left";let u="top";const d={x:{left:t,right:t-s},intermediateX:"right"===n?8:l-s-8,y:{top:e,bottom:e-a},intermediateY:e=8},p={top:d.y.top+a+8<=c,bottom:d.y.bottom-8>=8};{let t;t=h[n]?d.x[n]:(n="center",d.intermediateX),i.style.left=t+"px"}{let t;t=p[u]?d.y[u]:(u="center",d.intermediateY),i.style.top=t+"px"}i.className=i.className.replace(/(top|center|bottom)-(left|center|right)/g,""),i.classList.add(("center"===u?u:"bottom")+"-"+("center"===n?n:"left"===n?"right":"left"))}let E=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function T(t,e,i){const n=i?i.add(t):t.addEventListener.bind(t),a=i?i.removeManual.bind(i,t):t.removeEventListener.bind(t);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let i;const o={capture:!0},r=()=>{clearTimeout(i),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};n("touchstart",a=>{a.touches.length>1?r():(n("touchmove",r,o),n("touchend",r,o),n("touchcancel",r,o),i=window.setTimeout(()=>{E?r():(e(a.touches[0]),r(),f&&t.addEventListener("touchend",s.a,{once:!0}))},400))})}else n("contextmenu",r.IS_TOUCH_SUPPORTED?i=>{e(i),f&&t.addEventListener("touchend",s.a,{once:!0})}:e)}},36:function(t,e,i){"use strict";function n(t,e){if("string"==typeof e)return void(t.innerHTML=e);const i=t.firstChild;i?t.lastChild===i?i.replaceWith(e):(t.textContent="",t.append(e)):t.append(e)}i.d(e,"a",(function(){return n}))},40:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(57),s=i(100),a=i(90),o=i(107);var r=i(16),l=i(32),c=i(65);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(t.originalEvent||t).clipboardData.getData("text/plain"),o=!0,r=(t.originalEvent||t).clipboardData.getData("text/html");if(r.trim()){r=r.replace(//,""),r=r.replace(//,"");const t=r.match(/([\s\S]*)<\/body>/);t&&(r=t[1].trim());let s=document.createElement("span");s.innerHTML=r;let c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));e.b=class{constructor(t={}){this.options=t,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=t.required,this.validate=t.validate,void 0!==t.maxLength&&void 0===t.showLengthOn&&(t.showLengthOn=Math.min(40,Math.round(t.maxLength/3)));const{placeholder:e,maxLength:i,showLengthOn:n,name:s,plainText:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r._i18n)(d,e,void 0,"placeholder"),this.inputFake&&Object(r._i18n)(this.inputFake,e,void 0,"placeholder")),p||e){const t=document.createElement("div");t.classList.add("input-field-border"),this.container.append(t)}if(p&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const t=this.container.lastElementChild;let e=!1;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}select(){this.value&&(this.options.plainText?this.input.select():function(t){const e=document.createRange();e.selectNodeContents(t);const i=window.getSelection();i.removeAllRanges(),i.addRange(e)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.i18n)(this.options.label,this.options.labelOptions))}onFakeInput(t=!0){const{scrollHeight:e}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===e)return;const n=Math.round(50*Math.log(Math.abs(e-i)));this.input.style.transitionDuration=n+"ms",t&&(this.input.style.height=e?e+"px":"");Object(c.a)(this.input,"is-changing-height",!0,n,()=>{this.input.classList.remove("is-changing-height")})}get value(){return this.options.plainText?this.input.value:Object(a.a)(this.input,!1).value}set value(t){this.setValueSilently(t,!1),Object(n.a)(this.input,"input")}setValueSilently(t,e=!0){this.options.plainText?this.input.value=t:(this.input.innerHTML=t,this.inputFake&&(this.inputFake.innerHTML=t,e&&this.onFakeInput()))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!Object(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.b.wrapDraftText(t)),e?this.setValueSilently(t,!1):this.value=t}setOriginalValue(t="",e=!1){this.originalValue=t,this.setDraftValue(t,e)}setState(t,e){e&&(this.label.textContent="",this.label.append(Object(r.i18n)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},49:function(t,e,i){"use strict";var n=i(29),s=i(0),a=i(37),o=i(8),r=i(5),l=i(39),c=i(82);const u=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let t=!1;if(window.addEventListener("popstate",e=>{if(this.debug&&this.log("popstate",e,t),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(e.state!==this.id)return void this.pushState();const i=this.navigations.pop();i?(this.manual=!t,this.handleItem(i)):this.pushState()}),window.addEventListener("keydown",t=>{const e=this.navigations[this.navigations.length-1];e&&("Escape"!==t.key||e.onEscape&&!e.onEscape()||(Object(r.a)(t),this.back(e.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(e)&&(t=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{t=!1},100)},{passive:!0,once:!0})))},e)}history.scrollRestoration="manual",this.pushState()}handleItem(t){const e=t.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",t,this.navigations),!1===e?this.pushItem(t):t.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(t){for(let e=this.navigations.length-1;e>=0;--e){const i=this.navigations[e];if(i.type===t)return{item:i,index:e}}}back(t){if(t){const e=this.findItemByType(t);if(e)return void this.backByItem(e.item,e.index)}history.back()}backByItem(t,e=this.navigations.indexOf(t)){this.manual=!0,this.navigations.splice(e,1),this.handleItem(t)}pushItem(t){this.navigations.push(t),this.debug&&this.log("pushstate",t,this.navigations),t.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(t){t&&Object(l.e)(this.navigations,t)}removeByType(t,e=!1){for(let i=this.navigations.length-1;i>=0;--i){if(this.navigations[i].type===t&&(this.navigations.splice(i,1),e))break}}};n.a.appNavigationController=u,e.a=u},53:function(t,e,i){"use strict";function n(t,e){return e?t.forEach(t=>t.setAttribute("disabled","true")):t.forEach(t=>t.removeAttribute("disabled")),()=>n(t,!e)}i.d(e,"a",(function(){return n}))},57:function(t,e,i){"use strict";function n(t,e){const i=new Event(e,{bubbles:!0,cancelable:!0});t.dispatchEvent(i)}i.d(e,"a",(function(){return n}))},65:function(t,e,i){"use strict";var n=i(15);const s=(t,e,i,a,o,r)=>{const{timeout:l,raf:c}=t.dataset;if(void 0!==l&&clearTimeout(+l),void 0!==c&&(window.cancelAnimationFrame(+c),r||delete t.dataset.raf),r&&n.default.settings.animationsEnabled&&a)return void(t.dataset.raf=""+window.requestAnimationFrame(()=>{delete t.dataset.raf,s(t,e,i,a,o,r-1)}));i&&e&&t.classList.add(e);const u=()=>{delete t.dataset.timeout,!i&&e&&t.classList.remove("backwards",e),t.classList.remove("animating"),o&&o()};if(!n.default.settings.animationsEnabled||!a)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(u,a)};e.a=s},66:function(t,e,i){"use strict";var n=i(44),s=i(45),a=i(29),o=i(68);const r=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(t,e){let i=this.promises[t];return i||(this.scheduleFlush(),i=this.promises[t]=Object(s.a)()),void 0!==e&&i.then(()=>e()),i}measure(t){return this.do("read",t)}mutate(t){return this.do("write",t)}mutateElement(t,e){const i=Object(o.a)(t)?this.mutate():Promise.resolve();return void 0!==e&&i.then(()=>e()),i}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),e.a=r},82:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(0);function s(t){return n.IS_MOBILE_SAFARI&&t instanceof TouchEvent&&t.touches[0].clientX<30}},86:function(t,e,i){"use strict";var n=i(29),s=i(33);const a=new class{getState(){return s.a.invokeApi("account.getPassword").then(t=>t)}updateSettings(t={}){return this.getState().then(e=>{let i,n;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:t.hint,email:t.email}};i=t.currentPassword?s.a.invokeCrypto("computeSRP",t.currentPassword,e,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=e.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,n=t.newPassword?s.a.invokeCrypto("computeSRP",t.newPassword,e,!0):Promise.resolve(new Uint8Array),Promise.all([i,n]).then(t=>(a.password=t[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=t[1],s.a.invokeApi("account.updatePasswordSettings",a)))})}check(t,e,i={}){return s.a.invokeCrypto("computeSRP",t,e,!1).then(t=>s.a.invokeApi("auth.checkPassword",{password:t},i).then(t=>("auth.authorization"===t._&&s.a.setUser(t.user),t)))}confirmPasswordEmail(t){return s.a.invokeApi("account.confirmPasswordEmail",{code:t})}resendPasswordEmail(){return s.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return s.a.invokeApi("account.cancelPasswordEmail")}};n.a.passwordManager=a,e.a=a},90:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(29),s=i(32),a=i(101);function o(t,e=!0){const i=[],n=[],o=e?[]:void 0;Object(a.a)(t,i,n,void 0,void 0,o),n.length&&i.push(n.join(""));let r=i.join("\n");return r=r.replace(/\u00A0/g," "),(null==o?void 0:o.length)&&(s.b.combineSameEntities(o),s.b.sortEntities(o)),{value:r,entities:o}}n.a.getRichValue=o},93:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(16);class s{constructor(t){this.element=document.body.querySelector("."+t.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),t.titleLangKey&&this.title.append(Object(n.i18n)(t.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",t.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(t.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),t.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}},94:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=13.6f53ed67b434abfeb8b3.chunk.js.map \ No newline at end of file diff --git a/public/13.20324e79c22f5893ae52.chunk.js.map b/public/13.6f53ed67b434abfeb8b3.chunk.js.map similarity index 99% rename from public/13.20324e79c22f5893ae52.chunk.js.map rename to public/13.6f53ed67b434abfeb8b3.chunk.js.map index f1593c705..973367b87 100644 --- a/public/13.20324e79c22f5893ae52.chunk.js.map +++ b/public/13.6f53ed67b434abfeb8b3.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","prepend","insertBefore","cloneNode","container","append","addEventListener","isInputEmpty","element","hasAttribute","value","trim","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","isRippleUnneeded","target","includes","touchEnd","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","label","getStateInterval","inputWrapper","state","getState","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","update","preloader","setValueSilently","random","check","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","all","load","focus","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","replaceContent","lastChild","replaceWith","textContent","init","preventDefault","originalEvent","clipboardData","getData","usePlainText","span","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","showingLength","wasError","inputLength","diff","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","appNavigationController","navigations","id","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","index","ret","findItemByType","backByItem","indexOf","noHistory","origin","pathname","single","toggleDisability","elements","disable","forEach","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","write","isSwipingBackSafari","TouchEvent","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","field","withEntities","combineSameEntities","sortEntities","LoginPage","title","subtitle","htmlToSpan"],"mappings":"6FAMe,SAASA,EAAgBC,EAASC,GAC/C,OAAOD,EAAGE,QAAQ,IAAID,MAPxB,mC,iCCAA,oEAoBO,MAAME,EAAsD,CACjEC,KAAM,CACJC,MAAO,+IACPC,WAAY,qBAEdC,UAAW,CACTF,MAAO,+BACPC,WAAY,0BAEdE,OAAQ,CACNH,MAAO,2BACPC,WAAY,uBAEdG,UAAW,CACTJ,MAAO,gDACPC,WAAY,oBAEdI,cAAe,CACbL,MAAO,0CACPC,WAAY,uBAEdK,KAAM,CACJN,MAAO,iBACPC,WAAY,wBAEdM,YAAa,CACXP,MAAO,WACPC,WAAY,4BAEdO,QAAS,CACPR,MAAO,qBACPC,WAAY,yBAoBVQ,EAAkB,IAAIC,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASC,EAAoBC,EAAmBC,EAAiBC,EAAgBC,EAAgBC,EAAoBC,EAA4BC,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBN,EAAKO,SAAgB,CACtB,IAAIC,EAAYR,EAAKQ,UAerB,GANGL,IAAYH,EACbE,EAAKO,KAAKD,EAAUE,OAAO,EAAGN,GAAa,IAASI,EAAUE,OAAON,IAErEF,EAAKO,KAAKD,GAGTH,GAAYG,EAAUG,QACpBX,EAAKY,WAAY,CAClB,MAAMC,EAAgBb,EAAKa,cAG3B,IAAI,MAAMC,KAAQ5B,EAAc,CAC9B,MAAM6B,EAAM7B,EAAa4B,GACnB7B,EAAU4B,EAAc5B,QAAQ8B,EAAI3B,MAAQ,uBACF,QAA7CH,aAAO,EAAPA,EAAS+B,aAAa,sBAUH,yBAAnBD,EAAI1B,WACLgB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACP6B,IAAMjC,EAA8BkC,KACpCb,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,SAEO,6BAAnBI,EAAI1B,WACZgB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACPiB,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,OAClBS,QAAUnC,EAAwBoC,QAAQC,OAAOC,aAGnDlB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACPiB,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,WAQ5B,YADAL,EAAOA,QAAUE,EAAUG,QAI7B,GAAqB,IAAlBX,EAAKO,SACN,OAGF,MAAMiB,EAAarB,IAAYH,EACzByB,EAAU5B,EAAgB6B,IAAI1B,EAAK2B,SACzC,GAAGF,GAAWvB,EAAKS,OACjBV,EAAMQ,KAAKP,EAAK0B,KAAK,KACrB1B,EAAK2B,OAAO,EAAG3B,EAAKS,UAClBL,EAAOA,YACJ,GAAGN,aAAgB8B,iBAAkB,CAC1C,MAAMC,EAAM/B,EAAK+B,IACdA,IACD7B,EAAKO,KAAKsB,GACVzB,EAAOA,QAAUyB,EAAIpB,QAItBa,IAAepB,GAChBF,EAAKO,KAAK,KAGZ,MAAMuB,EAAchC,EAAKiC,QArHH,iCAsHhBC,EAAoB7B,aAAQ,EAARA,EAAUM,OAEpC,IAAIwB,EAAWnC,EAAKoC,WACpB,KAAMD,GACJpC,EAAoBoC,EAAUlC,EAAOC,EAAMC,EAASC,EAAWC,EAAUC,GACzE6B,EAAWA,EAASE,YAOtB,GAJGb,GAAcpB,GACfF,EAAKO,KAAK,KAGTuB,GAAehC,EAAKqC,cACrBnC,EAAKO,KAAK,OACRH,EAAOA,YAGgBgC,IAAtBJ,GACD,IAAI,IAAIK,EAAIL,EAAmBvB,EAASN,EAASM,OAAQ4B,EAAI5B,IAAU4B,IACnElC,EAASkC,GAAG5B,OAKpB,MAAM6B,EAAYtC,EAAKS,OACpBc,GAAWe,IACZvC,EAAMQ,KAAKP,EAAK0B,KAAK,KACrB1B,EAAK2B,OAAO,EAAGW,KACblC,EAAOA,QAGRkC,GAA8B,MAAjBxC,EAAK2B,SAAmB3B,EAAKqC,cAC3CpC,EAAMQ,KAAK,MACTH,EAAOA,U,iCC9Mb,qDAUe,MAAMmC,UAA2B,IAK9C,YAAYC,EAA6B,IACvCC,MAAM,OAAD,QACHC,WAAW,GACRF,IAPA,KAAAG,iBAAkB,EAyClB,KAAAC,kBAAqBC,IAC1B,YAAYA,GACZC,KAAKH,iBAAmBG,KAAKH,gBAE7BG,KAAKC,cAAcC,UAAUC,OAAO,aAAcH,KAAKH,iBACtDG,KAAKI,MAA2BtC,KAAOkC,KAAKH,gBAAkB,OAAS,WACxEG,KAAKK,6BAA+BL,KAAKK,+BArCzC,MAAMD,EAAQJ,KAAKI,MACnBA,EAAMtC,KAAO,WACbsC,EAAME,aAAa,WAAY,IAC/BF,EAAMG,KAAO,qBACbH,EAAMI,aAAe,MAUrB,MAAMC,EAAWC,SAASC,cAAc,SACxCF,EAASP,UAAUU,IAAI,YACvBH,EAASI,UAAY,EACrBJ,EAAS3C,KAAO,WAChBsC,EAAMvC,cAAciD,QAAQL,GAC5BL,EAAMvC,cAAckD,aAAaN,EAASO,YAAaZ,EAAMf,aAE7D,MAAMY,EAAgBD,KAAKC,cAAgBS,SAASC,cAAc,QAClEV,EAAcC,UAAUU,IAAI,iBAAkB,SAE9CZ,KAAKiB,UAAUf,UAAUU,IAAI,wBAC7BZ,KAAKiB,UAAUC,OAAOjB,GAEtBA,EAAckB,iBAAiB,QAASnB,KAAKF,mBAC7CG,EAAckB,iBAAiB,WAAYnB,KAAKF,sB,iCCjDpD,8CAQe,SAASsB,EAAaC,GACnC,OAAGA,EAAQC,aAAa,oBAA0C,UAApBD,EAAQ1C,SAI5C,YAAa0C,GAAS,GAAOE,MAAMC,QAElCH,EAA6BE,MAAMC,S,iCCfhD,8CAUe,MAAMC,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjB5B,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAUf,UAAUU,IAAI,yBAGxB,OACL,OAAGZ,KAAK6B,YAAoB7B,KAAK6B,YAC1B7B,KAAK6B,YAAc,IAAaC,qBAAqB,CAC1Db,UAAWjB,KAAKiB,UAChBc,MAAM,EACNC,UAAU,EACVC,MAAOjC,KAAK2B,KACZO,OAAQlC,KAAK2B,KACbQ,SAAS,GAER,4BAA4BC,KAAKC,IAElCrC,KAAKsC,UAAYD,EACjBrC,KAAKsC,UAAUnB,iBAAiB,aAAcoB,KAGX,IAA7BvC,KAAKsC,UAAUE,WAAmBD,GAAgBvC,KAAK4B,YAC1B,IAA9B5B,KAAKsC,UAAUE,WAAoBD,GAAgBvC,KAAK4B,aACvD5B,KAAKsC,UAAUG,SAAS,GACxBzC,KAAKsC,UAAUI,WAIrB1C,KAAK0B,mBAAmBrB,4BAA8B,KACjDL,KAAK0B,mBAAmB7B,iBACzBG,KAAKsC,UAAUK,aAAa,GAC5B3C,KAAKsC,UAAUM,SAAW,EAC1B5C,KAAK4B,UAAY,GACjB5B,KAAKsC,UAAUO,SAEf7C,KAAKsC,UAAUK,cAAc,GAC7B3C,KAAKsC,UAAUM,SAAW,GAC1B5C,KAAK4B,UAAY,EACjB5B,KAAKsC,UAAUO,SAIZ,IAAaC,kBAAkBT,KAInC,SACFrC,KAAKsC,WACNtC,KAAKsC,UAAUS,Y,gCChErB,wFAYA,IAAIC,EAAgB,EACb,SAASC,EACdC,EACAC,EAAoD,KAAMC,QAAQC,WAClEC,EAA8B,KAC9BxC,GAAU,EACVyC,EAAmBL,GAGnB,GAAGA,EAAKM,cAAc,aAAc,OACpCN,EAAKhD,UAAUU,IAAI,MAEnB,IAAI6C,EAAI/C,SAASC,cAAc,OAC/B8C,EAAEvD,UAAUU,IAAI,YAShB,IAAI8C,EAPaR,EAAKhD,UAAUyD,SAAS,cAEvCF,EAAEvD,UAAUU,IAAI,aAGlBsC,EAAKpC,EAAU,UAAY,UAAU2C,GAIrC,MAAMG,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjBf,EAAOxC,SAASC,cAAc,OAE9BuD,EAAUlB,IAIVmB,EAAgG,KAApFC,OAAOC,iBAAiBZ,GAAGa,iBAAiB,qBAAqBC,QAAQ,IAAK,IAGhGb,EAAU,KAMR,IAAIc,EAAcR,KAAKC,MAAQF,EAC/B,MAAMU,EAAK,KAET,IAAcC,OAAO,KACnBxB,EAAKH,WAGJO,GAAOA,EAAMY,IAElB,GAAGM,EAAcL,EAAU,CACzB,IAAIQ,EAAQC,KAAKC,IAAIV,EAAWK,EAAaL,EAAW,GACxDW,WAAW,IAAM5B,EAAKhD,UAAUU,IAAI,UAAWgE,KAAKC,IAAIF,EAAQR,EAAW,EAAG,IAE9EW,WAAWL,EAAIE,QAEfzB,EAAKhD,UAAUU,IAAI,UACnBkE,WAAWL,EAAIN,EAAW,GAGxB,sBACFC,OAAOW,oBAAoB,cAAerB,GAG5CA,EAAU,KACVsB,GAAkB,GAIpB7B,GAAYA,EAASe,GAenBE,OAAOa,sBAAsB,KAC3B,MAAMC,EAAOzB,EAAE0B,wBACfjC,EAAKhD,UAAUU,IAAI,oBAEnB,MAAMwE,EAASvB,EAAUqB,EAAKG,KACxBC,EAASxB,EAAUoB,EAAKK,IAGxB5D,EADSiD,KAAKY,KAAK,SAACZ,KAAKa,IAAIH,EAASJ,EAAKhD,OAAS,GAAKgD,EAAKhD,OAAS,EAAM,GAAI,SAAC0C,KAAKa,IAAIL,EAASF,EAAKjD,MAAQ,GAAKiD,EAAKjD,MAAQ,EAAM,IAIzIyD,EAAIN,EAASzD,EAAO,EACpBgE,EAAIL,EAAS3D,EAAO,EAI1BuB,EAAK0C,MAAM3D,MAAQiB,EAAK0C,MAAM1D,OAASP,EAAO,KAC9CuB,EAAK0C,MAAMP,KAAOK,EAAI,KACtBxC,EAAK0C,MAAML,IAAMI,EAAI,KAgBrBlC,EAAEvC,OAAOgC,MAQT2C,EAAoB9F,GAAaA,EAAE+F,SAAW5C,IAChD,CAAC,SAAU,KAAK6C,SAAUhG,EAAE+F,OAAuBnH,UAChD,YAAgBoB,EAAE+F,OAAuB,cAAgBrC,KAE5DF,IAAqBL,IACjB,YAAcnD,EAAE+F,OAAQvC,IAIhC,IAAIyB,GAAkB,EACtB,GAAG,qBAAoB,CACrB,IAAIgB,EAAW,KACbtC,GAAWA,KAGbH,EAAiBpC,iBAAiB,aAAepB,IAC/C,IAAI,UAAUkG,SAASC,kBACrB,OAIF,GAAGnG,EAAEoG,QAAQxI,OAAS,GAAKqH,GAAmBa,EAAiB9F,GAC7D,OAIFiF,GAAkB,EAElB,IAAI,QAACnB,EAAO,QAAEC,GAAW/D,EAAEoG,QAAQ,GACnCvC,EAAWC,EAASC,GACpBP,EAAiBpC,iBAAiB,WAAY6E,EAAU,CAACI,MAAM,IAE/DhC,OAAOjD,iBAAiB,YAAcpB,IACpCA,EAAEsG,cAAe,EACjBtG,EAAEuG,kBACFN,IACAzC,EAAiBwB,oBAAoB,WAAYiB,IAChD,CAACI,MAAM,KACT,CAACG,SAAS,SAEbhD,EAAiBpC,iBAAiB,YAAcpB,IAC9C,IAAI,CAAC,EAAG,GAAGgG,SAAShG,EAAEyG,QACpB,OAGF,IAAI,UAAUP,SAASC,kBACrB,OAIF,GAAuC,MAApC3C,EAAiBlF,QAAQ4E,QAAkB4C,EAAiB9F,GAC7D,OACK,GAAGiF,EAER,YADAA,GAAkB,GAIpB,IAAI,QAACnB,EAAO,QAAEC,GAAW/D,EACzB6D,EAAWC,EAASC,GACpBM,OAAOjD,iBAAiB,UAAWuC,EAAS,CAAC0C,MAAM,EAAMG,SAAS,IAClEnC,OAAOjD,iBAAiB,cAAeuC,EAAS,CAAC0C,MAAM,EAAMG,SAAS,KACrE,CAACA,SAAS,M,gCCvMjB,4IAyBA,IAAIE,EAuHJ,MAAMC,EAAO,IAAI,IAAK,iBAAiB,EArHpB,KACjB,MAAMA,EAAO,IAAI,IAAU,CACzBC,UAAW,gBACXC,kBAAkB,EAClBC,aAAc,uBACdC,gBAAiB,4BAGbC,EAAU,YAAO,iCACjBC,EAAc,IAAI,UAAKC,YAAY,CAACC,IAAK,eAE/CH,EAAQ7F,OAAO8F,EAAY3F,SAE3B,MAAMK,EAAqB,IAAI,IAAmB,CAChDyF,MAAO,gBACP5G,KAAM,aAOR,IAAI6G,EAJJX,EAAgB/E,EAAmBtB,MAEnCsG,EAAKW,aAAanG,OAAOQ,EAAmBT,UAAW8F,GAIvD,IAiBIO,EAjBAC,EAAW,KAETH,IACFA,EAAmBhD,OAAOoD,YAAYD,EAAU,MAGlC,IAAgBA,WAAWnF,KAAKqF,IAC9CH,EAAQG,EAELH,EAAMI,KACP,YAAehG,EAAmByF,MAAO,YAAW,IAAkBQ,cAAcL,EAAMI,QAE1FhG,EAAmBkG,cAOzB,MAAMC,EAAY9H,IAKhB,GAJGA,GACD,YAAYA,IAGV0G,EAAclF,MAAM5D,OAEtB,YADA8I,EAAcvG,UAAUU,IAAI,SAI9B,MAAMT,EAAS,YAAiB,CAACsG,EAAeM,IAAU,GAC1D,IAAIxF,EAAQkF,EAAclF,MAE1ByF,EAAYc,OAAO,CAACZ,IAAK,eACzB,MAAMa,EAAY,YAAahB,GAE/BrF,EAAmBsG,iBAAiB,GAAKpD,KAAKqD,UAC9CvG,EAAmBsG,iBAAiBzG,GAEpC,IAAgB2G,MAAM3G,EAAO+F,GAAOlF,KAAM+F,IAGxC,OAAOA,EAASlK,GACd,IAAK,qBACHmK,cAAchB,GACd,6BAAmBhF,KAAKiG,IACtBA,EAAEC,QAAQC,UAETC,GAAQA,EAAOzF,SAClB,MACF,QACEgE,EAAQ0B,gBAAgB,YACxBzB,EAAYc,OAAO,CAACZ,IAAKiB,EAASlK,IAClC8J,EAAUhF,YAGb2F,MAAOC,IACRxI,IACAuB,EAAmBtB,MAAMF,UAAUU,IAAI,SAEhC+H,EAAI7K,KAGPkJ,EAAYc,OAAO,CAACZ,IAAK,0BACzBT,EAAcmC,SAIlBb,EAAUhF,SAEVwE,OAIJ,YAAiBR,EAASc,GAE1BpB,EAActF,iBAAiB,YAAY,SAAepB,GAIxD,GAHAC,KAAKE,UAAU6C,OAAO,SACtBiE,EAAYc,OAAO,CAACZ,IAAK,eAEZ,UAAVnH,EAAEmH,IACH,OAAOW,OAIX,MAAMlG,EAAO,IAAWkH,SAAW,IAAM,IACnCL,EAAS,IAAI,IAAe9G,EAAoBC,GAEtD,OADA+E,EAAKoC,SAAS5H,OAAOsH,EAAOvH,WACrBmC,QAAQ2F,IAAI,CACjBP,EAAOQ,OACPzB,OAIuD,KAAM,KAE7Dd,EAAcwC,QAGhB,UAAgBC,YAAY,YAAa,CAACjL,EAAG,wBAGhC,a,gCCxJf,2JAUO,MAAMkL,EAA8D,qBAAqB,YAAc,QAEvG,SAASC,EAAiBlG,EAA4BC,EAAsDzD,EAA8B,IAC/I,MAAMkB,EAAMlB,EAAQ2J,eAAiB3J,EAAQ2J,eAAezI,IAAIsC,GAAQA,EAAK/B,iBAAiBmI,KAAKpG,GAGnGxD,EAAQ6J,gBAAiB,EA4BzB3I,EAAIuI,EAAkBhG,EAAUzD,GAG3B,SAAS8J,EAAiBtG,EAAmBC,EAAgDzD,GAIhGwD,EAAK6B,oBAAoBoE,EAAkBhG,EAAUzD,GAIlD,SAAS+J,EAAmBvG,GACjC,YAAcA,EAAMiG,K,gCCxDtB,oBA8Ce,IA3BA,CAACxC,EAAmBjH,EAAyB,MAC1D,MAAM8G,EAA4B9F,SAASC,cAAcjB,EAAQgK,MAAQ,MAAQ,UAuBjF,OAtBAlD,EAAOG,UAAYA,GAAajH,EAAQiK,KAAO,UAAYjK,EAAQiK,KAAO,IAEtEjK,EAAQkK,WACPlK,EAAQmK,cACTrD,EAAOtG,UAAUU,IAAI,aAGvB,iBAAO4F,IAGN9G,EAAQoK,YACTtD,EAAOtG,UAAUU,IAAI,kBAGpBlB,EAAQqK,UACTvD,EAAOlG,aAAa,WAAY,QAG/BZ,EAAQsK,MACTxD,EAAOtF,OAAO,eAAKxB,EAAQsK,OAGtBxD,I,gCC3CT,+SAgBO,SAASyD,EAAa/G,EAAegH,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAM1J,SAASC,cAAc,OAQnC,OAPAyJ,EAAIlK,UAAUU,IAAI,aAClBwJ,EAAIC,UAAYF,EAEbjH,GACDA,EAAKoH,YAAYF,GAGZA,EAIT,OADAlH,EAAKqH,mBAAmB,YAAaJ,GAC9BjH,EAAKsH,iBAKP,SAASC,EAAgBvH,EAAyByG,EAAO,SAK9D,OAJAzG,EAAKhD,UAAU6C,OAAO,SAAW4G,GACjCzG,EAAK6G,UAAW,EAChBE,EAAa/G,GAEN,KACLA,EAAKmH,UAAY,GACjBnH,EAAKhD,UAAUU,IAAI,SAAW+I,GAC9BzG,EAAKuF,gBAAgB,aAVzB,IAAewB,aAAeA,EAsB9B,IAAIS,EAAe3K,IACjB,IAAImF,EAAOyF,EAAWxF,yBAClB,QAACtB,EAAO,QAAEC,GAAW/D,EAErB6K,EAAQ/G,GAAWqB,EAAK2F,MAAQhH,EAAUqB,EAAK2F,MAAQ3F,EAAKG,KAAOxB,EACnEiH,EAAQhH,GAAWoB,EAAK6F,OAASjH,EAAUoB,EAAK6F,OAAS7F,EAAKK,IAAMzB,GAErE8G,GAAS,KAAOE,GAAS,MAC1BE,KAMJ,MAAMC,EAAWlL,IAEfiL,KAWWA,EAAe,KACvBL,IACDA,EAAWzK,UAAU6C,OAAO,UAC5B4H,EAAW9M,cAAcqC,UAAU6C,OAAO,aAEvCmI,GAAaA,EAAYnI,SAC5B4H,EAAa,KAEb,UAAUQ,cAAc,uBAAuB,IAG9CC,IACDA,IACAA,EAAoB,MAGlB,uBACFhH,OAAOW,oBAAoB,YAAa2F,GAExCtG,OAAOW,oBAAoB,cAAekG,IAG5CvK,SAASqE,oBAAoB,IAAkBkG,GAE3C,oBACF,IAAwBI,aAAa,SAIzCjH,OAAOjD,iBAAiB,SAAU,KAC7BwJ,GACDK,MAWJ,IAAIL,EAA0B,KAAMS,EAAgC,KAAMF,EAA2B,KAC9F,SAASI,EAAYC,EAA0BC,GACpDR,IAEI,oBACF,IAAwBS,SAAS,CAC/B3N,KAAM,OACN4N,MAAQC,IACNX,OAKNL,EAAaY,EACbZ,EAAWzK,UAAUU,IAAI,UACzB+J,EAAW9M,cAAcqC,UAAUU,IAAI,aAEnCsK,IACFA,EAAcxK,SAASC,cAAc,OACrCuK,EAAYhL,UAAUU,IAAI,oBAG1BsK,EAAY/J,iBAAiB,IAAmBpB,IAC9C,YAAYA,GACZkL,OAIJN,EAAW9M,cAAckD,aAAamK,EAAaP,GAInDS,EAAoBI,EAEhB,uBACFpH,OAAOjD,iBAAiB,YAAauJ,GAErCtG,OAAOjD,iBAAiB,cAAe8J,EAAS,CAAC7E,MAAM,KAUzD1F,SAASS,iBAAiB,IAAkB8J,GAE5C,UAAUE,cAAc,uBAAuB,GAK1C,SAASS,GAAa,MAACC,EAAK,MAAEC,GAA4B5I,EAAmB6I,GAKlF,IAAKC,YAAaC,EAAWC,aAAcC,GAAcjJ,EAEzD,MAAMgC,EAAOxE,SAAS0L,KAAKjH,wBACrBkH,EAAcnH,EAAKjD,MACnBqK,EAAepH,EAAKhD,OAE1B6J,EAAO,IAAWlD,SAAW,QAAU,OACvC,IAAI0D,EAAkD,MAEtD,MAiBMC,EAhBG,CACL9G,EAAG,CACDL,KAAMwG,EACNhB,MAAOgB,EAAQI,GAEjBQ,cAAwB,UAATV,EArBA,EAqBkCM,EAAcJ,EArBhD,EAuBftG,EAAG,CACDJ,IAAKuG,EACLf,OAAQe,EAAQK,GAGlBO,cAAeZ,EAAQQ,EAAe,EA7BxB,EA6B0CA,EAAeH,EA7BzD,GAmCZQ,EACD,CACDtH,KAAMmH,EAAM9G,EAAEL,KAAO4G,EApCN,GAoCkCI,EACjDxB,MAAO2B,EAAM9G,EAAEmF,OArCA,GAkCb8B,EAKD,CACDpH,IAAKiH,EAAM7G,EAAEJ,IAAM4G,EAzCL,GAyCiCG,EAC/CvB,OAAQyB,EAAM7G,EAAEoF,OA1CF,MAoDlB,CAUE,IAAI1F,EAQJA,EAAOsH,EAAgBZ,GAAQS,EAAM9G,EAAEqG,IAASA,EAAO,SAAUS,EAAMC,eAEvEvJ,EAAK0C,MAAMP,KAAOA,EAAO,KAY3B,CACE,IAAIE,EAEJA,EAAMoH,EAAgBJ,GAAgBC,EAAM7G,EAAE4G,IAAiBA,EAAe,SAAUC,EAAME,eAE9FxJ,EAAK0C,MAAML,IAAMA,EAAM,KAGzBrC,EAAKyD,UAAYzD,EAAKyD,UAAUpC,QAAQ,2CAA4C,IACpFrB,EAAKhD,UAAUU,KAEK,WAAjB2L,EAA4BA,EAAe,UAC5C,KACU,WAATR,EAAoBA,EAAiB,SAATA,EAAkB,QAAU,SAG7D,IAAIa,GAA4B,EAAOC,EAAmC,EACnE,SAASC,IACXD,GACDE,aAAaF,GAGfA,EAAmCzI,OAAOU,WAAW,KACnD+H,EAAmC,EACnCD,GAA4B,GAC3B,KAEHA,GAA4B,EAGvB,SAASI,EAA0B3L,EAAsB8B,EAA2CkG,GACzG,MAAMzI,EAAMyI,EAAiBA,EAAezI,IAAIS,GAAWA,EAAQF,iBAAiBmI,KAAKjI,GACnF0B,EAASsG,EAAiBA,EAAe4D,aAAa3D,KAAKD,EAAgBhI,GAAWA,EAAQ0D,oBAAoBuE,KAAKjI,GAE7H,GAAG,YAAY,qBAAoB,CACjC,IAAI6L,EAEJ,MAAMxN,EAAgC,CAACyN,SAAS,GAE1CC,EAAW,KACfL,aAAaG,GAEbnK,EAAO,YAAaqK,EAAU1N,GAE9BqD,EAAO,WAAYqK,EAAU1N,GAE7BqD,EAAO,cAAeqK,EAAU1N,IAGlCkB,EAAI,aAAeb,IACdA,EAAEoG,QAAQxI,OAAS,EACpByP,KAIFxM,EAAI,YAAawM,EAAU1N,GAC3BkB,EAAI,WAAYwM,EAAU1N,GAC1BkB,EAAI,cAAewM,EAAU1N,GAE7BwN,EAAU9I,OAAOU,WAAW,KACvB8H,EACDQ,KAIFjK,EAASpD,EAAEoG,QAAQ,IACnBiH,IAEGzC,GACDtJ,EAAQF,iBAAiB,WAAY,IAAa,CAACiF,MAAM,MAE1D,aASLxF,EAAI,cAAe,qBAAsBb,IACvCoD,EAASpD,GAEN4K,GACDtJ,EAAQF,iBAAiB,WAAY,IAAa,CAACiF,MAAM,KAEzDjD,K,gCCzVO,SAASkK,EAAenK,EAAmBlG,GACxD,GAAoB,iBAAX,EAEP,YADAkG,EAAKmH,UAAYrN,GAKnB,MAAMoC,EAAa8D,EAAK9D,WACrBA,EACE8D,EAAKoK,YAAclO,EACpBA,EAAWmO,YAAYvQ,IAEvBkG,EAAKsK,YAAc,GACnBtK,EAAKhC,OAAOlE,IAGdkG,EAAKhC,OAAOlE,GAtBhB,mC,oICgBA,IAAIyQ,EAAO,KACT/M,SAASS,iBAAiB,QAAUpB,IAClC,IAAI,OAAAjE,EAAA,GAAgBiE,EAAE+F,OAAQ,0BAC5B,OAIF,IAAIkE,EAAc3M,EADlB0C,EAAE2N,iBAIF,IAAI9N,GAAqBG,EAAE4N,eAAiB5N,GAAG6N,cAAcC,QAAQ,cACjEC,GAAe,EAGf3D,GAAgBpK,EAAE4N,eAAiB5N,GAAG6N,cAAcC,QAAQ,aAChE,GAAG1D,EAAK3I,OAAQ,CACd2I,EAAOA,EAAK5F,QAAQ,2BAA4B,IAChD4F,EAAOA,EAAK5F,QAAQ,mBAAoB,IAExC,MAAMnI,EAAQ+N,EAAK/N,MAAM,2BACtBA,IACD+N,EAAO/N,EAAM,GAAGoF,QAGlB,IAAIuM,EAAoBrN,SAASC,cAAc,QAC/CoN,EAAK1D,UAAYF,EAEjB,IAAIhL,EAAW4O,EAAK3O,WACpB,KAAMD,GAAU,CACd,IAAIE,EAAcF,EAASE,YACF,IAAtBF,EAAS5B,WACN4B,EAAS3B,UAAUgE,QACrBrC,EAAS4D,UAIb5D,EAAWE,EAGb,MAAM2O,EAAY,OAAAC,EAAA,GAAaF,GAAM,GACrC,GAAGC,EAAUzM,MAAMgD,QAAQ,MAAO,IAAI5G,SAAWiC,EAAU2E,QAAQ,MAAO,IAAI5G,OAAQ,CACpFqM,EAAOgE,EAAUzM,MACjBlE,EAAW2Q,EAAU3Q,SACrByQ,GAAe,EAEf,IAAII,EAAY,IAAkBC,cAAcnE,GAChDkE,EAAYA,EAAUE,OAAOrO,GAAa,uBAARA,EAAE9B,GAAsC,2BAAR8B,EAAE9B,GACpE,IAAkBoQ,cAAchR,EAAU6Q,IAI3CJ,IACD9D,EAAOpK,EACPvC,EAAW,IAAkB8Q,cAAcnE,GAC3C3M,EAAWA,EAAS+Q,OAAOrO,GAAa,uBAARA,EAAE9B,GAAsC,2BAAR8B,EAAE9B,IAGpE+L,EAAO,IAAkBsE,cAActE,EAAM,CAAC3M,aAE9C+G,OAAO1D,SAAS6N,YAAY,cAAc,EAAOvE,KAGnDyD,EAAO,MAoBT,IAAYe,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAuRP,IAlQf,MAeE,YAAmB9O,EAA6B,IAA7B,KAAAA,UACjBM,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAUf,UAAUU,IAAI,eAE7BZ,KAAKyO,SAAW/O,EAAQ+O,SACxBzO,KAAK0O,SAAWhP,EAAQgP,cAECpP,IAAtBI,EAAQiP,gBAAoDrP,IAAzBI,EAAQkP,eAC5ClP,EAAQkP,aAAehK,KAAKiK,IAAI,GAAIjK,KAAKkK,MAAMpP,EAAQiP,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAErO,EAAI,UAAEX,EAAS,YAAEoP,GAAc,GAAQtP,EAEpF,IAEIU,EAyEA6O,EA3EA9H,EAAQzH,EAAQyH,OAASzH,EAAQwP,UAGrC,GAAItP,EA0CFI,KAAKiB,UAAUoJ,UAAY,8BACN9J,EAAO,SAASA,KAAU,yBAAyB4G,EAAQ,cAAgB,wCAGhG/G,EAAQJ,KAAKiB,UAAUkO,sBA9CV,CACV1B,GACDA,IAGFzN,KAAKiB,UAAUoJ,UAAY,iCACH+E,SAASJ,+CAGjC5O,EAAQJ,KAAKiB,UAAUkO,kBACvB,MAAME,EAAW,IAAIC,iBAAiB,KAGjCL,GACDA,MAKJ7O,EAAMe,iBAAiB,QAAS,KAC3B,OAAAC,EAAA,GAAahB,KACdA,EAAMiK,UAAY,IAGjBrK,KAAKuP,YACNvP,KAAKuP,UAAUlF,UAAYjK,EAAMiK,UACjCrK,KAAKwP,iBAKTH,EAASI,QAAQrP,EAAO,CAACsP,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErElQ,EAAQmQ,UACTzP,EAAMF,UAAUU,IAAI,aAAc,gBAGlCZ,KAAKuP,UAAY7O,SAASC,cAAc,OACxCX,KAAKuP,UAAUjP,aAAa,kBAAmB,QAC/CN,KAAKuP,UAAU5I,UAAYvG,EAAMuG,UAAY,2BAqBjD,GAVAvG,EAAME,aAAa,MAAO,QAEvByO,IACD,gBAAM3O,EAAO2O,OAAazP,EAAW,eAElCU,KAAKuP,WACN,gBAAMvP,KAAKuP,UAAWR,OAAazP,EAAW,gBAI/C6H,GAAS4H,EAAa,CACvB,MAAMe,EAASpP,SAASC,cAAc,OACtCmP,EAAO5P,UAAUU,IAAI,sBACrBZ,KAAKiB,UAAUC,OAAO4O,GAUxB,GAPG3I,IACDnH,KAAKmH,MAAQzG,SAASC,cAAc,SACpCX,KAAK4H,WACL5H,KAAKiB,UAAUC,OAAOlB,KAAKmH,QAI1BwH,EAAW,CACZ,MAAMoB,EAAU/P,KAAKiB,UAAUuJ,iBAC/B,IAAIwF,GAAgB,EAEpBf,EAAe,KACb,MAAMgB,EAAW7P,EAAMF,UAAUyD,SAAS,SAEpCuM,EAActQ,EAAaQ,EAA2BmB,MAAM5D,OAAS,IAAI,OAAAsQ,EAAA,GAAa7N,GAAO,GAAOmB,OAAO5D,OAC3GwS,EAAOxB,EAAYuB,EACnBE,EAAUD,EAAO,EACvB/P,EAAMF,UAAUC,OAAO,QAASiQ,GAI7BA,GAAWD,GAAQvB,GACpB5O,KAAK4H,WACLmI,EAAQ7O,OAAO,KAAKyN,EAAYuB,MAC5BF,IAAeA,GAAgB,KAC1BC,IAAaG,GAAYJ,KAClChQ,KAAK4H,WACLoI,GAAgB,IAIpB5P,EAAMe,iBAAiB,QAAS8N,GAGlCjP,KAAKI,MAAQA,EAGR,SACDJ,KAAKuB,QAINvB,KAAKN,QAAQE,UACbI,KAAKI,MAA2BwI,SClQxB,SAA+B7M,GAC5C,MAAMsU,EAAQ3P,SAAS4P,cACvBD,EAAME,mBAAmBxU,GACzB,MAAMyU,EAAMpM,OAAOqM,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD+PTO,CAAsB5Q,KAAKI,QAIxB,WACLJ,KAAKmH,MAAMqG,YAAc,GACtBxN,KAAKN,QAAQwP,UACdlP,KAAKmH,MAAMkD,UAAYrK,KAAKN,QAAQwP,UAEpClP,KAAKmH,MAAMjG,OAAO,eAAKlB,KAAKN,QAAQyH,MAAOnH,KAAKN,QAAQmR,eAIrD,YAAYC,GAAY,GAC7B,MAAO5E,aAAc6E,GAAiC/Q,KAAKuP,UAMrDyB,GAAiBhR,KAAKI,MAAMwF,MAAM1D,OAAOqC,QAAQ,KAAM,IAC7D,GAAGyM,IAAkBD,EACnB,OAGF,MACME,EAAqBrM,KAAKkK,MADG,GAEJlK,KAAKsM,IAAItM,KAAKa,IAAIsL,EAAYC,KAI7DhR,KAAKI,MAAMwF,MAAMqL,mBAAwBA,EAAH,KAEnCH,IACD9Q,KAAKI,MAAMwF,MAAM1D,OAAS6O,EAAYA,EAAY,KAAO,IAI3D,YAAc/Q,KAAKI,MADD,sBACmB,EAAM6Q,EAAoB,KAC7DjR,KAAKI,MAAMF,UAAU6C,OAFL,wBAMpB,YACE,OAAO/C,KAAKN,QAAQE,UAAaI,KAAKI,MAA2BmB,MAAQ,OAAA0M,EAAA,GAAajO,KAAKI,OAAO,GAAOmB,MAI3G,UAAUA,GACRvB,KAAKgI,iBAAiBzG,GAAO,GAE7B,YAAcvB,KAAKI,MAAO,SAGrB,iBAAiBmB,EAAe4P,GAAgB,GAClDnR,KAAKN,QAAQE,UACbI,KAAKI,MAA2BmB,MAAQA,GAEzCvB,KAAKI,MAAMiK,UAAY9I,EAEpBvB,KAAKuP,YACNvP,KAAKuP,UAAUlF,UAAY9I,EAExB4P,GACDnR,KAAKwP,gBAMN,YACL,OAAOxP,KAAKuB,QAAUvB,KAAKoR,cAGtB,UACL,OAAQpR,KAAKI,MAAMF,UAAUyD,SAAS,YAClC3D,KAAK0O,UAAY1O,KAAK0O,eACtB1O,KAAKyO,WAAa,OAAArN,EAAA,GAAapB,KAAKI,QAGnC,kBACL,OAAOJ,KAAKqR,WAAarR,KAAKsR,YAGzB,cAAc/P,EAAQ,GAAIgQ,GAAS,GACpCvR,KAAKN,QAAQE,YACf2B,EAAQ,IAAkB+M,cAAc/M,IAGvCgQ,EACDvR,KAAKgI,iBAAiBzG,GAAO,GAE7BvB,KAAKuB,MAAQA,EAIV,iBAAiBA,EAAqC,GAAIgQ,GAAS,GACxEvR,KAAKoR,cAAgB7P,EACrBvB,KAAKwR,cAAcjQ,EAAOgQ,GAGrB,SAASjK,EAAmBH,GAC9BA,IACDnH,KAAKmH,MAAMqG,YAAc,GACzBxN,KAAKmH,MAAMjG,OAAO,eAAKiG,EAAOnH,KAAKN,QAAQmR,gBAG7C7Q,KAAKI,MAAMF,UAAUC,OAAO,WAAYmH,EAAQkH,EAAWiD,QAC3DzR,KAAKI,MAAMF,UAAUC,OAAO,WAAYmH,EAAQkH,EAAWkD,QAGtD,SAASvK,GACdnH,KAAK2R,SAASnD,EAAWiD,MAAOtK,M,gCErXpC,yDAmNA,MAAMyK,EAA0B,IA1LzB,MASL,cARQ,KAAAC,YAAqC,GACrC,KAAAC,GAAK9N,KAAKC,MACV,KAAA8N,QAAS,EACT,KAAAb,IAAM,YAAO,MACb,KAAAc,OAAQ,EACR,KAAAC,YAAc7N,OAAO8N,SAASC,KAIpC,IAAIC,GAAkB,EAqCtB,GApCAhO,OAAOjD,iBAAiB,WAAapB,IAGnC,GAFAC,KAAKgS,OAAShS,KAAKkR,IAAI,WAAYnR,EAAGqS,GAEnChO,OAAO8N,SAASC,OAASnS,KAAKiS,YAG/B,OAFAjS,KAAKqS,cAAgBrS,KAAKqS,oBAC1BrS,KAAKsS,eAGPtS,KAAKiS,YAAc7N,OAAO8N,SAASC,KAGnC,GADmBpS,EAAEuH,QACXtH,KAAK8R,GAEb,YADA9R,KAAKuS,YAIP,MAAMC,EAAOxS,KAAK6R,YAAYY,MAC1BD,GAKJxS,KAAK+R,QAAUK,EACfpS,KAAK0S,WAAWF,IALdxS,KAAKuS,cASTnO,OAAOjD,iBAAiB,UAAYpB,IAClC,MAAMyS,EAAOxS,KAAK6R,YAAY7R,KAAK6R,YAAYlU,OAAS,GACpD6U,IACS,WAAVzS,EAAEmH,KAAqBsL,EAAKG,WAAWH,EAAKG,aAC7C,YAAY5S,GACZC,KAAK4S,KAAKJ,EAAK1U,SAEhB,CAACqP,SAAS,EAAM5G,SAAS,IAEzB,mBAAkB,CACnB,MAAM7G,EAAU,CAAC6G,SAAS,GAC1BnC,OAAOjD,iBAAiB,aAAepB,IAClCA,EAAEoG,QAAQxI,OAAS,IACtBqC,KAAKgS,OAAShS,KAAKkR,IAAI,cAEpB,YAAoBnR,KACrBqS,GAAkB,EAElBhO,OAAOjD,iBAAiB,WAAY,KAClC2D,WAAW,KACTsN,GAAkB,GACjB,MACF,CAAC7L,SAAS,EAAMH,MAAM,OAoC1B1G,GAGLmT,QAAQC,kBAAoB,SAE5B9S,KAAKuS,YAGC,WAAWC,GACjB,MAAMO,EAAOP,EAAK9G,QAAO1L,KAAK+R,aAAiBzS,GAC/CU,KAAKgS,OAAShS,KAAKkR,IAAI,wBAAyBsB,EAAMxS,KAAK6R,cAC/C,IAATkB,EACD/S,KAAKyL,SAAS+G,GACLA,EAAKQ,aACd,cAGFhT,KAAK+R,QAAS,EAGT,eAAejU,GACpB,IAAI,IAAIyB,EAAIS,KAAK6R,YAAYlU,OAAS,EAAG4B,GAAK,IAAKA,EAAG,CACpD,MAAMiT,EAAOxS,KAAK6R,YAAYtS,GAC9B,GAAGiT,EAAK1U,OAASA,EACf,MAAO,CAAC0U,OAAMS,MAAO1T,IAKpB,KAAKzB,GACV,GAAGA,EAAM,CACP,MAAMoV,EAAMlT,KAAKmT,eAAerV,GAChC,GAAGoV,EAED,YADAlT,KAAKoT,WAAWF,EAAIV,KAAMU,EAAID,OAKlCJ,QAAQD,OAGH,WAAWJ,EAAsBS,EAAQjT,KAAK6R,YAAYwB,QAAQb,IACvExS,KAAK+R,QAAS,EAGZ/R,KAAK6R,YAAYhT,OAAOoU,EAAO,GAC/BjT,KAAK0S,WAAWF,GAIb,SAASA,GACdxS,KAAK6R,YAAYpU,KAAK+U,GACtBxS,KAAKgS,OAAShS,KAAKkR,IAAI,YAAasB,EAAMxS,KAAK6R,aAE3CW,EAAKc,WACPtT,KAAKuS,YAID,YACNvS,KAAK+R,QAAS,EACdc,QAAQN,UAAUvS,KAAK8R,GAAI,IAGtB,eACLe,QAAQP,aAAatS,KAAK8R,GAAI,GAAII,SAASqB,OAASrB,SAASsB,UAGxD,WAAWhB,GACZA,GAIJ,YAAiBxS,KAAK6R,YAAaW,GAG9B,aAAa1U,EAA8B2V,GAAS,GACzD,IAAI,IAAIlU,EAAIS,KAAK6R,YAAYlU,OAAS,EAAG4B,GAAK,IAAKA,EAAG,CAEpD,GADaS,KAAK6R,YAAYtS,GACtBzB,OAASA,IACfkC,KAAK6R,YAAYhT,OAAOU,EAAG,GAExBkU,GACD,SAQV,IAAe7B,wBAA0BA,EAC1B,O,gCC/MA,SAAS8B,EAAiBC,EAAyBC,GAOhE,OANGA,EACDD,EAASE,QAAQ9X,GAAMA,EAAGuE,aAAa,WAAY,SAEnDqT,EAASE,QAAQ9X,GAAMA,EAAG0M,gBAAgB,aAGrC,IAAMiL,EAAiBC,GAAWC,GAb3C,mC,gCCAe,SAASE,EAAc5Q,EAAmB3C,GACvD,MAAMwT,EAAQ,IAAIC,MAAMzT,EAAM,CAAC0T,SAAS,EAAMC,YAAY,IAC1DhR,EAAKiI,cAAc4I,GAFrB,mC,gCCAA,YAQA,MAAMI,EAAgB,CACpB9S,EACAsF,EACAyN,EACAjQ,EACAkQ,EACAC,KAEA,MAAM,QAACpH,EAAO,IAAEqH,GAAOlT,EAAQhD,QAgB/B,QAfeiB,IAAZ4N,GACDH,cAAcG,QAGL5N,IAARiV,IACDnQ,OAAOoQ,sBAAsBD,GACzBD,UACKjT,EAAQhD,QAAQkW,KAQxBD,GAAW,UAAUrO,SAASC,mBAAqB/B,EAMpD,YALA9C,EAAQhD,QAAQkW,IAAM,GAAKnQ,OAAOa,sBAAsB,YAC/C5D,EAAQhD,QAAQkW,IACvBJ,EAAc9S,EAASsF,EAAWyN,EAAUjQ,EAAUkQ,EAAiBC,EAAU,MAMlFF,GAAYzN,GACbtF,EAAQnB,UAAUU,IAAI+F,GAGxB,MAAM8N,EAAe,YACZpT,EAAQhD,QAAQ6O,SACnBkH,GAAYzN,GACdtF,EAAQnB,UAAU6C,OAAO,YAAa4D,GAGxCtF,EAAQnB,UAAU6C,OAAO,aAEzBsR,GAAmBA,KAGrB,IAAI,UAAUpO,SAASC,oBAAsB/B,EAG3C,OAFA9C,EAAQnB,UAAU6C,OAAO,YAAa,kBACtC0R,IAIFpT,EAAQnB,UAAUU,IAAI,aAEtBS,EAAQnB,UAAUC,OAAO,aAAciU,GACvC/S,EAAQhD,QAAQ6O,QAAU,GAAKpI,WAAW2P,EAActQ,IAG3C,O,gCCpEf,oCAuEA,MAAMuQ,EAAgB,IA5DtB,oBACU,KAAAC,SAGH,GACG,KAAAJ,IAAM,IAAQjL,KAAK,MACnB,KAAAsL,WAAY,EAEZ,GAAGC,EAAuC1R,GAChD,IAAI2R,EAAU9U,KAAK2U,SAASE,GAU5B,OATIC,IACF9U,KAAK+U,gBACLD,EAAU9U,KAAK2U,SAASE,GAAQ,oBAGlBvV,IAAb6D,GACD2R,EAAQ1S,KAAK,IAAMe,KAGd2R,EAGF,QAAQ3R,GACb,OAAOnD,KAAKgV,GAAG,OAAQ7R,GAGlB,OAAOA,GACZ,OAAOnD,KAAKgV,GAAG,QAAS7R,GAQnB,cAAc9B,EAAsB8B,GACzC,MAAM2R,EAAU,YAAQzT,GAAWrB,KAAK0E,SAAWtB,QAAQC,UAM3D,YAJgB/D,IAAb6D,GACD2R,EAAQ1S,KAAK,IAAMe,KAGd2R,EAGD,gBACF9U,KAAK4U,YACP5U,KAAK4U,WAAY,EAEjB5U,KAAKuU,IAAI,KACPvU,KAAK2U,SAASM,MAAQjV,KAAK2U,SAASM,KAAK5R,UACzCrD,KAAK2U,SAASO,OAASlV,KAAK2U,SAASO,MAAM7R,UAE3CrD,KAAK4U,WAAY,EACjB5U,KAAK2U,SAAW,QAOxB,MAAmB,IAAeD,cAAgBA,GACnC,O,gCCzEf,6CAQe,SAASS,EAAoBpV,GAC1C,OAAO,oBAAoBA,aAAaqV,YAAcrV,EAAEoG,QAAQ,GAAGtC,QAAU,K,gCCT/E,oBAgHA,MAAMwR,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAWC,UAAU,uBAAuBlT,KAAMmT,GAChDA,GAIJ,eAAetP,EAKlB,IAIF,OAAOjG,KAAKuH,WAAWnF,KAAKkF,IAC1B,IAAIkO,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZ3X,EAAG,gCACHyJ,KAAMzB,EAASyB,KACfmO,MAAO5P,EAAS4P,QAKlBL,EADCvP,EAAS6P,gBACW,IAAWC,aAAa,aAAc9P,EAAS6P,gBAAiBxO,GAAO,GAEvElE,QAAQC,QAAQ,CACnCpF,EAAG,4BAKP,MAAM+X,EAAU1O,EAAM2O,SAChBC,EAAQ,IAAIC,WAAWH,EAAQE,MAAMvY,OAAS,IAWpD,OAVAuY,EAAME,YACNF,EAAMG,IAAIL,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdT,EADCxP,EAASqQ,YACO,IAAWP,aAAa,aAAc9P,EAASqQ,YAAahP,GAAO,GAEnElE,QAAQC,QAAQ,IAAI8S,YAGhC/S,QAAQ2F,IAAI,CAACyM,EAAoBC,IAAiBrT,KAAMmU,IAC7Db,EAAOC,SAAWY,EAAO,GACzBb,EAAOE,aAAaK,SAAWD,EAC/BN,EAAOE,aAAaY,kBAAoBD,EAAO,GAExC,IAAWjB,UAAU,iCAAkCI,OAK7D,MAAMC,EAAkBrO,EAAwB5H,EAAe,IACpE,OAAO,IAAWqW,aAAa,aAAcJ,EAAUrO,GAAO,GAAOlF,KAAMqU,GAElE,IAAWnB,UAAU,qBAAsB,CAChDK,SAAUc,GACT/W,GAAS0C,KAAKsU,IACD,uBAAXA,EAAKzY,GACN,IAAW0Y,QAAQD,EAAKE,MAGnBF,KAKN,qBAAqBG,GAC1B,OAAO,IAAWvB,UAAU,+BAAgC,CAACuB,SAGxD,sBACL,OAAO,IAAWvB,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAeD,gBAAkBA,EAClB,O,gCClHf,+DAgBe,SAASpH,EAAa6I,EAAoBC,GAAe,GACtE,MAAM9Z,EAAkB,GAClBC,EAAiB,GAEjBG,EAA4B0Z,EAAe,QAAKzX,EACtD,YAAoBwX,EAAO7Z,EAAOC,OAAMoC,OAAWA,EAAWjC,GAC3DH,EAAKS,QACNV,EAAMQ,KAAKP,EAAK0B,KAAK,KAGvB,IAAI2C,EAAQtE,EAAM2B,KAAK,MAkBvB,OAjBA2C,EAAQA,EAAMgD,QAAQ,UAAW,MAE9BlH,aAAQ,EAARA,EAAUM,UASX,IAAkBqZ,oBAAoB3Z,GACtC,IAAkB4Z,aAAa5Z,IAK1B,CAACkE,QAAOlE,YAGjB,IAAe4Q,aAAeA,G,gCC/C9B,8CAQe,MAAMiJ,EAQnB,YAAYxX,GAMVM,KAAKqB,QAAUX,SAAS0L,KAAK5I,cAAc,IAAM9D,EAAQiH,WAIzD3G,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAU0F,UAAY,yBAE3B3G,KAAK8I,SAAWpI,SAASC,cAAc,OACvCX,KAAK8I,SAASnC,UAAY,aAE1B3G,KAAKmX,MAAQzW,SAASC,cAAc,MACjCjB,EAAQmH,cACT7G,KAAKmX,MAAMjW,OAAO,eAAKxB,EAAQmH,eAGjC7G,KAAKoX,SAAW1W,SAASC,cAAc,KACvCX,KAAKoX,SAASzQ,UAAY,WACvBjH,EAAQoH,iBACT9G,KAAKoX,SAASlW,OAAO,eAAKxB,EAAQoH,kBAGpC9G,KAAKiB,UAAUC,OAAOlB,KAAK8I,SAAU9I,KAAKmX,MAAOnX,KAAKoX,UAEnD1X,EAAQkH,mBACT5G,KAAKqH,aAAe3G,SAASC,cAAc,OAC3CX,KAAKqH,aAAaV,UAAY,gBAC9B3G,KAAKiB,UAAUC,OAAOlB,KAAKqH,eAG7BrH,KAAKqB,QAAQH,OAAOlB,KAAKiB,c,gCC7Cd,SAASoW,EAAWlN,GACjC,MAAM4D,EAAOrN,SAASC,cAAc,QAEpC,OADAoN,EAAK1D,UAAYF,EACV4D,EATT","file":"13.20324e79c22f5893ae52.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/helpers/dom/isInputEmpty.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/helpers/dom/replaceContent.ts","webpack:///./src/components/inputField.ts","webpack:///./src/helpers/dom/selectElementContents.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/singleTransition.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/helpers/dom/getRichValue.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","splice","HTMLImageElement","alt","isTableCell","matches","wasEntitiesLength","curChild","firstChild","nextSibling","undefined","i","wasLength","PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","prepend","insertBefore","cloneNode","container","append","addEventListener","isInputEmpty","element","hasAttribute","value","trim","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","remove","rippleClickId","ripple","elem","callback","Promise","resolve","onEnd","attachListenerTo","querySelector","r","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","window","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","sqrt","abs","x","y","style","isRippleUnneeded","target","includes","touchEnd","settings","animationsEnabled","touches","once","cancelBubble","stopPropagation","passive","button","passwordInput","page","className","withInputWrapper","titleLangKey","subtitleLangKey","btnNext","btnNextI18n","IntlElement","key","label","getStateInterval","inputWrapper","state","getState","setInterval","_state","hint","wrapEmojiText","setLabel","onSubmit","update","preloader","setValueSilently","random","check","response","clearInterval","m","default","mount","monkey","removeAttribute","catch","err","select","isMobile","imageDiv","all","load","focus","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","disabled","text","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","replaceContent","lastChild","replaceWith","textContent","init","preventDefault","originalEvent","clipboardData","getData","usePlainText","span","richValue","getRichValue","entities2","parseEntities","filter","mergeEntities","wrapDraftText","execCommand","InputState","required","validate","maxLength","showLengthOn","min","round","placeholder","canBeEdited","processInput","labelText","firstElementChild","String","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","border","labelEl","showingLength","wasError","inputLength","diff","isError","range","createRange","selectNodeContents","sel","getSelection","removeAllRanges","addRange","selectElementContents","labelOptions","setHeight","newHeight","currentHeight","transitionDuration","log","fireFakeInput","originalValue","isValid","isChanged","silent","setDraftValue","Error","Valid","setState","appNavigationController","navigations","id","manual","debug","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","index","ret","findItemByType","backByItem","indexOf","noHistory","origin","pathname","single","toggleDisability","elements","disable","forEach","simulateEvent","event","Event","bubbles","cancelable","SetTransition","forwards","onTransitionEnd","useRafs","raf","cancelAnimationFrame","afterTimeout","sequentialDom","promises","scheduled","kind","promise","scheduleFlush","do","read","write","isSwipingBackSafari","TouchEvent","passwordManager","invokeApi","result","currentHashPromise","newHashPromise","params","password","new_settings","email","currentPassword","invokeCrypto","newAlgo","new_algo","salt1","Uint8Array","randomize","set","newPassword","hashes","new_password_hash","inputCheckPassword","auth","setUser","user","code","field","withEntities","combineSameEntities","sortEntities","LoginPage","title","subtitle","htmlToSpan"],"mappings":"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","file":"13.6f53ed67b434abfeb8b3.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\r\n return el.closest(`[${attribute}]`);\r\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.getAttribute(attribute) !== null) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\n\r\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler';\r\nexport type MarkdownTag = {\r\n match: string,\r\n entityName: Extract;\r\n};\r\n\r\n// https://core.telegram.org/bots/api#html-style\r\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\r\n bold: {\r\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\r\n entityName: 'messageEntityBold'\r\n },\r\n underline: {\r\n match: '[style*=\"underline\"], u, ins',\r\n entityName: 'messageEntityUnderline'\r\n },\r\n italic: {\r\n match: '[style*=\"italic\"], i, em',\r\n entityName: 'messageEntityItalic'\r\n },\r\n monospace: {\r\n match: '[style*=\"monospace\"], [face=\"monospace\"], pre',\r\n entityName: 'messageEntityPre'\r\n },\r\n strikethrough: {\r\n match: '[style*=\"line-through\"], strike, del, s',\r\n entityName: 'messageEntityStrike'\r\n },\r\n link: {\r\n match: 'A:not(.follow)',\r\n entityName: 'messageEntityTextUrl'\r\n },\r\n mentionName: {\r\n match: 'A.follow',\r\n entityName: 'messageEntityMentionName'\r\n },\r\n spoiler: {\r\n match: '[style*=\"spoiler\"]',\r\n entityName: 'messageEntitySpoiler'\r\n }\r\n};\r\n\r\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\r\n\r\n/* export function getDepth(child: Node, container?: Node) {\r\n let depth = 0;\r\n\r\n do {\r\n if(child === container) {\r\n return depth;\r\n }\r\n\r\n ++depth;\r\n } while((child = child.parentNode) !== null);\r\n\r\n return depth;\r\n} */\r\n\r\nconst BLOCK_TAG_NAMES = new Set([\r\n 'DIV',\r\n 'P',\r\n 'BR',\r\n 'LI',\r\n 'SECTION',\r\n 'H6',\r\n 'H5',\r\n 'H4',\r\n 'H3',\r\n 'H2',\r\n 'H1',\r\n 'TR'\r\n]);\r\n\r\nexport default function getRichElementValue(node: HTMLElement, lines: string[], line: string[], selNode?: Node, selOffset?: number, entities?: MessageEntity[], offset = {offset: 0}) {\r\n if(node.nodeType === 3) { // TEXT\r\n let nodeValue = node.nodeValue;\r\n\r\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\r\n if(tabulation?.getAttribute('contenteditable') === null) {\r\n nodeValue += ' ';\r\n // line.push('\\t');\r\n // ++offset.offset;\r\n } */\r\n\r\n if(selNode === node) {\r\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\r\n } else {\r\n line.push(nodeValue);\r\n }\r\n\r\n if(entities && nodeValue.length) {\r\n if(node.parentNode) {\r\n const parentElement = node.parentElement;\r\n \r\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = parentElement.closest(tag.match + ', [contenteditable]');\r\n if(closest?.getAttribute('contenteditable') !== null) {\r\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\r\n if(closestDepth > depth) {\r\n closestDepth = depth;\r\n closestTag = tag;\r\n closestElementByTag = closest;\r\n } */\r\n continue;\r\n }\r\n\r\n if(tag.entityName === 'messageEntityTextUrl') {\r\n entities.push({\r\n _: tag.entityName,\r\n url: (closest as HTMLAnchorElement).href,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n } else if(tag.entityName === 'messageEntityMentionName') {\r\n entities.push({\r\n _: tag.entityName,\r\n offset: offset.offset,\r\n length: nodeValue.length,\r\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\r\n });\r\n } else {\r\n entities.push({\r\n _: tag.entityName as any,\r\n offset: offset.offset,\r\n length: nodeValue.length\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n offset.offset += nodeValue.length;\r\n return;\r\n }\r\n\r\n if(node.nodeType !== 1) { // NON-ELEMENT\r\n return;\r\n }\r\n\r\n const isSelected = selNode === node;\r\n const isBlock = BLOCK_TAG_NAMES.has(node.tagName);\r\n if(isBlock && line.length) {\r\n lines.push(line.join(''));\r\n line.splice(0, line.length);\r\n ++offset.offset;\r\n } else if(node instanceof HTMLImageElement) {\r\n const alt = node.alt;\r\n if(alt) {\r\n line.push(alt);\r\n offset.offset += alt.length;\r\n }\r\n }\r\n\r\n if(isSelected && !selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n const isTableCell = node.matches(tabulationMatch);\r\n const wasEntitiesLength = entities?.length;\r\n\r\n let curChild = node.firstChild as HTMLElement;\r\n while(curChild) {\r\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\r\n curChild = curChild.nextSibling as any;\r\n }\r\n\r\n if(isSelected && selOffset) {\r\n line.push('\\x01');\r\n }\r\n\r\n if(isTableCell && node.nextSibling) {\r\n line.push(' ');\r\n ++offset.offset;\r\n\r\n // * combine entities such as url after adding space\r\n if(wasEntitiesLength !== undefined) {\r\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\r\n ++entities[i].length;\r\n }\r\n }\r\n }\r\n\r\n const wasLength = line.length;\r\n if(isBlock && wasLength) {\r\n lines.push(line.join(''));\r\n line.splice(0, wasLength);\r\n ++offset.offset;\r\n }\r\n\r\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\r\n lines.push('');\r\n ++offset.offset;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport getRichValue from \"./getRichValue\";\r\n\r\nexport default function isInputEmpty(element: HTMLElement) {\r\n if(element.hasAttribute('contenteditable') || element.tagName !== 'INPUT') {\r\n /* const value = element.innerText;\r\n\r\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\r\n return !getRichValue(element, false).value.trim();\r\n } else {\r\n return !(element as HTMLInputElement).value.trim();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from '../components/misc';\r\nimport mediaSizes from '../helpers/mediaSizes';\r\nimport { AccountPassword } from '../layer';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport passwordManager from '../lib/mtproto/passwordManager';\r\nimport Page from './page';\r\nimport Button from '../components/button';\r\nimport PasswordInputField from '../components/passwordInputField';\r\nimport PasswordMonkey from '../components/monkeys/password';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport I18n from '../lib/langPack';\r\nimport LoginPage from './loginPage';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent } from '../helpers/dom/clickEvent';\r\nimport htmlToSpan from '../helpers/dom/htmlToSpan';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\nimport toggleDisability from '../helpers/dom/toggleDisability';\r\n\r\nconst TEST = false;\r\nlet passwordInput: HTMLInputElement;\r\n\r\nlet onFirstMount = (): Promise => {\r\n const page = new LoginPage({\r\n className: 'page-password',\r\n withInputWrapper: true,\r\n titleLangKey: 'Login.Password.Title',\r\n subtitleLangKey: 'Login.Password.Subtitle'\r\n });\r\n\r\n const btnNext = Button('btn-primary btn-color-primary');\r\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\r\n\r\n btnNext.append(btnNextI18n.element);\r\n\r\n const passwordInputField = new PasswordInputField({\r\n label: 'LoginPassword',\r\n name: 'password'\r\n });\r\n\r\n passwordInput = passwordInputField.input as HTMLInputElement;\r\n\r\n page.inputWrapper.append(passwordInputField.container, btnNext);\r\n\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n\r\n return !TEST && passwordManager.getState().then(_state => {\r\n state = _state;\r\n\r\n if(state.hint) {\r\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\r\n } else {\r\n passwordInputField.setLabel();\r\n }\r\n });\r\n };\r\n\r\n let state: AccountPassword;\r\n \r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!passwordInput.value.length) {\r\n passwordInput.classList.add('error');\r\n return;\r\n }\r\n\r\n const toggle = toggleDisability([passwordInput, btnNext], true);\r\n let value = passwordInput.value;\r\n\r\n btnNextI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(btnNext);\r\n\r\n passwordInputField.setValueSilently('' + Math.random()); // prevent saving suggestion\r\n passwordInputField.setValueSilently(value); // prevent saving suggestion\r\n\r\n passwordManager.check(value, state).then((response) => {\r\n //console.log('passwordManager response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization':\r\n clearInterval(getStateInterval);\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n if(monkey) monkey.remove();\r\n break;\r\n default:\r\n btnNext.removeAttribute('disabled');\r\n btnNextI18n.update({key: response._ as any});\r\n preloader.remove();\r\n break;\r\n }\r\n }).catch((err: any) => {\r\n toggle();\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnNext.innerText = err.type;\r\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\r\n passwordInput.select();\r\n break;\r\n }\r\n\r\n preloader.remove();\r\n \r\n getState();\r\n });\r\n };\r\n \r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n passwordInput.addEventListener('keypress', function(this, e) {\r\n this.classList.remove('error');\r\n btnNextI18n.update({key: 'Login.Next'});\r\n\r\n if(e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n const size = mediaSizes.isMobile ? 100 : 166;\r\n const monkey = new PasswordMonkey(passwordInputField, size);\r\n page.imageDiv.append(monkey.container);\r\n return Promise.all([\r\n monkey.load(),\r\n getState()\r\n ]);\r\n};\r\n\r\nconst page = new Page('page-password', true, onFirstMount, null, () => {\r\n //if(!isAppleMobile) {\r\n passwordInput.focus();\r\n //}\r\n\r\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\r\n if(typeof(node) === 'string') {\r\n elem.innerHTML = node;\r\n return;\r\n }\r\n\r\n // * children.length doesn't count text nodes\r\n const firstChild = elem.firstChild;\r\n if(firstChild) {\r\n if(elem.lastChild === firstChild) {\r\n firstChild.replaceWith(node);\r\n } else {\r\n elem.textContent = '';\r\n elem.append(node);\r\n }\r\n } else {\r\n elem.append(node);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\r\nimport getRichValue from \"../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../helpers/dom/isInputEmpty\";\r\nimport selectElementContents from \"../helpers/dom/selectElementContents\";\r\nimport { MessageEntity } from \"../layer\";\r\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport SetTransition from \"./singleTransition\";\r\n\r\nlet init = () => {\r\n document.addEventListener('paste', (e) => {\r\n if(!findUpAttribute(e.target, 'contenteditable=\"true\"')) {\r\n return;\r\n }\r\n\r\n e.preventDefault();\r\n let text: string, entities: MessageEntity[];\r\n\r\n // @ts-ignore\r\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n let usePlainText = true;\r\n\r\n // @ts-ignore\r\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\r\n if(html.trim()) {\r\n html = html.replace(//, '');\r\n html = html.replace(//, '');\r\n\r\n const match = html.match(/([\\s\\S]*)<\\/body>/);\r\n if(match) {\r\n html = match[1].trim();\r\n }\r\n\r\n let span: HTMLElement = document.createElement('span');\r\n span.innerHTML = html;\r\n\r\n let curChild = span.firstChild;\r\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\r\n let nextSibling = curChild.nextSibling;\r\n if(curChild.nodeType === 3) {\r\n if(!curChild.nodeValue.trim()) {\r\n curChild.remove();\r\n }\r\n }\r\n\r\n curChild = nextSibling;\r\n }\r\n\r\n const richValue = getRichValue(span, true);\r\n if(richValue.value.replace(/\\s/g, '').length === plainText.replace(/\\s/g, '').length) {\r\n text = richValue.value;\r\n entities = richValue.entities;\r\n usePlainText = false;\r\n \r\n let entities2 = RichTextProcessor.parseEntities(text);\r\n entities2 = entities2.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n RichTextProcessor.mergeEntities(entities, entities2);\r\n }\r\n }\r\n \r\n if(usePlainText) {\r\n text = plainText;\r\n entities = RichTextProcessor.parseEntities(text);\r\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\r\n }\r\n\r\n text = RichTextProcessor.wrapDraftText(text, {entities});\r\n \r\n window.document.execCommand('insertHTML', false, text);\r\n });\r\n\r\n init = null;\r\n};\r\n\r\n// ! it doesn't respect symbols other than strongs\r\n/* const checkAndSetRTL = (input: HTMLElement) => {\r\n //const isEmpty = isInputEmpty(input);\r\n //console.log('input', isEmpty);\r\n\r\n //const char = [...getRichValue(input)][0];\r\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\r\n let direction = 'ltr';\r\n if(char && checkRTL(char)) {\r\n direction = 'rtl';\r\n }\r\n\r\n //console.log('RTL', direction, char);\r\n\r\n input.style.direction = direction;\r\n}; */\r\n\r\nexport enum InputState {\r\n Neutral = 0,\r\n Valid = 1,\r\n Error = 2\r\n};\r\n\r\nexport type InputFieldOptions = {\r\n placeholder?: LangPackKey, \r\n label?: LangPackKey, \r\n labelOptions?: any[],\r\n labelText?: string,\r\n name?: string, \r\n maxLength?: number, \r\n showLengthOn?: number,\r\n plainText?: true,\r\n animate?: boolean,\r\n required?: boolean,\r\n canBeEdited?: boolean,\r\n validate?: () => boolean\r\n};\r\n\r\nclass InputField {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputFake: HTMLElement;\r\n public label: HTMLLabelElement;\r\n\r\n public originalValue: string;\r\n\r\n public required: boolean;\r\n public validate: () => boolean;\r\n\r\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\r\n // protected wasInputFakeClientHeight: number;\r\n // protected showScrollDebounced: () => void;\r\n\r\n constructor(public options: InputFieldOptions = {}) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('input-field');\r\n\r\n this.required = options.required;\r\n this.validate = options.validate;\r\n\r\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\r\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\r\n }\r\n\r\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true} = options;\r\n\r\n let label = options.label || options.labelText;\r\n\r\n let input: HTMLElement;\r\n if(!plainText) {\r\n if(init) {\r\n init();\r\n }\r\n\r\n this.container.innerHTML = `\r\n
\r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n const observer = new MutationObserver(() => {\r\n //checkAndSetRTL(input);\r\n\r\n if(processInput) {\r\n processInput();\r\n }\r\n });\r\n\r\n // * because if delete all characters there will br left\r\n input.addEventListener('input', () => {\r\n if(isInputEmpty(input)) {\r\n input.innerHTML = '';\r\n }\r\n\r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = input.innerHTML;\r\n this.onFakeInput();\r\n }\r\n });\r\n \r\n // ! childList for paste first symbol\r\n observer.observe(input, {characterData: true, childList: true, subtree: true});\r\n\r\n if(options.animate) {\r\n input.classList.add('scrollable', 'scrollable-y');\r\n // this.wasInputFakeClientHeight = 0;\r\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\r\n this.inputFake = document.createElement('div');\r\n this.inputFake.setAttribute('contenteditable', 'true');\r\n this.inputFake.className = input.className + ' input-field-input-fake';\r\n }\r\n } else {\r\n this.container.innerHTML = `\r\n \r\n `;\r\n\r\n input = this.container.firstElementChild as HTMLElement;\r\n //input.addEventListener('input', () => checkAndSetRTL(input));\r\n }\r\n\r\n input.setAttribute('dir', 'auto');\r\n\r\n if(placeholder) {\r\n _i18n(input, placeholder, undefined, 'placeholder');\r\n\r\n if(this.inputFake) {\r\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\r\n }\r\n }\r\n\r\n if(label || placeholder) {\r\n const border = document.createElement('div');\r\n border.classList.add('input-field-border');\r\n this.container.append(border);\r\n }\r\n\r\n if(label) {\r\n this.label = document.createElement('label');\r\n this.setLabel();\r\n this.container.append(this.label);\r\n }\r\n\r\n let processInput: () => void;\r\n if(maxLength) {\r\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\r\n let showingLength = false;\r\n\r\n processInput = () => {\r\n const wasError = input.classList.contains('error');\r\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\r\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input, false).value].length;\r\n const diff = maxLength - inputLength;\r\n const isError = diff < 0;\r\n input.classList.toggle('error', isError);\r\n\r\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\r\n\r\n if(isError || diff <= showLengthOn) {\r\n this.setLabel();\r\n labelEl.append(` (${maxLength - inputLength})`);\r\n if(!showingLength) showingLength = true;\r\n } else if((wasError && !isError) || showingLength) {\r\n this.setLabel();\r\n showingLength = false;\r\n }\r\n };\r\n\r\n input.addEventListener('input', processInput);\r\n }\r\n\r\n this.input = input;\r\n }\r\n\r\n public select() {\r\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\r\n return;\r\n }\r\n\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).select(); // * select text\r\n } else {\r\n selectElementContents(this.input);\r\n }\r\n }\r\n\r\n public setLabel() {\r\n this.label.textContent = '';\r\n if(this.options.labelText) {\r\n this.label.innerHTML = this.options.labelText;\r\n } else {\r\n this.label.append(i18n(this.options.label, this.options.labelOptions));\r\n }\r\n }\r\n\r\n public onFakeInput(setHeight = true) {\r\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\r\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\r\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\r\n this.showScrollDebounced();\r\n } */\r\n\r\n const currentHeight = +this.input.style.height.replace('px', '');\r\n if(currentHeight === newHeight) {\r\n return;\r\n }\r\n\r\n const TRANSITION_DURATION_FACTOR = 50;\r\n const transitionDuration = Math.round(\r\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight)),\r\n );\r\n\r\n // this.wasInputFakeClientHeight = clientHeight;\r\n this.input.style.transitionDuration = `${transitionDuration}ms`;\r\n\r\n if(setHeight) {\r\n this.input.style.height = newHeight ? newHeight + 'px' : '';\r\n }\r\n\r\n const className = 'is-changing-height';\r\n SetTransition(this.input, className, true, transitionDuration, () => {\r\n this.input.classList.remove(className);\r\n });\r\n }\r\n\r\n get value() {\r\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input, false).value;\r\n //return getRichValue(this.input);\r\n }\r\n\r\n set value(value: string) {\r\n this.setValueSilently(value, false);\r\n\r\n simulateEvent(this.input, 'input');\r\n }\r\n\r\n public setValueSilently(value: string, fireFakeInput = true) {\r\n if(this.options.plainText) {\r\n (this.input as HTMLInputElement).value = value;\r\n } else {\r\n this.input.innerHTML = value;\r\n \r\n if(this.inputFake) {\r\n this.inputFake.innerHTML = value;\r\n\r\n if(fireFakeInput) {\r\n this.onFakeInput();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public isChanged() {\r\n return this.value !== this.originalValue;\r\n }\r\n\r\n public isValid() {\r\n return !this.input.classList.contains('error') && \r\n (!this.validate || this.validate()) && \r\n (!this.required || !isInputEmpty(this.input));\r\n }\r\n\r\n public isValidToChange() {\r\n return this.isValid() && this.isChanged();\r\n }\r\n\r\n public setDraftValue(value = '', silent = false) {\r\n if(!this.options.plainText) {\r\n value = RichTextProcessor.wrapDraftText(value);\r\n }\r\n\r\n if(silent) {\r\n this.setValueSilently(value, false); \r\n } else {\r\n this.value = value;\r\n }\r\n }\r\n\r\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\r\n this.originalValue = value;\r\n this.setDraftValue(value, silent);\r\n }\r\n\r\n public setState(state: InputState, label?: LangPackKey) {\r\n if(label) {\r\n this.label.textContent = '';\r\n this.label.append(i18n(label, this.options.labelOptions));\r\n }\r\n\r\n this.input.classList.toggle('error', !!(state & InputState.Error));\r\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\r\n }\r\n\r\n public setError(label?: LangPackKey) {\r\n this.setState(InputState.Error, label);\r\n }\r\n}\r\n\r\nexport default InputField;\r\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst SetTransition = (\r\n element: HTMLElement, \r\n className: string, \r\n forwards: boolean, \r\n duration: number, \r\n onTransitionEnd?: () => void, \r\n useRafs?: number\r\n) => {\r\n const {timeout, raf} = element.dataset;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n if(raf !== undefined) {\r\n window.cancelAnimationFrame(+raf);\r\n if(!useRafs) {\r\n delete element.dataset.raf;\r\n }\r\n }\r\n\r\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\r\n // return;\r\n // }\r\n\r\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\r\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\r\n delete element.dataset.raf;\r\n SetTransition(element, className, forwards, duration, onTransitionEnd, useRafs - 1);\r\n });\r\n\r\n return;\r\n }\r\n\r\n if(forwards && className) {\r\n element.classList.add(className);\r\n }\r\n\r\n const afterTimeout = () => {\r\n delete element.dataset.timeout;\r\n if(!forwards && className) {\r\n element.classList.remove('backwards', className);\r\n }\r\n\r\n element.classList.remove('animating');\r\n \r\n onTransitionEnd && onTransitionEnd();\r\n };\r\n\r\n if(!rootScope.settings.animationsEnabled || !duration) {\r\n element.classList.remove('animating', 'backwards');\r\n afterTimeout();\r\n return;\r\n }\r\n\r\n element.classList.add('animating');\r\n\r\n element.classList.toggle('backwards', !forwards);\r\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\r\n};\r\n\r\nexport default SetTransition;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValue(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, undefined, undefined, entities);\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities?.length) {\r\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\r\n /* const entity = entities[entities.length - 1];\r\n const length = value.length;\r\n const trimmedLength = value.trimRight().length;\r\n if(length !== trimmedLength) {\r\n entity.length -= length - trimmedLength;\r\n } */\r\n\r\n RichTextProcessor.combineSameEntities(entities);\r\n RichTextProcessor.sortEntities(entities);\r\n }\r\n\r\n //console.log('getRichValue:', value, entities);\r\n\r\n return {value, entities};\r\n}\r\n\r\nMOUNT_CLASS_TO.getRichValue = getRichValue;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.6aa9cb644edbb8b0e00a.chunk.js b/public/14.6aa9cb644edbb8b0e00a.chunk.js deleted file mode 100644 index 3832a5b55..000000000 --- a/public/14.6aa9cb644edbb8b0e00a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[14],{103:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(5),n=s(40);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},109:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(79),n=s(85),a=s(0),o=s(40);class r extends o.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let s;a.IS_APPLE?s=-.16*e:a.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(n.a)(this.value),o=i.formatted,r=i.country,c=i.leftPattern,l=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},110:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(54);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(e=>(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.a.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},121:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(54);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},122:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(40);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},165:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Gr}));var i=s(42),n=s(73),a=s(15),o=s(43),r=s(55),l=s(30),c=s(5),d=s(116),h=s(161),p=s(169);const u=[...h.a].concat([...p.a]);var m=new Set(u);function g(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(38),v=s(104),f=s(39);function y(e){Object(f.d)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(31);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.g)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then(t=>{if(e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null});return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class L extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=v.a.incrementMessageId(o,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.d)(this.previous,i),Object(f.d)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var C=s(75),E=s(70),I=s(64),M=s(17),P=s(41),T=s(46),k=s(36),x=s(16);class O{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=qr.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(x.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&qr.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new T.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{try{const s=this.peerId?t.fromId:t.peerId;qr.addDialogAndSetLastMessage({peerId:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(k.a)(n.nameEl,Object(x.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var F=s(40);class _{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new F.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var D=s(132),j=s(49),B=s(48),R=s(80),U=s(34);var H=(e,t={})=>Object(U.a)("btn-icon",Object.assign({icon:e||void 0},t)),N=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class z{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=H("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new T.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return N(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(x.i18n)(e))}}class V extends z{constructor(e){super(e),this.eventListener=new B.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{j.a.findItemByType(this.navigationType)?j.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof z?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.g)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(D.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof z?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),j.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof z?e.container:e),!0}removeTabFromHistory(e){Object(f.e)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||j.a.removeByType(this.navigationType,!0);const i=e instanceof z?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var G=s(51),W=s(139);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),this.container.addEventListener("click",()=>{(new W.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var Q=(e={})=>Object(U.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class $ extends z{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new pn({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new F.b({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new F.b({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)}),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;G.a.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),this.peerIds.length&&G.a.inviteToChannel(e,this.peerIds),vn.removeTabFromHistory(this),vn.selectTab(0)})}else this.nextBtn.disabled=!0,G.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),vn.removeTabFromHistory(this),vn.selectTab(0)})});const s=new pn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=qr.createChatList({new:!0});s.content.append(i),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,s.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const s=super.open();return s.then(()=>{t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(x.default.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),this.peerIds.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(P.a.getUserStatusString(e))})}),s}startLocating(){navigator.geolocation.getCurrentPosition(e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then(e=>e.json()).then(e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)})},e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")})}}var Y=s(88),X=s(37),J=s(32),Z=s(131),ee=s(84),te=s(35),se=s(18),ie=s(99),ne=s(98),ae=s(45),oe=s(59),re=s(0),le=s(54),ce=s(167),de=s(29),he=s(72),pe=s(57),ue=s(1),me=s(113),ge=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return re.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=C.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=he.a.getCacheContext(s);e.src=i.url;const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:n,mid:o}=s,r=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===o&&e.peerId===n;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:n,mid:o})}this.setMedia(t,r)}setTimeout(()=>{a.default.dispatchEvent("media_play",{doc:i.a.getMediaFromMessage(r),message:r,media:t})},0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(pe.a)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const p=Object(ae.a)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then(()=>{const e=he.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),C.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s;return ge(this,void 0,void 0,(function*(){yield Object(me.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=he.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=x.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(re.IS_APPLE?ue.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(w.b)(this.searchContext,e)&&(this.searchContext=Object(w.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new L({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}setMedia(e,t){this.playingMedia=e,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};de.a.appMediaPlaybackController=ve;var fe=ve,ye=s(112);function we(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}class Se{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=we(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(I.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(I.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(I.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Le=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item"+(t?" tgico-"+t:""),Object(se.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?Object(x.i18n)(s):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return Object(l.b)(o,e=>{Object(c.a)(e);!1!==i(e)&&(d||Object(te.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var Ce=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Le);return s.append(...i),s};const Ee=(e,t,s)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const i=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(te.c)():(t&&t(s),Object(te.d)(i))})};var Ie=(e={},t,s,i)=>{e.asDiv=!0;const n=H("more btn-menu-toggle",e),a=Ce(s,e.listenerSetter);return a.classList.add(t),Ee(n,i,e),n.append(a),n},Me=s(6);class Pe extends B.a{constructor(){super(!1),this.hideControls=()=>{clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0;const e=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!e||this.controlsLocked)return}else if(!e)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.showControlsTimeout?(clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.showControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.showControlsTimeout=0}setup(e){Object(w.g)(this,e);const{listenerSetter:t,element:s}=this;ue.IS_TOUCH_SUPPORTED?t.add(s)("click",()=>{this.toggleControls()}):(t.add(s)("mousemove",()=>{this.showControls()}),t.add(s)("mouseenter",()=>{this.showControls(!1)}),t.add(s)("mouseleave",e=>{e.relatedTarget&&this.showOnLeaveToClassName&&Object(Me.a)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()}))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}var Te=s(111);class ke extends Se{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class xe extends Se{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z":e>.5?"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z":e>0&&e<.25?"M7 9v6h4l5 5V4l-5 5H7z":"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z";try{this.volumeSvg.innerHTML=``}catch(e){}this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}}),this.btn=document.createElement("div"),this.btn.classList.add("player-volume"),this.btn.innerHTML='\n \n ',this.btn.classList.add("btn-icon"),this.volumeSvg=this.btn.firstElementChild,this.btn.append(this.container),Object(l.b)(this.volumeSvg,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}class Oe extends Pe{constructor(e,t=!1,s=!1,i){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.listenerSetter=new R.a,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!this.video.paused,showOnLeaveToClassName:"media-viewer-caption"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new ke(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=String(0|s.duration).toHHMMSS();const l=new xe(n),d=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),ue.IS_TOUCH_SUPPORTED||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.default.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;return"KeyF"===i?this.toggleFullScreen():"KeyM"===i?fe.muted=!fe.muted:"Space"===i?this.togglePlay():e.altKey&&"Equal"===i?fe.playbackRate+=.25:e.altKey&&"Minus"===i?fe.playbackRate-=.25:!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"}),n?(Object(c.a)(e),!1):void 0})),n.add(s)("dblclick",()=>{ue.IS_TOUCH_SUPPORTED||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(Te.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=String(0|s.currentTime).toHHMMSS()}),n.add(s)("play",()=>{t.classList.add("played")},{once:!0}),n.add(s)("pause",()=>{this.showControls(!1)})}n.add(s)("play",()=>{t.classList.add("is-playing")}),n.add(s)("pause",()=>{t.classList.remove("is-playing")}),s.duration||e?r.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():Object(me.e)(s).then(()=>{r.innerHTML=String(Math.round(s.duration)).toHHMMSS()})}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=[.25,.5,1,1.25,1.5,2].map(e=>({regularText:1===e?"Normal":""+e,onClick:()=>{this.video.playbackRate=e}})),t=Ce(e),s=this.wrapper.querySelector(".settings");t.classList.add("top-left"),Ee(s),s.append(t)}toggleFullScreen(){const e=this.wrapper;if(re.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(Te.d)()?Object(Te.b)():Object(Te.e)(e)}onFullScreen(e){const t=Object(Te.d)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners()}}var Ae=s(124),Fe=s(76),_e=s(94),De=s(44);function je(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(De.b,e)}var Be=s(47);function Re(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");const n=b.b.isMobile?16:23,a=b.b.isMobile?152:190,o=b.b.isMobile?190:256,r=s.duration,d=Object(I.a)(r/60*o,a,o),h=document.createElementNS("http://www.w3.org/2000/svg","svg");h.classList.add("audio-waveform"),h.setAttributeNS(null,"width",""+d),h.setAttributeNS(null,"height",""+n),h.setAttributeNS(null,"viewBox",`0 0 ${d} ${n}`);const p=document.createElement("div");p.classList.add("audio-time"),e.append(h,p);let u=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);u=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(u.slice(0,63));const m=Math.max(...u),g=u.length?u.length:100,v=Math.min(d/4|0,g);let f=0;const y=n-4;let w="";for(let e=0,t=0,s=0;e=g){s=s+v-g,s<(v+1)/2&&f\n `,t+=4,f=s<(v+1)/2?0:i}else f{let t=e.audio;const s=()=>{const e=t.currentTime===t.duration?0:Math.ceil(t.currentTime/t.duration*v);S.forEach((t,s)=>t.classList.toggle("active",s0&&t.currentTime!==t.duration)&&s();const i=je(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/d*t.duration;t.currentTime=i}L.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),L.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),L.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),L.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(L,e=>{Object(c.a)(e),t.paused||i(e)})},Fe.a),()=>{L.remove(),L=null,t=null}}}function Ue(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const He=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=Object(Me.a)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+a;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+a,".media-round"+a],i){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(n.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));t=h.slice(0,d),s=h.slice(d+1)}return[t,s]};class Ne extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?Re(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(_e.a)(n.audioPerformer)),t?a.push(Object(oe.d)(s.date)):a.length||a.push(Object(I.b)(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(x.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new Ae.a;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new ke(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),m=this.querySelector(".audio-time");m.innerHTML=d;const g=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ae.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=u();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+d:""),n=()=>{m.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?He(this):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),m.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(m.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=Ss({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;g("audio"!==s.type&&!this.noAutoDownload);const i=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),re.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=Ue(!1),s=Object(ae.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=Fe.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",()=>{s.cancel()},{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then(()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)})}else{e=Ue(),t||(this.readyPromise=Object(ae.a)());const n=()=>{i();const n=C.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.append(p),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout(()=>{p.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||("audio"===s.type||this.noAutoDownload?Object(l.b)(h,()=>{i(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}):i(!1))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ne);class ze{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function Ve(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Y.f)(n,140),n=J.a.wrapEmojiText(n)),Object(k.a)(a,n)),h||(h=[]);let p=d&&d.media,u=!1,m=!1;const g=c?Array.from(c.children).slice():[];let b;if(p&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){b=fr.chat.bubbles.getMiddleware();const e=fr.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Cs({doc:p.document,div:c,lazyLoadQueue:e,group:gr,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;m="round"===t.type;try{Ss({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d))):("string"==typeof o&&(o=Object(Y.f)(o,140),o=J.a.wrapEmojiText(o)),Object(k.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(g.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",m))}),u}class Ke extends ze{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ve({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}const Ge=0,We=1,qe=2,Qe=4,$e=8;class Ye{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=Ye.countRatios(e),this.proportions=Ye.countProportions(this.ratios),this.averageRatio=Object(f.a)(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new Xe(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:$e|Qe|qe}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:We|$e|Qe},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:We|qe|Qe}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:We|$e|Qe},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:We|qe|Qe}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:We|$e|Qe},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:We|qe},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Qe|qe}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Qe|$e},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Qe|qe}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Qe|$e},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Qe},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:qe|Qe}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:We|$e|Qe},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:We|qe},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:qe},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Qe|qe}]}static countRatios(e){return e.map(e=>e.w/e.h)}static countProportions(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}}class Xe{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=Xe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(I.a)(e,1,2.75):Object(I.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=this.ratios.slice(e,e+t),i=Object(f.a)(s,0);return(this.maxWidth-(t-1)*this.spacing)/i},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=Object(f.a)(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.g)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=Q({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function tt(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class st{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?g(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(x.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(t=!0,e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label)),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):this.container.append(this.checkboxField.label),e.noCheckboxSubtitle||t||this.checkboxField.input.addEventListener("change",()=>{Object(k.a)(this.subtitle,Object(x.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;if(e.titleRight?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?this.title.innerHTML=e.title:this.title.append(Object(x.i18n)(e.titleLangKey)),t.append(this.title),e.titleRight){const s=document.createElement("div");s.classList.add("row-title","row-title-right"),"string"==typeof e.titleRight?s.innerHTML=e.titleRight:s.append(e.titleRight),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(se.ripple)(this.container,void 0,void 0,!0))}}const it=(e,t)=>tt(e.map(e=>({container:e.container,input:e.radioField.input})),t);function nt(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var at=s(61);class ot{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.default.getState().then(t=>{s.checked=Object(w.d)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{M.default.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(x._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const rt=document.createElement("div");function lt(e){Object(k.a)(rt,e),document.body.append(rt),rt.dataset.timeout&&clearTimeout(+rt.dataset.timeout),rt.dataset.timeout=""+setTimeout(()=>{rt.remove(),delete rt.dataset.timeout},3e3)}function ct(e){lt(Object(x.i18n)(e.langPackKey))}function dt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...c)=>(a||(a=new Promise((e,t)=>(o=e,r=t))),n?(clearTimeout(n),l=!0,r(),a=new Promise((e,t)=>(o=e,r=t))):s&&(o(e(...c)),l=!1),n=setTimeout(()=>{!i||s&&!l||o(e(...c)),n=a=o=r=void 0,l=!1},t),a.catch(()=>{}),a)}rt.classList.add("toast");var ht=s(33);class pt extends F.b{constructor(e){super(e),this.checkUsernameDebounced=dt(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(F.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());J.b.isUsernameValid(e)?this.setState(F.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ht.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ht.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(F.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&J.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var ut=s(58),mt=s(50);class gt extends ut.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(ut.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new Or;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(x.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(x.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new mt.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var bt=s(53);class vt extends V{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=G.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new pn({name:e?"ChannelType":"GroupType"}),s=Object(at.b)(),i=new st({radioField:new ot({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new st({radioField:new ot({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=it([i,o],e=>{const t=[d,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),g()}),c=G.a.getChat(this.chatId);t.content.append(r);const d=new pn({}),h=new st({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{nt(this.chatFull.exported_invite.link),lt(x.default.format("LinkCopied",!0))}}),p=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new gt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(bt.a)([p],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),h.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),d.content.append(h.container,p);const u=new pn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),m=document.createElement("div");m.classList.add("input-wrapper");const g=()=>{const e=i.radioField.checked&&"t.me/"!==v||b.isValidToChange()&&b.input.classList.contains("valid");f.classList.toggle("is-visible",e)},b=new pt({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:g,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),v="t.me/"+(c.username||"");m.append(b.container),u.content.append(m);const f=Q({icon:"check",className:"is-visible"});this.content.append(f),Object(l.b)(f,()=>{Object(te.g)(f);const e=o.radioField.checked?b.getValue():"";G.a.migrateChat(this.chatId).then(t=>G.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==v?o:i).radioField.checked=!0,b.setOriginalValue(v),this.scrollable.append(t.container,d.container,u.container);{const t=new pn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new mt.a({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.toggleNoForwards(this.chatId,s.checked).then(()=>{e()})});const i=()=>{s.setValueSilently(!!c.pFlags.noforwards)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&i()}),i(),t.content.append(s.label),this.scrollable.append(t.container)}}}var ft=s(60);class yt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.g)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var wt=s(83),St=s(100),Lt=s(52),Ct=s(96),Et=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class It{constructor(e){this.container=document.createElement("div"),this.list=qr.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=qr.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.g)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(x._i18n)(this.input,this.placeholder,void 0,"placeholder"):Object(x._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new pn({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new T.b(t),this.selectedContainer.addEventListener("click",e=>{if(this.freezed)return;let t=e.target;if(t=Object(Me.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const s=new pn({name:this.sectionNameLangPackKey,noShadow:!0});s.content.append(this.list),this.chatsContainer.append(s.container),this.scrollable=new T.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),this.chatsContainer.addEventListener("click",e=>{const t=Object(St.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const i=dt(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(mn()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!P.a.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=Ct.a.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice(e=>e.peerId===a.default.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||P.a.canSendToUser(e))||G.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?P.a.getContactsPeerIds(this.query):[],this.query?P.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(f.b)(i.concat(t))}else this.cachedContacts=i.slice();Object(f.e)(this.cachedContacts,a.default.myId),this.promise=null}const t=Ct.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>G.a.getParticipantPeerId(e));Object(f.e)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>P.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new mt.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?Object(x.i18n)(this.selfPresence):P.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Lt.a({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:(Object(k.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:wt.a.Static})})}}var Mt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pt extends ut.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new It({appendTo:this.body,onChange:()=>Mt(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),ue.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Tt extends V{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new pn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=qr.createChatList({new:!0});s.append(i);const{dom:n}=qr.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(P.a.getUserStatusString(this.userId));const a=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(w.b)(this.participant.banned_rights.pFlags,e.pFlags)||G.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new pn({});if("channelParticipantBanned"===this.participant._){const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(bt.a)([s],!0);G.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(bt.a)([s],!0);G.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=G.a.getChat(e.chatId).default_banned_rights,s=e.participant?G.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):t;for(const i of this.v){const n=i.flags[0];i.checkboxField=new mt.a({text:i.text,checked:G.a.hasRights(e.chatId,n,s),restriction:!0,withRipple:!0}),e.participant&&t.pFlags[n]&&(i.checkboxField.input.disabled=!0,Object(l.b)(i.checkboxField.label,e=>{lt(x.default.format("UserRestrictionsDisabled",!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[n]&&e.listenerSetter.add(i.checkboxField.input)("change",()=>{if(!i.checkboxField.checked){this.v.filter(e=>this.toggleWith[n].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(i.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v){!t.checkboxField.checked&&t.flags.forEach(t=>{e.pFlags[t]=!0})}return e}}class Ot extends V{init(){return kt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new pn({name:"ChannelPermissionsHeader"});e=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{G.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new pn({name:"PrivacyExceptions"}),s=new st({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Pt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>kt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void lt("User is no longer participant")}const s=new Tt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=qr.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=G.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(x.join)(a.map(e=>Object(x.i18n)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=qr.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++m):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--m),p()});const p=()=>{Object(k.a)(s.subtitle,Object(x.i18n)(m?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[m]))};let u,m=0;const g=()=>(u=new yt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return m=e.count,p(),e.participants.length<50||e.count===c.childElementCount})}),u.load());this.scrollable.append(t.container),G.a.isChannel(this.chatId)?yield g():(p(),this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,g())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class At{constructor(e,t=o.a.getDialogType(e),s){const n=new Lt.a({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=G.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=G.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,p;switch(t){case"channel":G.a.hasRights(e.toChatId(),"delete_chat")?(G.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new Lt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":G.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var Ft=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class _t extends z{_init(){return Ft(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");const e=yield n.default.getChatFull(this.chatId,!0),t=G.a.getChat(this.chatId),s=G.a.isBroadcast(this.chatId),i=G.a.isChannel(this.chatId),o=[],r=e=>{o.push(e)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&o.forEach(e=>e())});const c=this.chatId.toPeerId(!0);{const i=new pn({noDelimiter:!0}),n=[],o=document.createElement("div");if(o.classList.add("input-wrapper"),this.chatNameInputField=new F.b({label:s?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new F.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),o.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new et({peerId:c,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),i.content.append(this.editPeer.avatarEdit.container,o),G.a.hasRights(this.chatId,"change_type")){const n=new st({titleLangKey:s?"ChannelType":"GroupType",clickable:()=>{const t=new vt(this.slider);t.chatId=this.chatId,t.chatFull=e,t.open(),this.listenerSetter.add(t.eventListener)("destroy",a)},icon:"lock"}),a=()=>{let e;n.subtitle.textContent="",e=s?t.username?"TypePublic":"TypePrivate":t.username?"TypePublicGroup":"TypePrivateGroup",n.subtitle.append(Object(x.i18n)(e))};a(),i.content.append(n.container)}if(G.a.hasRights(this.chatId,"change_permissions")&&!s){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new st({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Ot(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=e.reduce((e,s)=>e+ +G.a.hasRights(this.chatId,s,t.default_banned_rights),0)+"/"+e.length};n(),i.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(i.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(G.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(G.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>G.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),s&&G.a.hasRights(this.chatId,"change_info")){const e=new mt.a({text:"PeerInfo.SignMessages",checked:!!t.pFlags.signatures,withRipple:!0});this.listenerSetter.add(e.input)("change",()=>{const t=e.toggleDisability(!0);G.a.toggleSignatures(this.chatId,e.checked).then(()=>{t()})}),r(()=>{e.setValueSilently(!!t.pFlags.signatures)}),i.content.append(e.label)}}if(!s){const t=new pn({});if(!s&&G.a.hasRights(this.chatId,"change_permissions")){const s=new mt.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.togglePreHistoryHidden(this.chatId,!s.checked).then(()=>{e()})});const n=()=>{s.setValueSilently(i&&!e.pFlags.hidden_prehistory)};n(),r(n),t.content.append(s.label)}t.content.childElementCount&&this.scrollable.append(t.container)}if(G.a.hasRights(this.chatId,"delete_chat")){const e=new pn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:s?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new At(c,void 0,e=>{const s=Object(bt.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}i||this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{c===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Dt=s(105);class jt extends z{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!P.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new pn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new F.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=P.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new et({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new mt.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),this.listenerSetter.add(a.default)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Dt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new Lt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(x.i18n)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=P.a.getUser(this.peerId),s=new st({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?P.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Lt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new st({checkboxField:r}),s=!Dt.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,P.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,P.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new pn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new gt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(ut.a)([{langKey:"Delete",callback:()=>{const e=Object(bt.a)([t],!0);P.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class Bt extends z{init(){this.container.classList.add("add-members-container"),this.nextBtn=Q({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(te.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new It({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var Rt=!re.IS_FIREFOX&&!1;function Ut(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Ht=e=>e.touches?e.touches[0]:e,Nt=window;let zt=!1;a.default.addEventListener("context_menu_toggle",e=>{zt=e});class Vt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{ue.IS_TOUCH_SUPPORTED?Nt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Nt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Ht(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,ue.IS_TOUCH_SUPPORTED?Nt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Nt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||zt)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Ht(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,ue.IS_TOUCH_SUPPORTED||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.g)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.addEventListener("mouseup",this.reset))}removeListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!ue.IS_TOUCH_SUPPORTED&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gt{constructor(e){this.scrollable=e,this.loadCallbacks=new Map,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Gt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=Ss({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Gt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Gt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Gt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Gt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Gt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Gt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Gt.BASE_CLASS+"-arrow",Gt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext);const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>Kt(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,Tr(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(De.b)(()=>{this.avatars.classList.remove("no-transition")})}})));const n=()=>{s=!0,document.body.addEventListener(ue.IS_TOUCH_SUPPORTED?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,p=0,u=0;new Vt({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-Gt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,u=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(p)/(a/Gt.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(De.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.a.getUserPhotos(e,i,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(n.default.getChatFull(e.toChatId())),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice(e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Gt.SCALE*s;this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Gt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}}Gt.BASE_CLASS="profile-avatars",Gt.SCALE=Rt?2:1,Gt.TRANSLATE_TEMPLATE=Rt?`translate3d({x}, 0, -1px) scale(${Gt.SCALE})`:"translate({x}, 0)";let Wt=(e,t)=>{t.title.innerHTML=e,t.container.style.display=""};class qt{constructor(e){this.scrollable=e,this.setPeerStatus=(e=!1)=>{if(!this.peerId)return;const t=this.peerId;fr.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId)},Rt||this.scrollable.container.classList.add("no-parallax")}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new pn({noDelimiter:!0}),this.avatar=new Or,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog","1"),this.avatar.setAttribute("clickable",""),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new st({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&n.default.getProfileByPeerId(this.peerId).then(e=>{nt(e.about),lt(x.default.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new st({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{nt("@"+o.a.getPeer(this.peerId).username),lt(x.default.format("UsernameCopied",!0))}}),this.phone=new st({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{nt("+"+P.a.getUser(this.peerId).phone),lt(x.default.format("PhoneCopied",!0))}}),this.location=new st({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.notifications=new st({checkboxField:new mt.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.notifications.container),this.element.append(this.section.container),Rt&&this.element.append(mn()),this.notifications.checkboxField.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),a.default.addEventListener("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Dt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),a.default.addEventListener("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("peer_bio_edit",e=>{e===this.peerId&&this.setMoreDetails(!0)}),a.default.addEventListener("user_update",e=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("contacts_update",e=>{if(this.peerId===e){const t=P.a.getUser(e);t.pFlags.self||(t.phone?Wt(P.a.formatUserPhone(t.phone),this.phone):this.phone.container.style.display="none")}}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){this.bio.container.style.display="none",this.phone.container.style.display="none",this.username.container.style.display="none",this.location.container.style.display="none",this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0,this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0)}setAvatar(){if(this.peerId!==a.default.myId){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Gt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Rt&&this.scrollable.container.classList.add("parallax"))}}Rt&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillProfileElements(){var e;if(!this.cleaned)return;this.cleaned=!1;const t=this.peerId;if(this.cleanupHTML(),this.setAvatar(),t!==a.default.myId){o.a.getPeerUsername(t)&&Wt(o.a.getPeerUsername(t),this.username);const e=Dt.a.isPeerLocalMuted(t,!1);this.notifications.checkboxField.checked=!e}else Object(De.b)(()=>{this.notifications.container.style.display="none"});if(t.isUser()){let e=P.a.getUser(t);e.phone&&t!==a.default.myId&&Wt(P.a.formatUserPhone(e.phone),this.phone)}this.setMoreDetails(),Object(k.a)(this.name,new Lt.a({peerId:t,dialog:!0}).element);const s=o.a.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Ut()),this.setPeerStatus(!0)}setMoreDetails(e){this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0);const t=this.peerId,s=this.threadId;if(!t)return;let i;i=t.isUser()?n.default.getProfile(t,e).then(e=>this.peerId===t&&this.threadId===s&&(e.rAbout&&t!==a.default.myId&&Wt(e.rAbout,this.bio),!0)):n.default.getChatFull(t.toChatId(),e).then(e=>{var i;return this.peerId===t&&this.threadId===s&&(e.about&&Wt(J.b.wrapRichText(e.about),this.bio),"channelLocation"==(null===(i=null==e?void 0:e.location)||void 0===i?void 0:i._)&&Wt(e.location.address,this.location),!0)}),i.then(e=>{e&&(this.setMoreDetailsTimeout=window.setTimeout(()=>this.setMoreDetails(!0),6e4))})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class Qt extends z{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(U.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(x.i18n)("Profile")),this.editBtn=H("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(x.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new qt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=Object(D.a)(s,"slide-fade",400,null,!1);r(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new _t(this.slider):new jt(this.slider),t&&(t instanceof _t?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.default.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.default.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.default.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.default.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.default.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new Zs({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout(()=>{c.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.profile.element.append(this.searchSuper.container);const c=Q({icon:"addmember_filled"});this.content.append(c),c.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=G.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(x.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new Lt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Lt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Lt.a({peerId:t[0]}).element],checked:!0}])}r.push(new Lt.a({peerId:e}).element),new gt("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&ct({langPackKey:"InviteToGroupError"})};if(s){const e=new Bt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=G.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Pt({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{G.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&G.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&P.a.isContact(this.peerId.toUserId()):G.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const $t=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new Qt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=fr.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};de.a.appSidebarRight=$t;var Yt=$t;class Xt extends z{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=Je.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);es(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");c.innerHTML=J.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=qr.createChatList();h.classList.add("poll-results-voters"),qr.setListClickListener(h,()=>{Yt.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,m=!1,g=t.voters-4;const b=()=>{m||(m=!0,Je.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(g-=e.votes.length,v.lastElementChild.replaceWith(Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,u=20,g&&e.votes.length||v.remove()}).finally(()=>{m=!1}))};if(b(),g<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(se.ripple)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)])),a.append(v)}),this.resultsDiv.append(i,a),Yt.toggleSidebar(!0).then(()=>{}),t}}var Jt=s(65);let Zt=0;const es=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.default.addEventListener("peer_changed",()=>{ss&&ts(ss,is,ns)}),b.b.addEventListener("resize",()=>{as.setMaxLength(),as.resizePolls()}),b.b.addEventListener("changeScreen",()=>{as.setMaxLength()});const ts=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),ss===e&&is===t&&ns===s&&(ss=is=null,ns=0)},200)};let ss,is,ns;class as extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ct.a.width<=360?Ct.a.width-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){Zt||(Zt=document.getElementById("poll-line").getTotalLength(),as.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Je.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${J.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(x.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Ze.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{Je.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(x.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),Yt.isTabExists(Xt)||new Xt(Yt).open(this.message)}),Object(se.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(x.i18n)("Chat.Poll.SubmitVote")),Object(se.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{ss&&ts(ss,is,ns);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=J.a.wrapRichText(e,{entities:t}),fr.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),ss=i,is=s,ns=window.setTimeout(()=>{ts(i,s,ns)},ue.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Me.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=Je.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(k.a)(this.typeDiv,Object(x.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(Jt.a)(this,"",!this.isRetracted,340),Object(De.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";(e.recent_voters||[]).forEach((e,s)=>{const i=0===s?"":`style="transform: translateX(-${3*s}px);"`;t+=``}),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(De.b)(e):e()}let n;e=e.slice(),es(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(k.a)(this.votersCountDiv,Object(x.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*as.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*as.MAX_OFFSET)}}as.MAX_OFFSET=-46.5,as.MAX_LENGTH=0,customElements.define("poll-element",as);var os=s(120),rs=s(106),ls=s(66),cs=s(67),ds=s(68),hs=s(134),ps=s(140),us=s(129),ms=s(91),gs=s(97),bs=s(158),vs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let fs=0;function ys({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:m,withoutPreloader:g,loadPromises:v,noPlayButton:f,noAutoDownload:y,size:w,searchContext:S}){var L,I;const M=!(i&&n),P=("video"!==e.type||e.size<=52428800&&!M)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let T,k;if(!p){T=document.createElement("span"),T.classList.add("video-time"),t.append(T);let s=!1;"gif"!==e.type?(T.innerText=(e.duration+"").toHHMMSS(!1),f||"round"===e.type||(P&&!y?T.classList.add("tgico","can-autoplay"):s=!0)):(T.innerText="GIF",P||f||(s=!0,y=void 0)),s&&(k=document.createElement("span"),k.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(k))}let x,O={};if("image/gif"===e.mime_type){const a=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:g,loadPromises:v,noAutoDownload:y,size:w});return O.thumb=a,O.loadPromise=a.loadPromises.full,O}const A=document.createElement("video");if(A.classList.add("media-video"),A.setAttribute("playsinline","true"),A.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;fs||(fs=2*Math.PI*r),d.style.strokeDasharray=fs+" "+fs,d.style.strokeDashoffset=""+fs,T.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,T),i.append(A),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!y),s=()=>{(fr.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(ds.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",m))})},n=()=>{p.drawImage(t,0,0);const e=fs-t.currentTime/t.duration*fs;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(ds.a)(t)?(t.paused&&n(),T.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=je(a),r=()=>{A.classList.add("hide"),i.classList.remove("is-paused"),Object(os.b)(n,h),x&&x.preloader&&x.preloader.classList.contains("manual")&&x.onClick()},u=()=>{Object(ds.a)(t)?i.classList.add("is-paused"):s()},m=()=>{A.classList.remove("hide"),i.classList.add("is-paused"),A.currentTime=0,T.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",m),Object(l.b)(h,s=>{if(Object(c.a)(s),x&&!x.detached&&x.onClick(),t.paused){const s=!!S;if(fe.setSearchContext(S||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?He(i):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),A.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else A.autoplay=!0;let F;if(s){if(F=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,noAutoDownload:y,size:w}),O.thumb=F,!P&&"gif"!==e.type||m)return O.loadPromise=F.loadPromises.full,O;if(o){const e=(F.images.thumb||F.images.full).parentElement;A.width=+e.getAttributeNS(null,"width"),A.height=+e.getAttributeNS(null,"height"),e.append(A)}}else{const t=C.a.getThumb(e,!1);t&&t.promise.then(()=>{A.poster=t.cacheContext.url})}!A.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(A);const _=he.a.getCacheContext(e),D=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.preloader);D?(x=s.media.preloader,x.attach(t,!1),y=void 0):_.downloaded||e.supportsStreaming?e.supportsStreaming&&(x=new ye.a({cancelable:!1,attachMethod:"prepend"})):x=new ye.a({attachMethod:"prepend"});const j=Object(ae.a)();A.addEventListener("error",e=>{4!==A.error.code&&console.error("Error "+A.error.code+"; details: "+A.error.message),x&&!D&&x.detach(),j.isFulfilled||j.resolve()},{once:!0}),Object(me.e)(A).then(()=>{u&&E.a.addAnimation(A,u),x&&!D&&x.detach(),j.resolve()}),"video"===e.type&&A.addEventListener("timeupdate",()=>{T.innerText=(A.duration-A.currentTime+"").toHHMMSS(!1)}),A.muted=!0,A.loop=!0,A.autoplay=!0;let B=y&&(null===(I=null==F?void 0:F.preloader)||void 0===I?void 0:I.loadFunc);const R=()=>{x&&y&&!g&&(x.construct(),x.setManual());let i=Promise.resolve();if(x&&!D)if(_.downloaded||e.supportsStreaming)e.supportsStreaming&&(y?i=Promise.reject():_.downloaded||(x.attach(t,!1,null),A.addEventListener(re.IS_SAFARI?"timeupdate":"canplay",()=>{x.detach()},{once:!0})));else{const s=i=C.a.downloadDoc(e,null==h?void 0:h.queueId,y);x.attach(t,!1,s)}return!y&&B&&(B(),B=null),y=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(rs.a)(A,_.url)):j.resolve()},()=>{}),{download:i,render:j}};return x&&!D&&x.setDownloadFunction(R),"gif"!==e.type||P?O.loadPromise=h?(h.push({div:t,load:()=>R().render}),Promise.resolve()):R().render:Object(l.b)(t,e=>{Object(c.a)(e),k.remove(),R()},{capture:!0,once:!0}),O}function ws({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,noAutoDownload:h,lazyLoadQueue:p}){var u,g;s||(s=500);const b=e.media.document||e.media.webpage.document,v=e.pFlags.is_outgoing&&(null===(u=e.media)||void 0===u?void 0:u.preloader);if("audio"===b.type||"voice"===b.type||"round"===b.type){const i=new Ne;return i.withTime=t,i.message=e,i.noAutoDownload=h,i.lazyLoadQueue=p,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),v&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let f=b.file_name?b.file_name.split("."):"",y="";y=f.length>1&&Array.isArray(f)?Object(hs.a)(f.pop().split(" ",1)[0].toLowerCase()):"file";let w=document.createElement("div");w.classList.add("document","ext-"+y),w.dataset.docId=""+b.id;const S=document.createElement("div");S.classList.add("document-ico");const L=he.a.getCacheContext(b);if((null===(g=b.thumbs)||void 0===g?void 0:g.length)||e.pFlags.is_outgoing&&L.url&&"photo"===b.type){w.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)S.innerHTML=``,t.push(S.firstElementChild);else{const e=Ss({photo:b,message:null,container:S,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(b,54,54,!0)});S.style.width=S.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach(e=>e.classList.add("document-thumb"))}else S.innerText=y;let E=b.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const M=[Object(I.b)(b.size)];t&&M.push(Object(oe.d)(e.date)),o&&M.push(i.a.wrapSenderToPeer(e)),w.innerHTML=`\n ${L.downloaded&&!v?"":'
'}\n
\n
\n `;const P=w.querySelector(".document-name"),T=new Ae.a;T.dataset.fontWeight=""+s,T.innerHTML=E,P.append(T),o&&P.append(i.a.wrapSentTime(e));if(w.querySelector(".document-size").append(...Object(x.joinElementsWith)(M," · ")),w.prepend(S),!v&&e.pFlags.is_outgoing)return w;let k,O=null;const A=()=>{if(k){k.classList.add("downloaded");const e=k;setTimeout(()=>{e.remove()},200),k=null}O&&(O=null)},F=e=>{var t;const s=!e||e.isTrusted,i=C.a.getDoc(w.dataset.docId);let n;const o=fr.chat.bubbles?fr.chat.bubbles.lazyLoadQueue.queueId:void 0;return s?"pdf"===i.type?(n=C.a.downloadDoc(i,o),n.then(()=>{setTimeout(()=>{const e=he.a.getCacheContext(i).url;window.open(e)},a.default.settings.animationsEnabled?250:0)})):n=m.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?C.a.downloadDoc(i,o):C.a.saveDocFile(i,o):n=C.a.downloadDoc(i,o),k&&(n.then(A),O.attach(k,!0,n)),{download:n}};return C.a.downloading.has(b.id)?(k=w.querySelector(".document-download"),O=new ye.a,O.attach(k,!1,C.a.downloading.get(b.id))):L.downloaded&&!v||(k=w.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(k),e.media.promise.then(A)):(O=new ye.a,O.construct(),O.setManual(),O.attach(k),O.setDownloadFunction(F))),Object(l.b)(w,e=>{O?O.onClick(e):F(e)}),w}function Ss({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:p,loadPromises:u,noAutoDownload:m,noBlur:g,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let S,L,E,I=s,M=!0,P=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(L=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,T?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,M=a.isFit,E=he.a.getCacheContext(e,h.type),!M){I=document.createElement("div"),I.classList.add("media-container-aspecter"),I.style.width=a.size.width+"px",I.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,E,!g,!0);if(i){P=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{Ss({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:u,middleware:d,withoutPreloader:p,withTail:o,noAutoDownload:m,noBlur:g,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(I)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),E=he.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,E,!g);t&&(P=Promise.all([P,t.loadPromise]),S=t.image,S.classList.add("media-photo"),I.append(S))}L.classList.add("media-photo");const k=(S||!E.downloaded)&&a.default.settings.animationsEnabled&&!f;let x;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(x=t.media.preloader,x.attach(s),m=void 0):E.downloaded||(x=new ye.a({attachMethod:"prepend"}));const O=e=>Ls(s,L,e,k,I,S),A=()=>d&&!d()?Promise.resolve():y?Object(ps.a)(E.url,12).then(e=>O(e)):O(E.url);let F;const _=h.w>=150&&h.h>=150||m,D=()=>{m&&!p&&x&&(x.construct(),x.setManual());const t=T&&!h?C.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,m);x&&!E.downloaded&&!p&&_&&x.attach(s,!1,t),m=void 0;const i=t.then(A);return i.catch(()=>{}),{download:t,render:i}};return x&&x.setDownloadFunction(D),E.downloaded?P=F=D().render:c?c.push({div:s,load:()=>D().download}):F=D().render,u&&P&&u.push(P),{loadPromises:{thumb:P,full:F||Promise.resolve()},images:{thumb:S,full:L},preloader:x,aspecter:I}}function Ls(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(rs.a)(t,s,()=>{ls.a.mutateElement(e,()=>{n.append(t),Object(De.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{ls.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Cs({doc:e,div:t,middleware:s,lazyLoadQueue:n,group:o,play:d,onlyThumb:h,emoji:p,width:u,height:m,withThumb:g,loop:b,loadPromises:f,needFadeIn:y,needUpscale:w}){var S;const L=e.sticker;if(u||(u=p?void 0:200),m||(m=p?void 0:200),2===L&&le.a.loadLottieWorkers(),!L)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");const E=he.a.getCacheContext(e),I=p?Object(ie.d)(p):-1,M=E.downloaded&&!y;let P=Object(ae.a)(),T=!1;if(((null===(S=e.thumbs)||void 0===S?void 0:S.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!M||2===L||h)&&!1!==g){let i,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[I]||e.thumbs[0];const o=()=>{t.childElementCount||(i.classList.add("media-sticker","thumbnail"),ls.a.mutateElement(t,()=>{t.append(i),P.resolve()}))};if("url"in a)i=new Image,Object(rs.a)(i,a.url,o),T=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&I<=0&&(i=new Image,us.a||e.pFlags.stickerThumbConverted||E.url?(Object(rs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),T=!0):ce.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(rs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if(2===L&&(g||h)&&I<=0){i=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const n=()=>{t.childElementCount||s&&!s()||Object(rs.a)(i,E.url,o)};return E.url?(n(),Promise.resolve()):C.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(T=!0)}}if(f&&T&&f.push(P),h)return Promise.resolve();const k=()=>vs(this,void 0,void 0,(function*(){if(!s||s()){if(2===L)return yield C.a.downloadDoc(e,null==n?void 0:n.queueId).then(ne.c).then(n=>vs(this,void 0,void 0,(function*(){if(s&&!s())return;let r=yield le.a.loadAnimationWorker({container:t,loop:b&&!p,autoplay:d,animationData:n,width:u,height:m,name:"doc"+e.id,needUpscale:w},o,I);if(r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;y=(y||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled;const i=()=>{s&&s!==r.canvas&&s.remove()};y?ls.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{ls.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&ls.a.mutate(i),C.a.saveLottiePreview(e,r.canvas,I)},{once:!0}),p){const e={a:[],v:1};let n;cs.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>vs(this,void 0,void 0,(function*(){Object(c.a)(a);const o=le.a.getAnimation(t);if(o.paused){const e=cs.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield C.a.downloadDoc(e);const t=he.a.getCacheContext(e);s.src=t.url,s.play(),yield Object(me.e)(s,void 0,!0),s.addEventListener("ended",()=>{s.src="",s.remove()},{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}const r=cs.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=document.createElement("div");l.classList.add("emoji-animation");l.style.width="280px",l.style.height="280px",Cs({div:l,doc:r,middleware:s,withThumb:!1,needFadeIn:!1,loop:!1,width:280,height:280,play:!0,group:"none"}).then(e=>{Object(ms.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),l.remove(),fr.chat.bubbles.scrollable.container.removeEventListener("scroll",y))}),bs.a&&e.addEventListener("firstFrame",()=>{navigator.vibrate(100)},{once:!0})});const d=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},h=Object(Me.a)(t,"bubble"),u=h.classList.contains("is-out"),m=d(16),g=d(4),b=35*(u?1:-1),f=()=>{if(!Object(ds.a)(t))return;const e=t.getBoundingClientRect(),s=(u?e.right:e.left)+((u?-280:0)+b+m),i=e.top+(e.height-280)/2+g;l.style.top=i+"px",l.style.left=s+"px"},y=je(f);fr.chat.bubbles.scrollable.container.addEventListener("scroll",y),f(),h&&(u?l.classList.add("is-out"):l.classList.add("is-in")),fr.emojiAnimationContainer.append(l),n||(n=Object(gs.a)(()=>{if(!e.a.length)return;const s=e.a[0].t;e.a.forEach(e=>{e.t=(e.t-s)/1e3});const n=Object(Me.a)(t,"bubble");i.a.setTyping(fr.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:v.a.getServerMessageId(+n.dataset.mid),emoticon:p,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0},1e3,!1)),a.isTrusted&&(e.a.push({i:1,t:Date.now()}),n())})))}return r})));if(1===L){const i=new Image,o=t.firstElementChild!==i&&t.firstElementChild;return y=(y||!M||o)&&a.default.settings.animationsEnabled,i.classList.add("media-sticker"),y&&i.classList.add("fade-in"),new Promise((a,r)=>{const l=()=>{if(s&&!s())return a();Object(rs.a)(i,E.url,()=>{ls.a.mutateElement(t,()=>{t.append(i),o&&o.classList.add("fade-out"),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),o&&o.remove()},{once:!0})})})};E.url?l():C.a.downloadDoc(e,null==n?void 0:n.queueId).then(l,a)})}}})),x=!n||M&&2!==L?k():(n.push({div:t,load:k}),Promise.resolve());return M&&1===L&&(P=x,f&&f.push(P)),x}function Es({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return vs(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=cs.a.getStickerSetThumbDownloadOptions(e),r=he.a.download(t);if(e.pFlags.animated)return r.then(ne.c).then(t=>{le.a.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)});{const e=new Image;return e.classList.add("media-sticker"),r.then(t=>{Object(rs.a)(e,URL.createObjectURL(t),()=>{s.append(e)})})}}});const l=cs.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Cs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Is(e,t,s){const i=new Ke("reply");return i.fill(e,t,s),i.container}function Ms(e){const t=new Ye(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&qe),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Qe),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&$e&&s&We&&(l.style.borderTopLeftRadius="inherit"),s&$e&&s&Qe&&(l.style.borderBottomLeftRadius="inherit"),s&qe&&s&We&&(l.style.borderTopRightRadius="inherit"),s&qe&&s&Qe&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Ps({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,noAutoDownload:d}){const h=[],p=i.a.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Ms({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?Ss({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,noAutoDownload:d}):ys({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,noAutoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;fs=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=fs+" "+fs,n.style.strokeDashoffset=""+fs})}}),a.default.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var Ts=s(77),ks=s(117),xs=s(89);function Os(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(xs.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}class As{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(ks.a)(),Object(w.g)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=Object(f.f)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Fs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class _s extends As{constructor(e={}){let t;super({getIndex:e.getIndex||(e=>P.a.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>{const t=P.a.getUserStatusString(e.id);Object(k.a)(e.dom.lastMessageSpan,t)}),onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Os(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=qr.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:De.b,updateListWith:e=>Fs(this,void 0,void 0,(function*(){return Object(ds.a)(this.list)?(yield Object(Ts.c)(),Object(ds.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.g)(this,e),this.list=qr.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},_s.SORT_INTERVAL)};s()}}_s.SORT_INTERVAL=3e4;var Ds=s(82);function js(e){let t=!1;return new Vt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Me.a)(t.target,"progress-line")&&!Object(Ds.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Bs(e){return js(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(te.b)(),!0}}))}var Rs=s(85),Us=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Hs extends Pt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Us(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}fr.setInnerPeer({peerId:s}),fr.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class Ns{constructor(e,t,s,n){const r=new Lt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,p,u,m=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(x.i18n)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())m.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=G.a.getChat(e.toChatId()),n=G.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.default.myId);s.length&&(s.length===t.length?m.push({text:"DeleteForAll"}):(m.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[Object(x.i18n)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}Object(ut.a)(u);new gt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:m}).show()}}var zs=s(146);class Vs{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new gt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var Ks=s(8);function Gs(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Ws=s(71);const qs=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class Qs{constructor(e){if(this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=e=>{e&&(this.doNotAnimate=!0),this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),Gs(),e&&(this.doNotAnimate=void 0)},Object(w.g)(this,e),this.navigationType="multiselect-"+Object(at.b)(),ue.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(te.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),Gs();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Me.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Me.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(ds.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=qs(i);if(this.toggleByElement&&s){n<2&&Object(Ws.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(Gs(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),Gs()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,p)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new mt.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||(s=!this.appMessagesManager.canForward(t)),i||(i=!this.appMessagesManager.canDeleteMessage(t)),s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;ue.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&Gs()),Object(Ks.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),re.IS_MOBILE_SAFARI||(n?j.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):j.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(Jt.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return qs(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return lt(x.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class $s extends Qs{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Me.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if(Object(Jt.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(Jt.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=H(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",()=>this.cancelSelection(),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=H(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=H(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Hs(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=H(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new Ns(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class Ys extends Qs{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Me.a)(e,"grouped-item")||Object(Me.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Me.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=(e,t)=>{const{needTranslateX:s,widthFrom:i,widthTo:n}=this.chat.input.center(t);Object(Jt.a)(this.listenElement,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)});const a=ithis.cancelSelection(),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(U.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(x.i18n)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new Vs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(U.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(x.i18n)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Hs(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(U.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(x.i18n)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new Ns(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e);const s=this.selectionLeft=document.createElement("div");s.classList.add("selection-container-left"),s.append(t,this.selectionCountEl);const i=this.selectionRight=document.createElement("div");i.classList.add("selection-container-right"),i.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==a&&(s.style.transform=`translateX(${-a}px)`,i.style.transform=`translateX(${a}px)`),this.selectionContainer.append(s,i),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",s.style.transform="",i.style.transform=""}}else this.selectionLeft&&void 0!==a&&(this.selectionLeft.style.transform=`translateX(-${a}px)`,this.selectionRight.style.transform=`translateX(${a}px)`)},this.onUpdateContainer=(e,t,s)=>{Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-sending")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var Xs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Js{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Hs({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new Ns(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Me.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{s.classList.remove("menu-open")})}};ue.IS_TOUCH_SUPPORTED||Object(te.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>i.a.canForward(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ce(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class Zs{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ee.d,this.middleware=Object(ks.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(X.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new Js(this.container,this),this.selection=new $s(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new T.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(x.i18n)(e.name)),s.append(i),t.append(s),Object(se.ripple)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),ue.IS_TOUCH_SUPPORTED&&Bs({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new O(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.mediaTab.contentTab.childElementCount&&this.load(!0)},this.selectTab=Object(Z.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start"});const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Me.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Me.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Me.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new Lr).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(Ts.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=qr.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});qr.setLastMessage(s,e,i,this.searchContext.query)}processPhotoVideoFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){const a=i.a.getMediaFromMessage(e),o=document.createElement("div");let l;o.classList.add("grid-item");const c=r.a.choosePhotoSize(a,200,200);l="photo"!==a._?ys({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:Ss({photo:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,withoutPreloader:!0,noBlur:!0,size:c}),[l.images.thumb,l.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),t.push(l.loadPromises.thumb),n.push({element:o,message:e})}processDocumentFilter({message:e,elemsToAppend:t,inputFilter:s}){const n=i.a.getMediaFromMessage(e),a=this.showSender||["voice","round"].includes(n.type),o=ws({message:e,withTime:!a,fontWeight:400,voiceAsMusic:!0,showSender:a,searchContext:this.copySearchContext(s),lazyLoadQueue:this.lazyLoadQueue,noAutoDownload:!0});["audio","voice","round"].includes(n.type)&&o.classList.add("audio-48"),t.push({element:o,message:e})}processUrlFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){var a;let o=null===(a=e.media)||void 0===a?void 0:a.webpage;if(!o){const t=e.totalEntities?e.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let s,i,n;if(t)n=e.message.slice(t.offset,t.offset+t.length);else{const t=J.b.matchUrl(e.message);if(!t)return;s=t[0]}s="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:s||n,i=s;const a=e.message===s;s.match(/^(ftp|http|https):\/\//)||(i="https://"+s,s=s.includes("@")?s:"https://"+s),i=new URL(i).hostname,o={_:"webPage",url:s,display_url:i,id:"",hash:0},a||(o.description=e.message,o.rDescription=J.b.wrapRichText(Object(Y.f)(e.message,150,180)))}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){Ss({container:l,message:null,photo:o.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,size:r.a.choosePhotoSize(o.photo,60,60,!1),loadPromises:t,noBlur:!0})}else l.classList.add("empty"),l.innerHTML=J.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0);let c=o.rTitle||"",d=o.rDescription||"";const h=Object(zs.a)(d),p=Object(zs.a)(J.b.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(e)),c||(c=J.b.wrapPlainText(o.display_url.split("/",1)[0]));const u=new st({title:c,titleRight:i.a.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.container,message:e})}performSearchResult(e,t,s=!0){return Xs(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield Object(Ts.c)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:i,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);for(const t of e)try{c.message=t,d(c)}catch(e){this.log.error("error rendering filter",l,c,t,e)}}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(i.length){const e=s?"append":"prepend";i.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,l);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=qr.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(Y.e)(s)}|${Object(Y.e)(Object(hs.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)c.lastMessageSpan.append(Object(x.i18n)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=P.a.getUser(t);s&&s.phone&&(e="+"+Object(Rs.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},l=e=>{if(t())return e};return Promise.all([P.a.getContactsPeerIds(s,!0).then(l).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),P.a.searchContacts(s,20).then(l).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new x.default.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),e.addEventListener("click",()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()})}}),i.a.getConversations(s,0,20,0).promise.then(l).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.default.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=qr.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?P.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([P.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.default.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{qr.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>Xs(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new _s({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),this.membersList.list.addEventListener("click",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=Yt.toggleSidebar(!1)),i.then(()=>{fr.setInnerPeer({peerId:s})})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=G.a.getParticipantPeerId(e);if(t.isAnyChat())return;P.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(G.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return Xs(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(Ct.a.height/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new x.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(w.e)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},Os(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!G.a.isBroadcast(this.searchContext.peerId.toChatId())&&G.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(te.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(w.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var ei,ti=s(74);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ei||(ei={}));const si=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ht.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(P.a.saveApiUsers(s.users),G.a.saveApiChats(s.chats),ti.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(Y.b)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(Y.b)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(Y.b)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ht.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(P.a.saveApiUsers(e.users),G.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};de.a.appPrivacyManager=si;var ii=si;class ni{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?Object(x._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===ei.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===ei.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new pn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:ei.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:ei.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:ei.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(at.b)();t.forEach(({type:e,langKey:t})=>{const i=new st({radioField:new ot({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=it([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=un(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new st(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Bt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=ii.getPrivacy(e.inputKey).then(t=>{const s=ii.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case ei.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case ei.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case ei.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>P.a.getUserInput(e))})}}),ii.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(x.join)([e.users.length?Object(x.i18n)("Users",[e.users.length]):null,e.chats.length?Object(x.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(x.i18n)("PrivacySettingsController.AddUsers")]}}class ai extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=new ni({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:["PrivacyPhoneInfo","PrivacyPhoneInfo",""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{t.setRadio(ei.Everybody),t.radioSection.container.classList.toggle("hide",e!==ei.Nobody)}}),t=new ni({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[ei.Nobody]});this.scrollable.container.insertBefore(t.radioSection.container,e.radioSection.container.nextSibling)}}var oi=s(86);class ri extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new pn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(tn,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var li=s(122);function ci(e){return!re.IS_MOBILE_SAFARI||!e}class di extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new pn({caption:!0,noDelimiter:!0});Object(x._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=cs.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new li.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),oi.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(U.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new ri(this.slider).open()},d=e=>{Object(bt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),oi.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(hi,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(te.f)(r);oi.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ci(this.isFirst)&&this.codeInputField.input.focus()}}class hi extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new pn({caption:!0,noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new F.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new ri(this.slider).open()},h=()=>{const e=a.value.trim(),t=J.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=Object(te.f)(o);oi.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new di(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()})};Object(l.b)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new gt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(te.f)(r),oi.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{p(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ci(this.isFirst)&&this.inputField.input.focus()}}var pi=s(110),ui=s(103),mi=s(121);class gi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new pn({noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new F.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void lt(x.default.format("PasswordAsHintError",!0));const i=new hi(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class bi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new pn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new ui.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new mi.a(s,157),n=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(F.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new gi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class vi extends z{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new pn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new ui.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?J.b.wrapEmojiText(this.state.hint):void 0}),n=new pi.a(i,157),a=Object(U.a)("btn-primary btn-color-primary"),o=new x.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new bi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),oi.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=J.b.wrapEmojiText(this.state.hint):Object(k.a)(i.label,Object(x.i18n)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(te.f)(a),d=i.value;oi.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new fi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){ci(this.isFirst)&&this.passwordInputField.input.focus()}}class fi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new pn({caption:!0,noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(x._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(U.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(U.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new vi(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new gt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{oi.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(tn,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new hi(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(x._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new vi(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class yi extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new ni({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class wi extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new ni({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[ei.Nobody]})}}class Si extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new ni({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Li extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new ni({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[ei.Nobody]})}}class Ci extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new ni({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new ni({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ei extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new st({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(oe.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new pn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=t.findAndSplice(e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(U.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(bt.a)([e],!0);ht.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove(),this.privacyTab.updateActiveSessions()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new pn({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&<(x.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ht.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&(n.remove(),this.privacyTab.updateActiveSessions())},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ce([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(te.a)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,o),Object(te.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Ii extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new pn({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,e=>{new Pt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{P.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const t=qr.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=qr.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=P.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=P.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:P.a.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ce([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();P.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),Object(te.a)(this.scrollable.container,e=>{i=Object(ft.a)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,n),Object(te.d)(n))},this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()});let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,P.a.getBlocked(t.childElementCount,50).then(e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{o=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Mi=s(125);class Pi extends V{init(){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new pn({noDelimiter:!0});let t;const s=new st({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Ii(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new st({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new vi(this.slider):i.email_unconfirmed_pattern?(t=new di(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,oi.a.resendPasswordEmail()):t=new fi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new st({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ei(this.slider);e.privacyTab=this,e.authorizations=this.authorizations,e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(k.a)(s.subtitle,Object(x.i18n)("PrivacySettingsController.UserCount",[e])):Object(k.a)(s.subtitle,Object(x.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",()=>{l()});const l=()=>{P.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),oi.a.getState().then(e=>{i=e,Object(k.a)(n.subtitle,Object(x.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new pn({name:"PrivacyTitle"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new st({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new ai(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new st({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new yi(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new st({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new wi(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new st({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ci(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new st({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Si(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new st({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Li(this.slider).open()}}),c=e=>{const s=t[e];s&&ii.getPrivacy(e).then(e=>{const t=ii.getPrivacyRulesDetails(e),i=t.type===ei.Everybody?"PrivacySettingsController.Everbody":t.type===ei.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(x.i18n)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.default.addEventListener("privacy_update",e=>{c(Object(Y.c)(e.key._))})}const e=[];{const t=new pn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ht.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new st({checkboxField:new mt.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&ht.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new pn({name:"FilterChats"}),t=()=>{new gt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(bt.a)([s],!0);Mi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(U.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){ht.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(x._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function Ti(e,t,s,i=1){e/=255,t/=255,s/=255;const n=Math.max(e,t,s),a=Math.min(e,t,s);let o,r,l=(n+a)/2;if(n===a)o=r=0;else{let i=n-a;switch(r=l>.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function xi(e){const t=[];if(4===e.length)for(let s=1;s("0"+e.toString(16)).slice(-2)).join("")}function Ai(e){return Oi(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return ki(i[0],i[1],i[2],s)}(e))}function Fi(e){let{h:t,s:s,l:i}=Ti(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}class _i{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(_i.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new F.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new F.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=_i.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?F.a.Neutral:F.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?F.a.Neutral:F.a.Error),e&&this.setColor(Ti(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=xi(e);return Ti(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=Ti(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=ki(this.hue,this.saturation,this.lightness,this.alpha),t=Oi(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(F.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(F.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(I.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(I.a)(e-this.boxRect.left,0,i)/i*100,o=Object(I.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(I.a)(a,0,100),c=100-l/2,d=100-Object(I.a)(o,0,100),h=Object(I.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}_i.BASE_CLASS="color-picker";class Di extends z{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=xi(e),s=this.theme.background,i=Fi(t);s.color=e.toLowerCase(),s.type="color",s.highlightningColor=i,M.default.pushToState("settings",a.default.settings),fr.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=a.default.getTheme();const e=new pn({});this.colorPicker=new _i,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new pn({}),s=this.grid=document.createElement("div");s.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,t.append(i),s.append(t)}),Object(l.b)(s,e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container),this.applyColor=Object(gs.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s="color"===t.type?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background;"color"===e.type&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(e.color||"#cccccc"),"color"!==e.type&&(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let ji=0;class Bi extends z{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.onUploadClick=()=>{Object(me.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++ji,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=C.a.saveDoc(i);const n=he.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=he.a.upload(e,e.name),r=Object(ae.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{ht.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=he.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=C.a.saveDoc(a.document),c.dataset.docId=""+a.document.id,c.dataset.slug=a.slug,this.setBackgroundDocument(a.slug,a.document).then(r.resolve,r.reject)},r.reject)},r.reject),r.then(()=>{this.clicked.delete(a.document.id)},e=>{c.remove()});const l=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),c=this.addWallPaper(a,!1);this.clicked.add(a.document.id),l.attach(c,!1,r)})},this.onResetClick=()=>{const e=M.STATE_INIT.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(w.a)(e.background),M.default.pushToState("settings",a.default.settings),fr.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t)return;const{docId:s,slug:i}=t.dataset;if(this.clicked.has(s))return;this.clicked.add(s);const n=new ye.a({cancelable:!0,tryAgainOnFail:!1}),a=C.a.getDoc(s),o=()=>{const e=this.setBackgroundDocument(i,a);he.a.getCacheContext(a).url&&!this.theme.background.blur||n.attach(t,!0,e)};n.construct(),Object(l.b)(t,e=>{n.preloader.parentElement?(n.onClick(e),n.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{he.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=(e,t)=>{let s=++this.tempId;const i=()=>s===this.tempId,n=C.a.downloadDoc(t,fr.chat.bubbles?fr.chat.bubbles.lazyLoadQueue.queueId:0),o=Object(ae.a)();return o.addNotifyListener=n.addNotifyListener,o.cancel=n.cancel,n.then(()=>{if(!i())return void o.resolve();const s=this.theme.background,n=t=>{(e=>{const t=document.createElement("img");return new Promise(s=>{Object(rs.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;const n=e.getContext("2d");n.drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height);const a=new Array(4).fill(0),o=n.getImageData(0,0,e.width,e.height).data;for(let e=0;e{if(!i())return void o.resolve();const r=Fi(Array.from(n));s.slug=e,s.type="image",s.highlightningColor=r,M.default.pushToState("settings",a.default.settings),this.saveToCache(e,t),fr.applyCurrentTheme(e,t).then(o.resolve)})},r=he.a.getCacheContext(t);s.blur?setTimeout(()=>{Object(ps.a)(r.url,12,4).then(e=>{i()?n(e):o.resolve()})},200):n(r.url)}),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.theme.background,s="image"===t.type?this.grid.querySelector(`.grid-item[data-slug="${t.slug}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const e=un(this.scrollable),s=Object(U.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(U.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new Di(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new mt.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,M.default.pushToState("settings",a.default.settings);const e=t.querySelector(".active");e&&setTimeout(()=>{this.setBackgroundDocument(e.dataset.slug,C.a.getDoc(e.dataset.docId))},100)}),e.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),ht.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=un(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),Object(l.b)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}addWallPaper(e,t=!0){if(e.pFlags.pattern||!e.document||0===e.document.mime_type.indexOf("application/"))return;e.document=C.a.saveDoc(e.document);const s=document.createElement("div");s.classList.add("grid-item");const i=document.createElement("div");i.classList.add("grid-item-media");const n=Ss({photo:e.document,message:null,container:i,withoutPreloader:!0,size:r.a.choosePhotoSize(e.document,200,200)});return s.dataset.docId=""+e.document.id,s.dataset.slug=e.slug,"image"===this.theme.background.type&&this.theme.background.slug===e.slug&&s.classList.add("active"),(n.loadPromises.thumb||n.loadPromises.full).then(()=>{ls.a.mutate(()=>{s.append(i)})}),this.grid[t?"append":"prepend"](s),s}}class Ri extends ut.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;fr.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(x.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{E.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(te.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(U.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new T.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return cs.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return ct({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,E.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=J.a.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(U.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(x.i18n)("RemoveStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))):(t=Object(U.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(x.i18n)("AddStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(bt.a)([t],!0);cs.a.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new ee.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;Cs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var Ui,Hi=s(2);function Ni(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=Fe.a),function s(){e(),n=Hi.a.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,()=>1e3*(60-(new Date).getSeconds()),t)}var zi=!!(null===(Ui=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===Ui?void 0:Ui.getCurrentPosition)&&!1;class Vi{constructor(e,t,s,i,n){const a="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(a);const o=document.createElement("div");o.classList.add(a+"-details");const r=document.createElement("div");r.classList.add(a+"-name"),Object(x._i18n)(r,e);const l=document.createElement("div");l.classList.add(a+"-value"),l.innerHTML=""+s,o.append(r,l),this.range=new Se({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),l.innerText=""+e}}),this.container.append(o,this.range.container)}}class Ki extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=un.bind(null,this.scrollable);{const t=e("Settings"),s=new Vi("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{M.default.setByKey("settings.messagesTextSize",e)};const i=Object(U.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new Bi(this.slider).open()});const n=new mt.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new st({radioField:new ot({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new st({radioField:new ot({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(x._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[re.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}if(zi){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new st({radioField:new ot({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new st({radioField:new ot({langKey:"DistanceUnitsMiles",name:i,value:"miles",stateKey:n})});s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new st({radioField:new ot({langKey:t,name:i,value:e,stateKey:n})})),r=Ni(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("AutoDownloadMedia"),s=new mt.a({text:"AutodownloadContacts",name:"contacts",stateKey:"settings.autoDownload.contacts",withRipple:!0}),i=new mt.a({text:"AutodownloadPrivateChats",name:"private",stateKey:"settings.autoDownload.private",withRipple:!0}),n=new mt.a({text:"AutodownloadGroupChats",name:"groups",stateKey:"settings.autoDownload.groups",withRipple:!0}),a=new mt.a({text:"AutodownloadChannels",name:"channels",stateKey:"settings.autoDownload.channels",withRipple:!0});t.append(s.label,i.label,n.label,a.label)}{const t=e("General.AutoplayMedia"),s=new mt.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),i=new mt.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});t.append(s.label,i.label)}{const t=e("Emoji"),s=new mt.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new mt.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const t=e("Telegram.InstalledStickerPacksController"),s=new mt.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),i=new mt.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),n={},o=new ee.d,r=(e,s="append")=>{const i=new st({title:J.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Ri({id:e.id,access_hash:e.access_hash}).show()}});n[e.id]=i;const a=document.createElement("div");a.classList.add("row-media"),Es({set:e,container:a,group:"GENERAL-SETTINGS",lazyLoadQueue:o,width:48,height:48,autoplay:!0}),i.container.append(a),t[s](i.container)};cs.a.getAllStickers().then(e=>{Object(ms.a)(e);for(const t of e.sets)r(t)}),this.listenerSetter.add(a.default)("stickers_installed",e=>{const t=e;n[t.id]||r(t,"prepend")}),this.listenerSetter.add(a.default)("stickers_deleted",e=>{const t=e;n[t.id]&&(n[t.id].container.remove(),delete n[t.id])}),t.append(s.label,i.label)}}onOpen(){this.init&&(this.init(),this.init=null)}}var Gi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Wi extends z{init(){return Gi(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=un(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new F.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new F.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new F.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const i=document.createElement("div");i.classList.add("caption"),Object(x.i18n_)({element:i,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new et({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,s)}{const t=new pn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new pt({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=t.caption;i.append(Object(x.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(x.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),t.content.append(s),this.scrollable.append(t.container)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(P.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=P.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var qi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qi extends z{constructor(){super(...arguments),this.renderResults=e=>qi(this,void 0,void 0,(function*(){yield P.a.getContacts(),e.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=J.b.wrapEmojiText(s.title),i.push(e)}});Object(x.join)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=H("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.d)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.d)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new mt.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new pn({noDelimiter:!0,name:"FilterChatTypes"});let s;t.container.classList.add("folder-categories"),s="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const i=document.createDocumentFragment();for(const e in s){const t=Object(U.a)("btn-primary btn-transparent folder-category-button",{icon:s[e].ico,text:s[e].text});t.dataset.peerId=e,t.append(this.checkbox()),i.append(t)}t.content.append(i);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new It({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats"}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,i)=>{if(this.selector.selected.size>=100&&a&&!s[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void lt(x.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,s[e]?Object(x.i18n)(s[e].text):void 0,i);return s[e]&&n.querySelector("avatar-element").classList.add("tgico-"+s[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const i in e.pFlags)s.hasOwnProperty(i)&&e.pFlags[i]&&t.content.querySelector(`[data-peer-id="${i}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(w.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class $i extends z{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(x.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=H("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new gt("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=Ie({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new pn({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),t.content.append(s);const n=(e,t,s,i)=>{const n=new pn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=n("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=n("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");a.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"included",this)}),o.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?lt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):lt("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()});const r="edit"===this.type?[i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then(e=>(this.animation=e,le.a.waitForFirstFrame(e))),...r])}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=J.b.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],i=qr.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(x.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(w.b)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(w.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then(()=>{"edit"===this.type?this.onEditOpen():this.onCreateOpen()})}}var Yi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xi extends z{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(x.i18n)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(x.i18n)("Chats",[t])),s&&c.push(Object(x.i18n)("Channels",[s])),a&&c.push(Object(x.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(x.join)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new st({title:J.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(x.join)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new $i(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Os(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return Yi(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(x.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new pn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new pn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?lt("Sorry, you can't create more folders."):new $i(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.default)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.default)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.default)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;Os(s,s.parentElement,t+1)})}),this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then(e=>(this.animation=e,le.a.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return ht.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(U.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void lt("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class Ji extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new pn({name:e.name}),s=new st({checkboxField:new mt.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new st({checkboxField:new mt.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Dt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Dt.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Dt.a.isMuted(t)&&a===t.show_previews)return;const o=Object(w.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Dt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.default)("notify_settings",s=>{const i=Object(Y.c)(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new pn({name:"NotificationsOther"}),t=new st({checkboxField:new mt.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new st({checkboxField:new mt.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.default.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Dt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Dt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Zi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class en extends z{init(){return Zi(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new pn({}),t=new Map,s=ht.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(at.b)();s.forEach(e=>{const s=new st({radioField:new ot({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=it([...t.values()],e=>{x.default.getLangPack(e)});x.default.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}class tn extends z{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ie({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new gt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ht.a.logOut()},isDanger:!0}]}).show()}}]);this.header.append(e),this.avatarElem=new Or,this.avatarElem.setAttribute("clickable",""),this.avatarElem.classList.add("profile-avatar","avatar-120"),this.nameDiv=document.createElement("div"),this.nameDiv.classList.add("profile-name"),this.phoneDiv=document.createElement("div"),this.phoneDiv.classList.add("profile-subtitle");const t=document.createElement("div");t.classList.add("profile-buttons");const s="profile-button btn-primary btn-transparent";t.append(this.buttons.edit=Object(U.a)(s,{icon:"edit",text:"EditAccount.Title"})),t.append(this.buttons.folders=Object(U.a)(s,{icon:"folder",text:"AccountSettings.Filters"})),t.append(this.buttons.general=Object(U.a)(s,{icon:"settings",text:"Telegram.GeneralSettingsViewController"})),t.append(this.buttons.notifications=Object(U.a)(s,{icon:"unmute",text:"AccountSettings.Notifications"})),t.append(this.buttons.privacy=Object(U.a)(s,{icon:"lock",text:"AccountSettings.PrivacyAndSecurity"})),t.append(this.buttons.language=Object(U.a)(s,{icon:"language",text:"AccountSettings.Language"})),this.scrollable.append(this.avatarElem,this.nameDiv,this.phoneDiv,t),this.scrollable.container.classList.add("profile-content-wrapper"),this.buttons.edit.addEventListener("click",()=>{new Wi(this.slider).open()}),this.buttons.folders.addEventListener("click",()=>{new Xi(this.slider).open()}),this.buttons.general.addEventListener("click",()=>{new Ki(this.slider).open()}),this.buttons.notifications.addEventListener("click",()=>{new Ji(this.slider).open()}),this.buttons.privacy.addEventListener("click",()=>{new Pi(this.slider).open()}),this.buttons.language.addEventListener("click",()=>{new en(this.slider).open()}),le.a.loadLottieWorkers(),this.fillElements()}fillElements(){const e=P.a.getSelf(),t=e.id.toPeerId(!1);this.avatarElem.setAttribute("peer",""+t),this.nameDiv.append(new Lt.a({peerId:t}).element),this.phoneDiv.innerHTML=e.phone?P.a.formatUserPhone(e.phone):""}}class sn extends z{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new pn({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new F.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new F.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const s=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",s),this.channelDescriptionInputField.input.addEventListener("input",s),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,G.a.createChannel({title:e,about:t,broadcast:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),vn.removeTabFromHistory(this),new Bt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>G.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var nn=s(109);class an extends ut.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(x._i18n)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=P.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(ct({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new F.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new F.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new nn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.setAttribute("peer-title",e),c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=P.a.getSelf(),r=Object(Rs.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new et({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class on extends z{init(){this.container.id="contacts-container";const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new an},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.default)("contacts_update",e=>{const t=P.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(ks.a)()}createList(){const e=new _s,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),qr.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!re.IS_MOBILE&&ci(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",P.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=Ct.a.height/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(k.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class rn extends z{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!qr.sortedLists[rn.filterId]){const e=qr.createChatList();qr.generateScrollable(e,rn.filterId).container.append(e),qr.setListClickListener(e,null,!0)}const e=qr.scrollables[rn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=qr.filterId,qr.setFilterId(rn.filterId),qr.onTabChange()}onOpenAfterTimeout(){qr.sortedLists[this.wasFilterId].clear()}onClose(){qr.setFilterId(this.wasFilterId),qr.onTabChange()}onCloseAfterTimeout(){return qr.sortedLists[rn.filterId].clear(),super.onCloseAfterTimeout()}}function ln(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(ut.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new gt("popup-confirmation",e).show()})}rn.filterId=1;class cn extends z{constructor(){super(...arguments),this.isLocationWatched=!1}init(){this.container.classList.add("people-nearby-container"),this.setTitle("PeopleNearby"),this.errorCategory=document.createElement("div"),this.errorCategory.classList.add("text","hide","nearby-error"),this.retryBtn=Q({icon:"check"});const e=cs.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?Cs({doc:e,div:t,loop:!1,play:!0,width:86,height:86,emoji:"🧭",needUpscale:!0}).then(()=>{}):t.classList.add("media-sticker-wrapper");const s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PeopleNearbyInfo2"),this.locatedPeers=new Map;const i=()=>{const e=new _s({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onUpdate:e=>{const t=this.locatedPeers.get(e.id),s=[this.parseDistance(t.distance)];e.id.isUser()||s.push(n.default.getChatMembersString(e.id.toChatId())),e.dom.lastMessageSpan.textContent="",e.dom.lastMessageSpan.append(...Object(x.join)(s,!1))},getIndex:e=>2147483647-this.locatedPeers.get(e.id).distance});return qr.setListClickListener(e.list,void 0,void 0,!1),e},a=this.peopleSection=new gn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new gn({name:"ChatsNearbyHeader",sortedList:i()}),r=a.makeButton({text:"MakeMyselfVisible",icon:"location"}),c=a.makeButton({text:"StopShowingMe",icon:"location"}),d=o.makeButton({text:"NearbyCreateGroup",icon:"newgroup"});Object(l.b)(r,()=>{ln({titleLangKey:"MakeMyselfVisibleTitle",descriptionLangKey:"MakeMyselfVisibleInfo",button:{langKey:"OK"}}).then(()=>{this.startWatching()})},{listenerSetter:this.listenerSetter}),Object(l.b)(c,()=>{this.stopWatching()},{listenerSetter:this.listenerSetter}),Object(l.b)(d,()=>{new $(this.slider).open([],!0)},{listenerSetter:this.listenerSetter}),r.classList.add("primary"),c.classList.add("danger"),d.classList.add("primary"),this.content.append(this.retryBtn),this.scrollable.append(t,s,a.container,o.container,this.errorCategory)}parseDistance(e){return"miles"===a.default.settings.distanceUnit?e>1609.34?Object(x.i18n)("MilesAway",[Math.round(e/1609)]):Object(x.i18n)("FootsAway",[Math.round(3.281*e)]):e>=1e3?Object(x.i18n)("KMetersAway2",[e/1e3]):Object(x.i18n)("MetersAway2",[e])}open(){const e=super.open();return e.then(()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition(e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),P.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then(e=>{const t=e.updates[0].peers,s=t.sort((e,t)=>e.distance-t.distance),i=t.filter(e=>"peerChannel"==e.peer._).length,n=t.filter(e=>"peerChannel"!=e.peer._).length;null==s||s.forEach(e=>{const t=o.a.getPeerId(e.peer),s=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),s.sortedList.add(t)}),this.errorCategory.classList.toggle("hide",!(!n&&!i)),this.errorCategory.innerHTML="No groups or channels found around you."})},e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."})}),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,lt("Your position is now being shared. Do not close the page or it will be suspended."),P.a.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition(e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,s=e.coords.latitude!==this.latestLocationSaved.latitude,i=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(s||t)&&i&&(P.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})}))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,lt("The sharing of your position has been stopped. You will no longer be visible to other users."),P.a.getLocated(0,0,0,!1,0))}calculateDistance(e,t,s,i){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((s-e)*n)+Math.cos(e*n)*Math.cos(s*n)*(1-Math.cos((i-t)*n)/2)))}}var dn=s(7),hn=s(62);class pn{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add("sidebar-left-section-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add("sidebar-left-section"),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(mn()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const i=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(x.i18n_)({element:t,key:e.name,args:e.nameArgs}),i.append(t)}if(t.append(s),e.caption){const s=this.caption=this.generateContentElement();s.classList.add("sidebar-left-section-caption"),t.append(s),!0!==e.caption&&Object(x.i18n_)({element:s,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.innerContainer.append(e),e}}const un=(e,t,s)=>{const i=new pn({name:t,caption:s});return e.append(i.container),i.content},mn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class gn extends pn{constructor(e){super(e),this.sortedList=e.sortedList,this.content.append(this.sortedList.list)}makeButton(e){const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",e);return this.title?this.content.insertBefore(t,this.title.nextSibling):this.content.prepend(t),t}}const bn=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new on(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new rn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new mt.a({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",()=>{a.default.settings.theme=n.input.checked?"night":"day",M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("theme_change")}),a.default.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.default.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{fr.setPeer({peerId:fr.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},zi?{icon:"group",text:"PeopleNearby",onClick:()=>{new cn(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new tn(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new mt.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{fr.openUsername({userName:"TelegramTips"})}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout(()=>{e.remove()},0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([hn.a.set({kz_version:"Z"}),hn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>dn.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{hn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>dn.a.isMainDomain}].filter(Boolean);this.toolsBtn=Ie({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(te.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+dn.a.suffix+" alpha "+dn.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Ie({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new sn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Bt(this).open({type:"chat",skippable:!1,takeOut:e=>{new $(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Object(I.c)(t,1),this.archivedCount.classList.toggle("hide",!t)}}),P.a.getTopPeers("correspondents"),M.default.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{this.backBtn.click()};this.searchGroups={contacts:new O("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new O("GlobalSearch","contacts",void 0,void 0,void 0,void 0,s),messages:new O("SearchMessages","messages"),people:new O(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new O("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new Zs({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Me.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{p(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Lt.a({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(k.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(f.e)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{p(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),P.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(oe.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=Object(Me.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.default.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(f.e)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.default.pushToState("recentSearch",t);for(const e of t)M.default.requestPeer(e,"recentSearch")}})},{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u);new T.a(u);let m,g=!0;const b=Object(D.a)(e.parentElement,"zoom-fade",150,e=>{m&&clearTimeout(m),0!==e||g||(n.selectTab(0,!1),this.inputSearch.onClearClick(),m=window.setTimeout(()=>{m=0,this.newBtnMenu.classList.remove("is-hidden")},150)),g=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),re.IS_MOBILE_SAFARI||j.a.findItemByType("global-search")||j.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),j.a.removeByType("global-search"),b(0)});const y=H("close");this.searchGroups.recent.nameEl.append(y),y.addEventListener("click",()=>{ln({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then(()=>{M.default.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)M.default.releaseSinglePeer(e,"recentSearch");t.length=0,M.default.pushToState("recentSearch",t)})})})}};de.a.appSidebarLeft=bn;var vn=bn;class fn{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice(t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(f.e)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class yn extends ut.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new F.b({plainText:!0}),this.minutesInputField=new F.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new x.default.IntlDateElement({date:n,options:i}).element)}t.push(new x.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(x.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new x.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new x.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new x.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter(e=>e.boundingClientRect.top<0).sort((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}a.default.addEventListener("replies_updated",e=>{const t=e;Array.from(document.querySelectorAll(`replies-element[data-post-key="${t.peerId}_${t.mid}"]`)).forEach(e=>{e.message=t,e.render()})});class Sn extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t,s;if(this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),t||(t=document.createElement("div"),t.classList.add("replies-footer-avatars")),e.recent_repliers.slice().reverse().forEach((e,s)=>{let i=t.children[s];i||(i=new Or,i.setAttribute("dialog","0"),i.classList.add("avatar-30"),i.lazyLoadQueue=this.lazyLoadQueue,this.loadPromises&&(i.loadPromises=this.loadPromises)),i.setAttribute("peer",""+o.a.getPeerId(e)),i.parentNode||t.append(i)}),Array.from(t.children).slice(e.recent_repliers.length).forEach(e=>e.remove())):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.append(t),s=e?e.replies?Object(x.i18n)("Comments",[e.replies]):Object(x.i18n)("LeaveAComment"):Object(x.i18n)("ViewInChat"),e){const t=i.a.getHistoryStorage(e.channel_id.toPeerId(!0));let s=!1;e.replies&&(s=void 0!==e.read_max_id&&void 0!==e.max_id?e.read_max_id${(null==e?void 0:e.replies)?Object(I.c)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",Sn);const Ln=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(x._i18n)(e,"EditedMessage"),e},Cn=()=>Object(x.i18n)("SponsoredMessage");var En,In;(In=En||(En={})).setTime=(e,t,s,i,n)=>{var a;const o=new Date(1e3*t.date),r=[];let l,c;const d=!!t.pFlags.sponsored,h=!("action"in t)&&!d;let p=d?void 0:Object(oe.f)(o);if(h){if(t.views){const e=t.post_author||(null===(a=t.fwd_from)||void 0===a?void 0:a.post_author);s.classList.add("channel-post");const i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=Object(I.c)(t.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),r.push(i,n),e){const t=document.createElement("span");t.innerHTML=J.b.wrapEmojiText(e)+", ",r.push(t)}}if(t.edit_date&&"scheduled"!==e.type&&!t.pFlags.edit_hide&&(s.classList.add("is-edited"),r.unshift(l=Ln())),"pinned"!==e.type&&t.pFlags.pinned){s.classList.add("is-pinned");const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),r.unshift(e)}}else d&&r.push(c=Cn());p&&r.push(p);let u=d?void 0:Object(oe.g)(o);h&&(u+=(t.edit_date?"\nEdited: "+Object(oe.g)(new Date(1e3*t.edit_date)):"")+(t.fwd_from?"\nOriginal: "+Object(oe.g)(new Date(1e3*t.fwd_from.date)):""));const m=document.createElement("span");m.classList.add("time","tgico"),u&&(m.title=u),m.append(...r);const g=document.createElement("div");g.classList.add("inner","tgico"),u&&(g.title=u);let b=r;return l&&(b[b.indexOf(l)]=Ln()),c&&(b[b.indexOf(c)]=Cn()),b=b.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")?e.cloneNode(!0):e),p&&(b[b.length-1]=Object(oe.f)(o)),g.append(...b),m.append(g),n.append(m),m},In.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new Sn;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},In.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(x.i18n)("Loading")):r=new Lt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Is(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var Mn=s(135);function Pn(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function Tn(e){e.style.display="none",e.offsetLeft,e.style.display=""}de.a.getElementByPoint=Pn;var kn=s(81),xn=s(95),On=s(123),An=s(87);const Fn={keywords:{},version:0,langCode:dn.a.langPackCode};class _n{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=dn.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=An.a.get(s).then(t=>(Object(xn.b)(t)||(t={}),Object(w.k)(Fn,t),t.langCode=e,this.keywordLangPacks[e]=t,ht.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return x.default.lastRequestedLangCode!==dn.a.langPackCode&&e.push(this.getEmojiKeywords(x.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new On.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(_n.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.default.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=J.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(f.e)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)})}}_n.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const Dn=new _n;de.a&&(de.a.appEmojiManager=Dn);var jn=Dn,Bn=s(143),Rn=s(10);const Un=new Set;function Hn(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!Rn.a?o=J.a.wrapSingleEmoji(e):(e=J.a.fixEmoji(e),o=J.a.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!Rn.a){const e=n.firstElementChild,t=e.src;if(!Un.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(De.b)(()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),Un.add(t)})},{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function Nn(e){return Object(Me.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class zn{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=Nn(e.target);t&&(fr.chat.input.onEmojiSelected(t,!1),ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in Bn.a.Emoji){const i=""+Bn.a.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(x.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{Hn(Object(ie.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new T.b(this.content,"EMOJI"),o=Object(te.f)(this.content,!0);Promise.all([Object(kn.a)(200),jn.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=oa.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)Hn(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Vn=s(130),Kn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gn{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ae.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Kn(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(De.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();E.a.getAnimations(t).forEach(e=>{E.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new ee.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=C.a.getDoc(t);return this.scrollPromise.then(()=>{const t=ys({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();E.a.getAnimations(t).forEach(e=>{E.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Vn.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=C.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(rs.a)(c,l.cacheContext.url,d):d()}}class Wn{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",oa.onMediaClick);const t=new T.b(this.content,"GIFS"),s=new Gn(e,aa,t),i=Object(te.f)(this.content,!0);ht.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=C.a.saveDoc(t),s.add(t)}),i.remove()}),la.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var qn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qn{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{E.a.getAnimations(e).forEach(e=>{t?E.a.checkAnimation(e,!1):E.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t),i=b.b.active.esgSticker.width,n=Cs({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new ee.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),2===e.sticker&&this.observeAnimatedDiv(t)),Cs({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:2===e.sticker,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class $n{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return qn(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=cs.a.getStickerSet(e);this.categoryPush(s,J.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Es({set:e,container:i,group:aa,lazyLoadQueue:oa.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new T.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.default.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Me.a)(t,"category-title")){const e=Object(St.a)(t,"data-id");new Ri({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else oa.onMediaClick(e)});const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new T.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},la.addEventListener("closed",()=>{s(!0)}),la.addEventListener("opened",()=>{s()}),this.stickyIntersector=oa.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(te.f)(this.content,!0);Promise.all([cs.a.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(x.i18n)("Stickers.Recent"))}),cs.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new Qn(oa.lazyLoadQueue,aa),la.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(cs.a.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Yn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Xn=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ht.a.invokeApi("messages.getInlineBotResults",{bot:P.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=C.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){P.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(f.f)(t,n,"rating"),M.default.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Yn(this,void 0,void 0,(function*(){const t=P.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),Mi.a.setDraft(e,t,"@"+P.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ht.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&<(J.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?C.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};de.a&&(de.a.appInlineBotsManager=Xn);var Jn=Xn,Zn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ea extends z{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Me.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;fr.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&Yt.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Gn(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",E.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Yt.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return Zn(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield P.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=Jn.getInlineResults(Be.c,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class ta extends z{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ee.d,this.inputSearch=new _("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void fr.chat.input.sendMessageWithDocument(e)}const s=Object(Me.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Me.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{cs.a.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(x.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{new Ri(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",E.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${J.a.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(x.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(x.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return cs.a.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.d)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),E.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?cs.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var sa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ia extends B.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(Ws.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>sa(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},ue.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},ue.IS_TOUCH_SUPPORTED?0:200)})),Object(w.g)(this,e)}attachButtonListener(e,t){let s=!0;ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){ue.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var na=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const aa="emoticons-dropdown";class oa extends ia{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(E.a.checkAnimations(!0,aa),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=fr.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(xs.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>na(this,void 0,void 0,(function*(){ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)()&&(yield Object(kn.a)(100)),this.element.parentElement!==fr.chat.input.chatInput&&fr.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),oa.lazyLoadQueue.lock(),E.a.lockIntersectionGroup(aa)}))),this.addEventListener("opened",()=>{E.a.unlockIntersectionGroup(aa),oa.lazyLoadQueue.unlock(),oa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{oa.lazyLoadQueue.lock(),E.a.lockIntersectionGroup(aa),E.a.checkAnimations(!0,aa)}),this.addEventListener("closed",()=>{E.a.unlockIntersectionGroup(aa),oa.lazyLoadQueue.unlock(),oa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new zn,this.stickersTab=new $n,this.gifsTab=new Wn,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(Z.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),E.a.checkAnimations(!1,aa)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?Yt.isTabExists(ta)||new ta(Yt).open():Yt.isTabExists(ea)||new ea(Yt).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=fr.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});fr.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=re.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===fr.chat.input.messageInput)return e.getRangeAt(0)}}oa.lazyLoadQueue=new ee.d,oa.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new wn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(xs.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Me.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(xs.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},oa.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(ft.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(fr.chat.input.sendMessageWithDocument(i,void 0,t)?(ra.container&&(ra.forceClose=!0,ra.container.classList.add("disable-hover"),ra.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const ra=new oa;de.a.emoticonsDropdown=ra;var la=ra;var ca=s(168);var da=!("undefined"==typeof RTCPeerConnection||re.IS_FIREFOX);var ha,pa=da&&!1;function ua(e,t,s){const i=e.getBoundingClientRect(),n=t.getBoundingClientRect();let{top:a,bottom:o}=n;if(s){const e=t.querySelector(".sticky");if(e){a=e.getBoundingClientRect().bottom}}if(i.top>=o||i.bottom<=a||i.right<=n.left||i.left>=n.right)return null;const r={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},l="visualViewport"in window?window.visualViewport:window,c=(l.width||l.innerWidth,l.height||l.innerHeight);return{rect:{top:i.topo&&o!==c?(r.bottom=!0,++r.vertical,o):i.bottom,left:0},overflow:r}}window.getVisibleRect=ua;class ma extends ut.b{constructor(e,t){super("popup-join-chat-invite",Object(ut.a)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{ht.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{ti.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})},e=>{"INVITE_REQUEST_SENT"===e.type&&ct({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new Or;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),Ss({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Be.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=J.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(x.i18n)(n?"Subscribers":"Members",[Object(I.d)(t.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,i,o),t.pFlags.request_needed){const e=document.createElement("div");Object(x._i18n)(e,n?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT"}(ha||(ha={}));var ga=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ba=new Set(["messageActionHistoryClear","messageActionChatCreate"]),va=new Set;pa&&va.add("messageActionPhoneCall");let fa=void 0,ya=0;class wa{constructor(e,t,s,i,n,o,r,l,d,h,p){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=l,this.appDraftsManager=d,this.appMessagesIdsManager=h,this.appChatsManager=p,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=Object(ks.a)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Me.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Me.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new yn(new Date(+e),this.onDatePick).show();break}}return}if(!ue.IS_TOUCH_SUPPORTED&&Object(Me.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),ue.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Me.a)(s,"grouped-item")||i)}const n=Object(Me.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Me.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Me.a)(s,"spoiler");if(o){const t=Object(Me.a)(o,"message"),s="is-spoiler-visible",i=t.classList.contains(s);i||Object(c.a)(e);const n=200,a=5e3,r=i?0:2;r&&t.classList.add("will-change");const l=t.dataset.spoilerTimeout;return null!==l&&(clearTimeout(+l),delete t.dataset.spoilerTimeout),void Object(Jt.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(Jt.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}if(Object(Me.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Be.d){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})})}return}const r=Object(Me.a)(s,"is-via");if(r){const t=r.querySelector(".peer-title");if(s===t||Object(Ws.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const l=Object(Me.a)(s,"peer-title")||Object(ft.a)(s,"AVATAR-ELEMENT")||Object(St.a)(s,"data-saved-from");if(l&&l!==i){s=l||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+s})}else{const t=e.toPeerId();t!==Be.c?this.chat.appImManager.setInnerPeer({peerId:t}):lt(x.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new Ri(s.stickerSetInput).show())}const d=Object(Me.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||d&&!d.querySelector(".preloader-container")){const t=+(Object(Me.a)(s,"album-item")||Object(Me.a)(s,"document-container")||i).dataset.mid,n=this.chat.getMessage(t);if(!n)return void this.log.warn("no message by messageId:",t);const a="webpage",o=i.classList.contains(a),r=d?e=>Lr.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),l=[],h=o?[t]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&r(s)}).sort((e,t)=>e-t);h.forEach(e=>{let t;if(d)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(d)s.forEach(e=>{l.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Me.a)(s,"media-container-aspecter"))return;let n=Object(Me.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),l.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),l.sort((e,t)=>e.mid-t.mid);let p=l.findIndex(e=>e.mid===t);return de.b&&this.log("open mediaViewer single with ids:",h,p,l),l[p]?((new Lr).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:d?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!o,isScheduled:"scheduled"===this.chat.type}).openMedia(n,l[p].element,0,!0,l.slice(0,p),l.slice(p+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(ft.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+s})}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Hs({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Me.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:s,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}},this.onScroll=()=>{if(this.isHeavyAnimationInProgress&&this.scrolledDown)return;const e=this.scrollable.getDistanceToEnd();!ue.IS_TOUCH_SUPPORTED&&0!==this.scrollable.lastScrollDirection&&e>0&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350)),e<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection),this.setStickyDateManually()},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new fn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new ee.d,this.lazyLoadQueue.queueId=++ya,this.listenerSetter.add(a.default)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Ze.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToEnd()}}),this.listenerSetter.add(a.default)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.default)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==d)return;const m=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(m){const e=this.chat.getMessage(u),a=m.bubble;if(e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Me.a)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(ws({message:e})),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof Ne||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(Ts.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const g=this.bubbles;if(g[h]){const e=g[h];g[u]=e,delete g[h],Object(De.b)(()=>{e.classList.contains("is-sending")&&(e.classList.remove("is-sending"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))}),e.dataset.mid=""+u}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])}}),this.listenerSetter.add(a.default)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type,o=this.scrolledDown;this.safeRenderMessage(n.message,!0,!1,n.bubble,a),o&&this.scrollToBubbleIfLast(n.bubble),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),this.listenerSetter.add(a.default)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(w.e)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.default)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(Ts.c)().then(()=>{s()&&t.forEach(t=>{Object(f.d)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,En.setReply({chat:this.chat,bubble:n,message:a})}})})})}),this.listenerSetter.add(this.bubblesContainer)("click",this.onBubblesClick),ue.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;js({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Me.a)(t.target,"bubble"),i&&(Object(Jt.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(te.b)()},onReset:()=>{const t=i;Object(Jt.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(De.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let u;de.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Me.a)(e.target,"grouped-item")||Object(Me.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),re.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.chat.canSend())return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),Object(Ts.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),u=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,u&&u()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),u=null},this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",({storage:e,mid:t})=>{e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId())}),this.listenerSetter.add(a.default)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.default)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.chat.canSend()&&(this.finishPeerChange(),this.chat.input.finishPeerChange())}}),this.listenerSetter.add(a.default)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(w.e)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.default)("message_views",({peerId:e,views:t,mid:s})=>{this.peerId===e&&Object(De.b)(()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Object(I.c)(t,1);let s=!1;i.forEach(t=>{(s||t.innerHTML!==e)&&(s=!0,t.innerHTML=e)})}})}),this.unreadedObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}})}),this.viewsObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.viewsObserver.unobserve(e.target),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.chat.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId()),random_id:e.random_id}))}}})}),this.sendViewCountersDebounced=dt(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})};new ResizeObserver(a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let c=l+n;const d=c%1;if(c-=d,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.scrollTop=e}r(!1),n=d,e=o}).observe(this.bubblesContainer)}}setStickyDateManually(){const e=Object.keys(this.dateMessages).map(e=>+e).sort((e,t)=>t-e);let t;const{scrollTop:s}=this.scrollable.container;if(s>0)for(const s of e){const e=this.dateMessages[s],i=ua(e.container,this.scrollable.container);if(i&&i.overflow.top)t=e.div;else if(t)break}if(t!==this.previousStickyDate){if(t){const e=!this.previousStickyDate;e&&t.classList.add("no-transition"),t.classList.add("is-sticky"),e&&(t.offsetLeft,t.classList.remove("no-transition"))}this.previousStickyDate&&this.previousStickyDate!==t&&this.previousStickyDate.classList.remove("is-sticky"),this.previousStickyDate=t}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),de.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.d)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=Ct.a.height/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=Pn(this.scrollable.container,e,"center");return t&&(t=Object(Me.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}return null}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(w.e)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t);if(s.length)if(e)de.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);de.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new T.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),ue.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")},{passive:!0}),this.scrollable.container.addEventListener("touchend",()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350))},{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-sending"))continue;t.classList.remove("is-sent","is-sending"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){let s=!1;e.forEach(e=>{if(!(e in this.bubbles))return;s=!0;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),s&&(t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),E.a.checkAnimations(!1,gr),this.deleteEmptyDateGroups(),this.onScroll())}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const s=this.getMiddleware();t.then(()=>{s()&&this.renderNewMessagesByIds(e)})}return}this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();n&&a.then(()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)})})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Me.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(xs.a)(n)===(this.stickyIntersector?2:1)){a=n.parentElement}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:s,forceDuration:i,axis:"y",getNormalSize:o?({rect:e})=>{let t=Ct.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||Ct.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a})}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return ga(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){return ga(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout(()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]},2e3)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=Object(x.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&2147483646===e.date)t=Object(x.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new x.default.IntlDateElement({date:s,options:e}).element,a&&(t=Object(x.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const c=document.createElement("section");c.className="bubbles-date-group",c.append(o),this.dateMessages[i]={div:o,container:c,firstTimestamp:s.getTime()};const d=Object(w.e)(this.dateMessages,"asc");let h,p=0,u=d.length;for(;p+e)))}else this.isFirstLoad=!0;const m=this.chatInner;this.cleanup();const g=this.chatInner=document.createElement("div");let b;n?(g.className=m.className,g.classList.remove("disable-hover","is-scrolling")):g.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),b=l?{promise:Object(Ts.c)().then(()=>this.performHistoryResult(l.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,d,p);const{promise:v,cached:f}=b;f||n||(h.container.textContent="",this.chat.finishPeerChange(r,d,t,s),this.preloader.attach(this.bubblesContainer)),E.a.lockGroup(gr);const y=v.then(()=>{if(f?n||this.chat.finishPeerChange(r,d,t,s):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),h.lastScrollDirection=0,h.lastScrollTop=0,Object(k.a)(h.container,g),E.a.unlockGroup(gr),E.a.checkAnimations(!1,gr),this.lazyLoadQueue.unlock(),l)h.scrollTop=l.top;else if(o&&d||r){const e=u>0&&(u{h.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!d);const m=this.appMessagesManager.isFetchIntervalNeeded(e);if(l||m?p.then(()=>{if(i()&&(h.checkForTriggers(),m)){const t=()=>{this.fetchNewPromise=new Promise(s=>{i()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!i()||!e)return void s();const n=e.history.slice.isEnd(Mn.a.Bottom);h.loadedAll.bottom&&h.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),s()}):s()}).finally(()=>{this.fetchNewPromise=void 0})};n?setTimeout(t,3e4):t()}}):t&&!this.bubbles[o]&&t!==o||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",h.loadedAll.bottom),h.loadedAll.bottom&&o&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===a){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e});return{cached:f,promise:y}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.appPeersManager.isChannel(this.peerId),t=this.chat.canSend();this.chatInner.classList.toggle("has-rights",t),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",e)}renderMessagesQueue(e,t,s,i){return this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){return this.messagesQueuePromise||!this.messagesQueue.length?Promise.resolve():this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>(e.push(...t),e),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)})}setBubblePosition(e,t,s){if(t.pFlags.local)return void this.chatInner[t.pFlags.sponsored?"append":"prepend"](e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),S=i.lastElementChild,S.classList.contains("bubble-content-wrapper")||(S=i.querySelector(".bubble-content-wrapper")),w=S.firstElementChild,w.innerHTML="",w.style.cssText="",S.innerHTML="",S.appendChild(w);const a=S.style.transitionDelay;S.style.cssText="",S.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(S=document.createElement("div"),S.classList.add("bubble-content-wrapper"),w=document.createElement("div"),w.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),S.appendChild(w),i.appendChild(S),!f&&!e.pFlags.out&&this.unreadedObserver){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=C.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&E.length===e.length){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(C);if(1===e.length&&!I&&t)I={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=M,i.classList.add("emoji-"+e.length+"x"),w.append(t)}i.classList.add("is-message-empty","emoji-big"),T=!0,P=!1,k=!1}i.classList.add("can-have-big-emoji")}}k&&g(y,M);const O=En.setTime(this.chat,e,i,w,y);if(w.prepend(y),p&&e.views){if(!(null===(h=e.fwd_from)||void 0===h?void 0:h.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),w.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i)}const A=p&&e.reply_markup;if(A&&"replyInlineMarkup"===A._&&A.rows&&A.rows.length){const t=A.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=J.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=J.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(zs.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Hs({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),Object(se.ripple)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Me.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(xs.a)(i),a=t[Object(xs.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),P=!1,i.classList.add("with-reply-markup"),S.append(s)}const F=e.pFlags.is_outgoing;if(f){(e.pFlags.unread||F)&&this.unreadOut.add(e.mid);let t="";t=F?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}const _=p&&this.appMessagesManager.getMessageWithReplies(e),D=!!_&&e.mid>0;D&&i.classList.add("with-replies");const j=p&&e.fwd_from,B=p&&e.fwdFromId,R=f&&(!j||this.peerId!==a.default.myId);let U=w;if(I){let t=document.createElement("div");t.classList.add("attachment"),C||i.classList.add("is-message-empty");let s=!1;switch(I._){case"messageMediaPhoto":{const s=I.photo;C||(P=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==n.size&&m){i.classList.add("is-album","is-grouped"),Ps({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});break}const a=!re.IS_ANDROID&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),Ss({photo:s,message:e,container:t,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});break}case"messageMediaWebPage":{s=!0;let t=I.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),ys({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:R,group:gr,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia})}else{const t=ws({message:e,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,loadPromises:L});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=J.b.wrapRichText(t.url),s=Object(zs.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");g(i,J.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");g(s,t.rTitle),e.append(s),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),g(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),Ss({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,withoutPreloader:s,noAutoDownload:this.chat.noAutoDownloadMedia})}n.append(r),y.insertBefore(n,O);break}case"messageMediaDocument":{const n=I.document;if(n.sticker){i.classList.add("sticker"),P=!1,T=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),w.style.height=t.style.height,w.style.width=t.style.width,Cs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:gr,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?C:void 0,withThumb:!0,loadPromises:L})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(T=!0),!s&&C||(P=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==a.size&&m)i.classList.add("is-album","is-grouped"),Ps({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});else{const a=!re.IS_ANDROID&&!re.IS_APPLE&&!s&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),ys({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:gr,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l,useSearch:c}){let d;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach((e,t)=>{const s=n.getMessage(e),c=ws({message:s,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l}),p=document.createElement("div");p.classList.add("document-container"),p.dataset.mid=""+e,p.dataset.peerId=""+s.peerId;const u=document.createElement("div");if(u.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=J.b.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,u.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),p.append(e),p.classList.add("grouped-item"),0===t&&(d=u)}u.append(c),p.append(u),i.append(p)}),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),d}({albumMustBeRenderedFull:m,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0});t&&(U=t);const a=y.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(O.cloneNode(!0)),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaCall":{const e=I.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";t.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),Object(x._i18n)(a,R?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append(Object(ca.a)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),Object(x._i18n)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),s=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(t);break}case"messageMediaContact":{const e=I,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,s=!0;const n=[];e.first_name&&n.push(J.b.wrapEmojiText(e.first_name)),e.last_name&&n.push(J.b.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+Object(Rs.a)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new Or;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.user_id.toPeerId()),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new as;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);y.prepend(t),y.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),y.append(Object(x.i18n)(x.UNSUPPORTED_LANG_PACK_KEY),O),this.log.warn("unrecognized media type:",I._,e)}s||w.append(t)}T&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let H="";const N=e.fromId!==a.default.myId&&this.appPeersManager.isAnyChat(v)&&!this.appPeersManager.isBroadcast(v)||e.viaBotId||e.pFlags.sponsored;if(N||j||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===B;let o,r=j&&!j.from_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=J.b.wrapEmojiText(j.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Lt.a({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&p&&En.setReply({chat:this.chat,bubble:i,bubbleContainer:w,message:e}),B||j)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(H=e.savedFrom,t.dataset.savedFrom=H),o=document.createElement("div"),t.dataset.peerId=""+B,this.peerId!==a.default.myId&&this.peerId!==Be.d&&!n||T){const e=[t];T&&e.unshift(document.createElement("br")),o.append(Object(x.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(B,!1),o.append(t);else e.viaBotId||(!T&&N?(o=document.createElement("div"),o.append(t),f||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=""+e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(x.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),U.append(o));if(this.chat.isAnyGroup()&&!R){let t=new Or;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=L,!B&&j&&j.from_name&&t.setAttribute("peer-title",j.from_name),t.setAttribute("peer",""+((j&&(this.peerId===a.default.myId||this.peerId===Be.d)||n?B:e.fromId)||Be.c)),S.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(H=`${this.chat.peerId}_${e.mid}`);if(_&&_.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),H&&("pinned"===this.chat.type||j.saved_from_msg_id)&&this.peerId!==Be.d){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),w.append(e),i.dataset.savedFrom=H,i.classList.add("with-beside-button")}if(i.classList.add(R?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,L),D){En.renderReplies({bubble:i,bubbleContainer:w,message:_,messageDiv:y,loadPromises:L,lazyLoadQueue:this.lazyLoadQueue})&&(P=!0)}return P&&(i.classList.add("can-have-tail"),w.append(Sa())),i}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return ga(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{const{scrollTop:e,scrollHeight:i}=this.scrollable;s=t?i-e:e,this.messagesQueueOnRender=void 0},this.needReflowScroll&&(Tn(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s="number"==typeof e?this.chat.getMessage(e):e;s.pFlags.local?this.processLocalMessageRender(s):this.safeRenderMessage(s,t,!0)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(Mn.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(Mn.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);if(yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),void 0!==s){const e=t?this.scrollable.scrollHeight-s:s;this.scrollable.scrollTop=e,this.scrollable.lastScrollTop=e,this.scrollable.lastScrollDirection=0,re.IS_SAFARI&&Tn(this.scrollable.container)}return!0}))}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return ga(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(w.e)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();de.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=Object(ae.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},m=u(r,p),g=u(l),b=u(c,p),v=[m.animationPromise,g.animationPromise,b.animationPromise],f=[m.lastMsDelay,g.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(De.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Ts.b)(y,Math.max(...f)+200).then(()=>{Object(De.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")}),re.IS_SAFARI||(this.needReflowScroll=!0)})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(x.i18n)("GroupEmptyTitle1"):"saved"===e?a=Object(x.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(x.i18n)("NoMessages"):"noScheduledMessages"===e&&(a=Object(x.i18n)("NoScheduledMessages")),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(x.i18n)("GroupEmptyTitle2")),o=[Object(x.i18n)("GroupDescription1"),Object(x.i18n)("GroupDescription2"),Object(x.i18n)("GroupDescription3"),Object(x.i18n)("GroupDescription4")];else if("saved"===e)o=[Object(x.i18n)("ChatYourSelfDescription1"),Object(x.i18n)("ChatYourSelfDescription2"),Object(x.i18n)("ChatYourSelfDescription3"),Object(x.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(x.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice(e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return Cs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:gr,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),oa.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=!!e.pFlags.sponsored,s=this.safeRenderMessage(e,void 0,void 0,void 0,t);s.classList.add("is-group-last","is-group-first"),t||(s.classList.add("bubble-first"),s.classList.remove("can-have-tail","is-in"));const i=[],n=this.appPeersManager.isBot(this.peerId);if(t){let t,i,n,o;s.classList.add("avoid-selection");const r=this.sponsoredMessage=e.sponsoredMessage,c=this.appPeersManager.getPeerId(r.from_id);r.channel_post?(t="OpenChannelPost",i=this.appMessagesIdsManager.generateMessageId(r.channel_post)):r.start_param?(t="Chat.Message.ViewBot",n=r.start_param):t=this.appPeersManager.isAnyGroup(c)?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new ma(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:ha.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{a.default.dispatchEvent("history_focus",{peerId:c,mid:i,startParam:n})};const d=Object(U.a)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.viewsObserver.observe(d),o&&Object(l.b)(d,o),void s.querySelector(".bubble-content").prepend(d)}if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(x.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",s,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",s,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",s,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.chat.canSend()&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",s,e,i):this.renderEmptyPlaceholder("noMessages",s,e,i);if(i.length){s.querySelector(".message, .service-msg").prepend(...i)}const o=t?"append":"prepend";this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner[o](s),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(De.d)()}:this.chatInner[o](s),this.emptyPlaceholderMid=e.mid}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const s=-Math.abs(t);return{id:s,mid:-Math.abs(this.appMessagesIdsManager.generateMessageId(s))}}generateLocalFirstMessage(e,t,s=0){const{id:i,mid:n}=this.generateLocalMessageId(s),a={_:e?"messageService":"message",date:0,id:i,mid:n,peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),Object(ms.a)(a),t&&t(a),this.appMessagesManager.saveMessages([a],{storage:new Map}),a.mid=n,a}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"bottom"===e&&this.appPeersManager.isBroadcast(this.peerId)){const{mid:e}=this.generateLocalMessageId(1);if(t){const t=this.getMiddleware(()=>this.scrollable.loadedAll.bottom&&!this.bubbles[e]&&this.getSponsoredMessagePromise===s),s=this.getSponsoredMessagePromise=this.chat.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId())},{cacheSeconds:300}).then(e=>{if(!t())return;this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const s=e.messages.shift();if(!s)return;e.messages.push(s);const i=this.generateLocalFirstMessage(!1,e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s},1);return Promise.all([this.getHistoryTopPromise,this.messagesQueuePromise]).then(()=>{if(!t())return;this.performHistoryResult([i],!1,!0)})}).finally(()=>{this.getSponsoredMessagePromise=void 0})}else this.deleteMessagesByIds([e]),this.getSponsoredMessagePromise=void 0}if("top"===e&&t&&this.appPeersManager.isBot(this.peerId)){this.log("inject bot description");const e=this.getMiddleware();return this.appProfileManager.getProfile(this.peerId.toUserId()).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=Math.min(30,Ct.a.height/38|0),l=Object.keys(this.bubbles).length>0?Math.max(40,r):r;let c=l;if(void 0!==fa){if(!fa)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--fa}let d,h=0;if(s&&(h=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)d=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(d[e]).grouped_id)break;d.splice(e,1)}e=d[d.length-1]||e}}let p,u=this.requestHistory(e,c,h);const m=(null==d?void 0:d.length)&&u instanceof Promise,g=this.isFirstLoad&&h&&u instanceof Promise||m;m&&(p=u,u={history:d}),this.isFirstLoad=!1;const b=e=>ga(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(Mn.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),v=e=>Object(Ts.c)().then(()=>b(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!m&&i)),f=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):v(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let y,S;if(u instanceof Promise)S=!1,y=f(u);else{if(n)return null;S=!0,y=v(u)}const L=m?f(p):y;if(g&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;this.animateAsLadder(i,d,m,h,e).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=L:this.getHistoryBottomPromise=L,L.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(!g&&y.then(()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=Object(w.e)(this.bubbles));const s=2*l;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))}),y.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:S,promise:y})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;let t=!1;for(const s in this.dateMessages){const i=this.dateMessages[s];i.container.childElementCount===e&&(i.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(i.container,i.div),delete this.dateMessages[s],t=!0)}t&&(this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Sa(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class La{constructor(e,t,s,n){var r;let l,c,d,h=[],p=[];const u=o.a.canPinMessage(e),m=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?u?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:m})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>m(0,!1,!e.size)}),G.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:m}):(h.push({langKey:t,callback:e=>m(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new Lt.a({peerId:e}).element],checked:!0})))}Object(ut.a)(h);new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function Ca(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class Ea extends gt{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&ct({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Cs({doc:cs.a.getAnimatedEmojiSticker(Ea.STICKER_EMOJI),div:a,emoji:Ea.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new F.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}Ea.STICKER_EMOJI="👮‍♀️";class Ia extends gt{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach(e=>{const t=Object(U.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=cs.a.preloadAnimatedEmojiSticker(Ea.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Me.a)(a.target,"btn-primary"),r=i[Object(xs.a)(o)][1];n.then(()=>{this.hide(),new Ea(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class Ma extends gt{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[Object(x.i18n)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(x.default.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new T.b(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}class Pa{constructor(e,t,s,i,n,a,o){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new Vs(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(Ca()){nt((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{nt(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),lt(x.default.format(i,!0)),nt(n)},this.onPinClick=()=>{new La(this.peerId,this.mid)},this.onUnpinClick=()=>{new La(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Hs({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Me.a)(this.target,"grouped-item")||Object(Me.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new Ns(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)};const r=e=>{let s,i;this.init&&(this.init(),this.init=null);try{i=Object(Me.a)(e.target,"bubble-content-wrapper"),s=i?i.parentElement:Object(Me.a)(e.target,"bubble")}catch(e){}if(!s||s.classList.contains("bubble-first"))return;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),this.element.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+s.dataset.mid;if(!n)return;const a=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(s),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ca(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),t.selection.isSelecting&&!i){if(a)return;const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}const o=Object(Me.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),a?this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.isSponsored)}):(this.noForwards=!this.appMessagesManager.canForward(this.message),this.buttons.forEach(e=>{let s;t.selection.isSelecting&&!e.withSelection?s=!1:(i||ue.IS_TOUCH_SUPPORTED,s=e.verify()),e.element.classList.toggle("hide",!s)}));const r=s.classList.contains("is-in")?"left":"right";Object(te.e)(e.touches?e.touches[0]:e,this.element,r),Object(te.d)(this.element,()=>{this.mid=0,this.peerId=void 0,this.target=null})};ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;const s=e.target.className;if(!s||!s.includes)return;t.log("touchend",e);["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find(e=>s.match(new RegExp(e+"($|\\s)")))&&(Object(c.a)(e),r(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(te.a)(e,r,this.chat.bubbles.listenerSetter)}init(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending(()=>{Object(ms.a)(this.message),this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.chat.canSend()&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!ue.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Me.a)(this.target,"document")||!!Object(Me.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.pFlags.out||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new Ia(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new Ma},verify:()=>!1,isSponsored:!0}],this.element=Ce(this.buttons,this.chat.bubbles.listenerSetter),this.element.id="bubble-contextmenu",this.element.classList.add("contextmenu"),this.chat.container.append(this.element)}}var Ta=s(175),ka=s.n(Ta),xa=s(159);class Oa{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=Ce(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(te.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(te.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var Aa=s(90),Fa=s(107);class _a extends ut.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(Fa.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(xs.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);x.default.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(x._i18n)(this.title,"NewPoll"),this.questionInputField=new F.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new Oa({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(x._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new mt.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new mt.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new mt.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(x._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new F.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(x._i18n)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(Aa.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(Aa.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(Aa.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,{threadId:this.chat.threadId,replyToMsgId:this.chat.input.replyToMsgId,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent}),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new F.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new ot({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(xs.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(s)}}var Da=s(79);function ja(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Da.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new Oa({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new T.b(null);i.container.append(this.mediaContainer),this.inputField=new F.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],Ba=void 0}),Ba=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new mt.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>m.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new mt.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void lt(x.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat,{sendSilent:l,scheduleDate:c}=r;i.forEach(e=>{e.itemDiv=void 0});const{length:d}=i,h=r.replyToMsgId;this.iterate(e=>{t&&e.length!==d&&(this.chat.appMessagesManager.sendText(o,t,{replyToMsgId:h,threadId:this.chat.threadId,silent:l,scheduleDate:c,clearDraft:!0}),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign({caption:t,replyToMsgId:h,threadId:this.chat.threadId,isMedia:n,silent:l,scheduleDate:c,clearDraft:!0},i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(me.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(me.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([ja(n).then(e=>{t.duration=Math.ceil(e)}),Object(me.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?J.b.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=he.a.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=ws({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&m.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(k.a)(t,Object(x.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Vn.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),Ms({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const Ha=["ArrowUp","ArrowDown"],Na=["ArrowLeft","ArrowRight"];function za({list:e,type:t,onSelect:s,once:i,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Ha.concat(Na):"x"===t?Na:Ha);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,h=(e,s)=>{if(r===e)return;let i=!1;r&&(i=!0,r.classList.remove("active")),r=e,r&&(r.classList.add("active"),i&&g&&s&&Object(wt.b)({container:g,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):p(t,"ArrowRight"===s):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let m=s=>{const i=s.key;if(o.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=d();e=u(e,i),h(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),f(d()))};const g=Object(Me.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(Ws.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(Ws.a)(t.target,e);s&&(h(s,!1),f(d()))},f=e=>{const t=s(e);(void 0!==t?!t:i)&&S()};let y=!1;const w=()=>{y||(y=!0,document.addEventListener("keydown",m,{capture:!0,passive:!1}),e.addEventListener("mousemove",b,{passive:!0}),Object(l.b)(e,v))},S=()=>{y&&(y=!1,document.removeEventListener("keydown",m,{capture:!0}),e.removeEventListener("mousemove",b),Object(l.c)(e,v))},L=()=>{a||h(e.firstElementChild,!1)};if(a){const e=m;m=t=>{a.has(t.key)&&(Object(c.a)(t),document.removeEventListener("keydown",m,{capture:!0}),m=e,document.addEventListener("keydown",m,{capture:!0,passive:!1}),a=void 0,L())}}else L();return w(),{attach:w,detach:S,resetTarget:L}}class Va extends B.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:s,resetTarget:i}=za({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=s,this.resetTarget=i,re.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},j.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1){this.init||(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden!==e?(this.hidden=e,e?(this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0),t||this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller.hideOtherHelpers(this),this.dispatchEvent("visible")),Object(Jt.a)(this.container,"is-visible",!e,a.default.settings.animationsEnabled?200:0,()=>{this.hidden&&this.dispatchEvent("hidden")})):e||this.dispatchEvent("visible"))}}class Ka extends Va{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!oa.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.default.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),cs.a.preloadAnimatedEmojiSticker(e),cs.a.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Qn(this.lazyLoadQueue,gr)}}const Ga=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Wa=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class qa extends yn{constructor(e,t,s){var i;if(super((i=e).getTime()>Wa().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Ga(),maxDate:Wa(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var Qa=s(133),$a=s(101);function Ya(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(Nn(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new T.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{Hn(e,this.list,!1,!0)})),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Ja extends Va{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Ja.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Ja.BASE_CLASS+"-list"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Ja.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),this.toggle(!e.length)}static listElement(e){const t=Ja.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new Or;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=J.b.wrapEmojiText(e.name):n.append(new Lt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=J.b.wrapEmojiText(e.description),s.append(i)}return s}}Ja.BASE_CLASS="autocomplete-peer-helper",Ja.BASE_CLASS_LIST_ELEMENT=Ja.BASE_CLASS+"-list-element";class Za extends Ja{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Ja.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return this.appProfileManager.getProfileByPeerId(t).then(t=>{if(!s())return;const i=[].concat(t.bot_info),n=new On.a({ignoreCase:!0}),a=new Map;i.forEach(e=>{e.commands.forEach(t=>{const s="/"+t.command;a.set(t.command,{peerId:e.user_id.toPeerId(!1),name:s,description:t.description}),n.indexObject(t.command,s)})});const o=n.search(e),r=Array.from(o).map(e=>a.get(e));this.render(r)}),!0}}class eo{constructor(){this.helpers=new Set,this.middleware=Object(ks.a)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class to extends Ja{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var so=s(4);class io extends ia{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(Ws.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.g)(this,e),this.element.classList.add(io.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(Ts.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),ue.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Me.a)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;switch(s){case"keyboardButtonRequestPhone":ln({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then(()=>{this.appMessagesManager.sendContact(i,a.default.myId)});break;default:this.appMessagesManager.sendText(i,t.dataset.text)}this.toggle(!1)}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(io.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(io.BASE_CLASS+"-button","btn"),t.innerHTML=J.b.wrapEmojiText(s.text),t.dataset.text=s.text,t.dataset.type=s._,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}io.BASE_CLASS="reply-keyboard";var no=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ao extends Va{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,{clearDraft:!0,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent,replyToMsgId:this.chat.input.replyToMsgId}),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>no(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Gn(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=J.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=J.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=J.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>he.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object(ne.b)(e).then(e=>{Ls(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(ms.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),Ss({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary");i.insertAdjacentHTML("beforeend",J.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=dt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Qn(this.lazyLoadQueue,"INLINE-HELPER")}}var oo=s(3);class ro{constructor(e,t,s,i,n,o,r,d,h,p,u,m,g,b){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=m,this.appUsersManager=g,this.appInlineBotsManager=b,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),xa.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new qa(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Ya(this.messageInputField.input),a=J.b.parseMarkdown(s,i,!0),o=J.b.mergeEntities(i,J.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=!(null===(t=this.editMessage)||void 0===t?void 0:t.media)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ht.a.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.appWebPagesManager.saveWebPage(e),params:{url:t}}).then(s=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(s.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"}))}else this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,J.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.chat.canSend("send_media"))return void lt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(Ks.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),xa.a.setKeepAlive(!0);const e=()=>{new gt("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Me.a)(t.target,"chat-input")||Object(Me.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),j.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(De.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":lt("Please allow access to your microphone");break;case"NotReadableError":lt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),lt(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=J.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new gt("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Me.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&ue.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&Object(te.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Sa();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=this.fakeSelectionWrapper=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=Q({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter});const i=this.controlContainer=document.createElement("div");i.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(i)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=H(""),this.replyElements.cancelBtn=H("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new mt.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new mt.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new mt.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new mt.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ce(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=x.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=tt(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!ue.IS_TOUCH_SUPPORTED){this.forwardHover=new ia({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=H("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type&&(this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=Q({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=H("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=H("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new io({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...m].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{new _a(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=Ie({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new eo,this.stickersHelper=new Ka(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Xa(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Za(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new to(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new ao(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=H("delete danger btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=H("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new Oa({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),la.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(la)("open",this.onEmoticonsOpen),this.listenerSetter.add(la)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.default)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.default)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),this.listenerSetter.add(a.default)("chat_changing",({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)}),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):(this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.chat.peerId]&&(this.startParam===Be.a?this.setStartParam():this.center(!0))}));try{this.recorder=new ka.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new Ua(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(j.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});xa.a.decode(e,!0).then(e=>{xa.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=dt(()=>this.saveDraft(),2500,!1,!0),this.botStartBtn=Object(U.a)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append(Object(x.i18n)("BotStart")),Object(l.b)(this.botStartBtn,()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=Object(bt.a)([this.botStartBtn],!0),s=this.chat.peerId,i=this.chat.bubbles.getMiddleware(()=>this.chat.peerId===s&&this.startParam===e&&this.toggleBotStartBtnDisability===t);this.appMessagesManager.startBot(s.toUserId(),void 0,e).then(()=>{i()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())})},{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=Object(U.a)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new La(e,0,!0,()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.chatInput.classList.add("type-pinned")}center(e=!1){const t=this.getNeededFakeContainer();if(!t&&!this.inputContainer.classList.contains("is-centering"))return;if(t===this.fakeWrapperTo)return;const s=t||this.fakeWrapperTo,i=!!t,n=this.fakeWrapperTo;let a,o="",r="";const l=s.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,i&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=t;const p=e?200:0;return Object(Jt.a)(this.inputContainer,"is-centering",i,p),Object(Jt.a)(this.rowsWrapperWrapper,"is-centering-to-control",!!(i&&t&&t.classList.contains("chat-input-control")),p),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(t&&t.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:d,widthTo:h}}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!this.chat.canSend()||"pinned"===this.chat.type||this.chat.isStartButtonNeeded()?this.controlContainer:void 0}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){if(!this.goDownUnreadBadge)return;const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(Aa.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(oe.h)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),Gs(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(Fa.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(De.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(e){const t=this.chat.peerId,{forwardElements:s,btnScheduled:i,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r}=this;r.style.display="";const l=this.appPeersManager.isBroadcast(t);if(o.classList.toggle("is-broadcast",l),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",this.appPeersManager.canPinMessage(t)),s&&(this.forwardWasDroppingAuthor=!1,s.showCaption.checkboxField.setValueSilently(!0),s.showSender.checkboxField.setValueSilently(!0)),i){i.classList.add("hide");const e=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(t).then(t=>{e()&&i.classList.toggle("hide",!t.length)})}n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&this.pinnedControlBtn.append(Object(x.i18n)(this.appPeersManager.canPinMessage(this.chat.peerId)?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this.center(!1)}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.chat.canSend();e.classList.contains("is-hidden")!==!a&&(e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition"));const o=x.default.weakMap.get(s);if(o){let e;e=n?"Comment":this.appPeersManager.isBroadcast(i)?"ChannelBroadcast":this.appMessagesManager.isAnonymousSending(i)?"SendAnonymously":"Message",o.compareAndUpdate({key:e})}const r=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!r.length),t.classList.toggle("btn-disabled",!r.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new F.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),oo.a&&Object(oo.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(Qa.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Da.a)(this.messageInput)}),ue.IS_TOUCH_SUPPORTED&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),la.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=$a.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Ya(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(ro.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,p=J.b.parseEntities(i);J.b.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?u-c[2].length:u;a.forEach(e=>{e.offset>=d&&(e.offset+=g)}),J.b.mergeEntities(a,m);{const e={_:"messageEntityCaret",offset:d+u,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=J.b.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Ya(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=J.b.parseMarkdown(e,s,!0);s=J.b.mergeEntities(s,J.b.parseEntities(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(ro.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.chat.canSend("send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Be.c:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(Jt.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=H("none btn-preloader float show disable-hover",{noRipple:!0}),Object(te.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(Jt.a)(this.btnPreloader,"show",!1,400)})}).catch(Fe.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(Jt.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(Jt.a)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Hs(Object(w.a)(this.forwarding),()=>{t=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,t||e()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&re.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),Object(so.a)(e),this.messageInputField.setValueSilently(s),Object(so.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);ue.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(Fa.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;J.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(ie.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{threadId:i,peerId:n}=s,{replyToMsgId:a,noWebPage:o,sendSilent:r,scheduleDate:l}=this,{value:c,entities:d}=Object(Aa.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!c.trim()&&!e.media)return void new Ns(n,[t],s.type);this.appMessagesManager.editMessage(e,c,{entities:d,noWebPage:o}),this.onMessageSent()}else c.trim()&&(this.appMessagesManager.sendText(n,c,{entities:d,replyToMsgId:a,threadId:i,noWebPage:o,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,scheduleDate:l,silent:r,clearDraft:!0}),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(w.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(n,t.toPeerId(),e[t],{silent:r,scheduleDate:l,dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()});c||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.chat.canSend(n)?(lt("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,{isMedia:!0,replyToMsgId:this.replyToMsgId,threadId:this.chat.threadId,silent:this.sendSilent,scheduleDate:this.scheduleDate,clearDraft:s||void 0}),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=la.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(ft.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=J.b.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(x.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?Object(x.i18n)("Chat.Accessory.Forward.You"):new Lt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(ft.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=Object(x.i18n)(h,[n]),u=document.createDocumentFragment();let m,g;if(l.length<3?u.append(...Object(x.join)(l,!1)):u.append(l[0],Object(x.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(m=this.appMessagesManager.getMessageByPeer(t,i[0]),g=!!m.grouped_id,g){const e=this.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find(e=>!i.includes(e)))&&(g=!1)}}const b=document.createDocumentFragment();if(g||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(m,void 0,t);b.append(u,": ",i)}else b.append(Object(x.i18n)("Chat.Accessory.Forward.From"),": ",u);let v=this.setTopInfo("forward",t,p,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=x.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(x.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new Lt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(j.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(Jt.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(De.b)(()=>{s&&Object(Da.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=H(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=Is(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),re.IS_MOBILE||j.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}ro.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class lo{constructor(e){this.floating=!1,Object(w.g)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(se.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class co extends lo{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new ze("pinned-audio",(e,t)=>{Object(k.a)(this.divAndCaption.title,e),Object(k.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.divAndCaption.border.remove();const i=H("pprevious active",{noRipple:!0}),n=H("nnext active",{noRipple:!0});i.innerHTML='',n.innerHTML='';const o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=H("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new xe(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r),this.wrapperUtils.prepend(this.volumeSelector.btn);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new ke(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new Lt.a({peerId:t.fromId}).element,n=Object(oe.d)(t.date)):(i=e.audioTitle||e.fileName,n=e.audioPerformer||Object(x.i18n)("AudioUnknownArtist")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.add("flip-icon"),this.toggle(!1)}),this.topbar.listenerSetter.add(a.default)("media_pause",()=>{this.toggleEl.classList.remove("flip-icon")}),this.topbar.listenerSetter.add(a.default)("media_stop",()=>{this.toggle(!0)})}}var ho;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(ho||(ho={}));class po{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=ho.ONE:2===e?s=ho.TWO:3===e?s=ho.THREE:4===e?s=ho.FOUR:e>3&&(s=ho.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=ho.ONE:2===e?s=ho.TWO:3===e?s=ho.THREE:4===e?s=ho.FOUR:e>3&&(s=ho.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-ho.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?ho.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var uo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class mo{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=mo.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=mo.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},mo.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}mo.DURATION=200,mo.BASE_CLASS="animated-super";class go{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=go.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=go.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=go.BASE_CLASS+"-decimal-placeholder";const i=new mo;return i.container.className=go.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},mo.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(go.EMPTY_INDEX,!0);t.animatedSuper.animate(go.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:go.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}go.EMPTY_INDEX=-1,go.BASE_CLASS="animated-counter";class bo{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new Ke("pinned-message");this.pinnedMessageContainer=new lo({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>uo(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new La(this.topbar.peerId,this.pinnedMid,!0):new La(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new po,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new mo,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new mo,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new go(!0),n.title.append(Object(x.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=H("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.default)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=dt(()=>this._setPinnedMessage(),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>bo.LOAD_COUNT&&(!this.loadedBottom&&e<=bo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=bo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return uo(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:bo.LOAD_COUNT,backLimit:bo.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(ue.IS_TOUCH_SUPPORTED){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return uo(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(Ts.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return uo(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return uo(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ve({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}bo.LOAD_COUNT=50,bo.LOAD_OFFSET=5;var vo=da;class fo{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&Object(c.a)(e);const s=e=>{e.forEach(e=>{e.element.classList.toggle("hide",!e.verify())})};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(x.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!vo||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();if((null==s?void 0:s.chatId)===i)return!1;if(e&&(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))return!1;return(null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")},this.verifyCallButton=e=>{if(!pa||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),s=this.appProfileManager.getCachedFullUser(t);return!!s&&!!("voice"===e?s.pFlags.phone_calls_available:s.pFlags.video_calls_available)},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),re.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{re.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0})},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce((e,t)=>{const s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=H("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new co(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ie({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"pinned-container");if(Object(Ks.a)(),t){if(Object(c.a)(e),Object(Me.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:s,type:i.isScheduled?"scheduled":i.threadId?"discussion":void 0,threadId:i.threadId})}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(ft.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);j.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.default.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.default.pushToState("chatContextMenuHintWasShown",!0),lt(Object(x.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(jt)){const e=new jt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Pt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new gt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Lt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)&&!!this.appUsersManager.getUser(this.peerId.toUserId()).phone},{icon:"lock",text:"BlockUser",onClick:()=>{new gt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Lt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&ct({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.default.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&ct({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new At(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=H("search"),this.attachClickEvent(this.btnSearch,e=>{this.chat.initSearch()},!0)}attachClickEvent(e,t,s){Object(l.b)(e,e=>{Object(c.a)(e),!s&&Object(Ks.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new Or,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(U.a)("btn-primary btn-color-primary chat-join hide"),this.btnCall=H("phone"),this.btnGroupCall=H("videochat"),this.btnPinned=H("pinlist"),this.btnMute=H("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,()=>{this.openPinned(!0)}),this.attachClickEvent(this.btnMute,()=>{this.appMessagesManager.mutePeer(this.peerId)}),this.attachClickEvent(this.btnJoin,()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.default.myId),s.finally(()=>{e()&&this.btnJoin.removeAttribute("disabled")})}),this.listenerSetter.add(a.default)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth(),this.verifyButtons()}}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("peer_full_update",e=>{this.peerId===e&&this.verifyButtons()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();M.default.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.btnJoin)if(this.appPeersManager.isAnyChat(a)){const e=a.toChatId();Object(k.a)(this.btnJoin,Object(x.i18n)(this.appChatsManager.isBroadcast(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}else this.btnJoin.classList.add("hide");this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.default.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(De.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?Object(x.i18n)("Reminders"):Object(x.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(s=new Lt.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Ut())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class yo extends z{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new _("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=H("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new O("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new yn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),Yt.toggleSidebar(!0)),n}}class wo{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new yn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(ft.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(se.ripple)(this.backBtn);const i=this.listenerSetter=new R.a,n=(e,t)=>{Object(l.b)(e,t,{listenerSetter:i})};n(this.backBtn,()=>{this.destroy()}),this.inputSearch=new _("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new O(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(Object(k.a)(this.foundCountEl,this.inputSearch.value?Object(x.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),Object(se.ripple)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&this.setQuery(s),re.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},j.a.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.chat.search=void 0,j.a.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(xs.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(k.a)(this.foundCountEl,Object(x.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})}}class So extends B.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,p,u,m,g,b,v,f,y){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=m,this.storage=g,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.appGroupCallsManager=y,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(X.b)("CHAT",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.peerId=Be.c,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container)}setBackground(e){const t=a.default.getTheme();let s;if("color"===t.background.type&&"grabbing"===document.documentElement.style.cursor){const e=this.backgroundEl.lastElementChild;e&&e.dataset.type===t.background.type&&(s=e)}return s||(s=document.createElement("div"),s.classList.add("chat-background-item"),s.dataset.type=t.background.type),"color"===t.background.type&&(s.style.backgroundColor=t.background.color,s.style.backgroundImage="none"),new Promise(t=>{const i=()=>{const e=this.backgroundEl.lastElementChild;e!==s?(this.backgroundEl.append(s),Object(De.b)(()=>{Object(De.b)(()=>{Object(Jt.a)(s,"is-visible",!0,200,e?()=>{e.remove()}:null)})}),t()):t()};e?Object(rs.a)(s,e,i):i()})}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new fo(this,Yt,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new wa(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager),this.input=new ro(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager),this.selection=new Ys(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new Pa(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.default)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer()})}beforeDestroy(){this.bubbles.cleanup()}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t,s){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const i=this.peerId===e;if(i){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e||Be.c;if(!e)return Yt.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!i){const t=Yt.getTab(yo);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.container.classList.toggle("no-forwards",this.noForwards),Yt.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Be.a);const n=this.bubbles.setPeer(e,t,s);if(!n)return;const{promise:o}=n,r=this.setPeerPromise=o.finally(()=>{this.setPeerPromise===r&&(this.setPeerPromise=null)});return i||(Yt.sharedMediaTab.setLoadMutex(this.setPeerPromise),Yt.sharedMediaTab.loadSidebarMedia(!0)),n}setAutoDownloadMedia(){const e=this.peerId;if(!e)return;let t;t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",this.noAutoDownloadMedia=!a.default.settings.autoDownload[t]}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s,i){if(this.peerChanged)return;let n=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(n),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(i),Yt.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+n+"-"+this.type),a.default.dispatchEvent("peer_changed",n),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===Be.d||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new wo(this.topbar,this,e);else{let t=Yt.getTab(yo);t||(t=new yo(Yt)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return this.appPeersManager.isBot(this.peerId)&&!this.appMessagesManager.getDialogOnly(this.peerId)&&!this.appMessagesManager.getHistoryStorage(this.peerId).history.length}}var Lo=s(160);class Co{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,ue.IS_TOUCH_SUPPORTED){if(Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","link"].forEach(t=>{const s=H(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=H("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(x._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=H("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!J.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,j.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in $a.b){const i=$a.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=i.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(I.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(I.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ca())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),re.IS_MOBILE||j.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){ue.IS_TOUCH_SUPPORTED&&!re.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;if(document.activeElement!==this.appImManager.chat.input.messageInput)return void this.hide();const t=document.getSelection();if(Ca(t))this.hide();else if(ue.IS_TOUCH_SUPPORTED)if(re.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=t.getRangeAt(0),this.setMouseUpEvent()}else this.setMouseUpEvent()}))}}function Eo(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function Io(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+Eo(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+Eo(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+Eo(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Eo(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}de.a.generatePathData=Io;class Mo{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(x.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(x.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=Io(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function Po(e){e.forEach(e=>e.classList.add("no-transition")),Object(De.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var To=s(154),ko=s(24),xo=s(126),Oo=s(118);class Ao{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(c[n]*(1-s)+d[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=c[n-1]*(1-a)+d[n-1]*a,u=this.progress[n],m=(s-e)/h*(n-1),g=(s-e)/h*n,b=m+(g-m)/2,v=(t-p)*r+o*(1-r),f=(t-(c[n]*(1-u)+d[n]*u))*r+o*(1-r);l.bezierCurveTo(b,v,b,f,g,f),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class Fo{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Fo.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===Oo.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Oo.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Oo.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Oo.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class _o{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout(()=>{this.resizing=!1,this.invokeDraw()},250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:g,amplitude2:b,progressToState:v}=this,f=6*b*n,y=6*b*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,t.update(g,.3),s.update(g,.7),i.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-v,h=d):(n=d?v:1,c.update(l-o,r-a,m,g),h=c);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},b=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-f,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,b,o,1)}e||(this.raf=requestAnimationFrame(()=>this.draw()))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[Oo.a.UNMUTED,new Fo(Oo.a.UNMUTED)],[Oo.a.MUTED,new Fo(Oo.a.MUTED)],[Oo.a.MUTED_BY_ADMIN,new Fo(Oo.a.MUTED_BY_ADMIN)],[Oo.a.CONNECTING,new Fo(Oo.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Oo.a.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new Ao(3),this.lbd1=new Ao(7),this.lbd2=new Ao(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(){const e=this.container=document.createElement("div");e.classList.add("topbar-call-weave");const t=this.canvas=document.createElement("canvas");return t.classList.add("topbar-call-weave-canvas"),e.append(t),e}}var Do=new class{constructor(){this.cache={},a.default.addEventListener("theme_change",()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)})}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class jo{constructor(e,t){this.item=e,Object(w.g)(this,t)}play(e){return this.item.playPart(this,e)}}class Bo{constructor(e,t){this.icon=e,this.autoplay=!1,Object(w.g)(this,t),this.parts=this.parts.map(e=>this.createPart(e))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=le.a.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then(e=>le.a.waitForFirstFrame(e)).then(e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)}),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new jo(this,e)}getPart(e){return e instanceof jo?e:"string"==typeof e?this.parts.find(t=>t.name===e):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Ro{constructor(e){Object(w.g)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Fe.a)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Bo(this,e);return this.items.set(e.name,t),t}playPart(e,t,s){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,s)});const i=e.getPart(t);e.player.playPart({from:a.default.settings.animationsEnabled&&!this.skipAnimation?i.startFrame:i.endFrame,to:i.endFrame,callback:s})}static generateEqualParts(e,t){return new Array(e).fill(0).map((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}})}}class Uo extends Ro{constructor(e){super({width:e.width,height:e.height}),Object(w.g)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map(e=>e.load());return Promise.all(a).then(Fe.a)}setState(e,t,s){this.loaded||this.load(e,t);let i=!1,n=!1;return void 0!==e?i=this.setPartState(e,t,s):void 0!==t&&this.getColor&&(n=this.setColorState(t)),i||n}setPartState(e,t,s){const{partState:i}=this;if(i===e)return void 0!==t&&this.setColorState(t);void 0!==t&&this.setColorState(t,!1),this.partState=e;return this.getPart(e,i).play(s),!0}setColorState(e,t=!0){const{colorState:s}=this;if(s===e)return!1;this.colorState=e;const i=this.getItem(),n=this.getColor(e,s),a=()=>{i.player.setColor(n,t)};return i.player?a():i.onLoadForColor=a,!0}destroy(){this.items.forEach(e=>{e.loadPromise.then(()=>{e.player.remove()})})}}class Ho extends Uo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=tr;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}});this.container.classList.add("group-call-microphone-icon-container");this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}class No extends Uo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=er;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=er;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const n=Do.getProperty("gc-"+i+"-text-color");return s=function(e){return xi(e.slice(0,7))}(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=Ro.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=er;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}class zo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-status-container")}setState(e,t){const s=er,i=this.withIcons.filter(e=>!!t[e]).map(e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add("group-call-participant-status-icon","group-call-participant-status-icon-"+e,t),s});let n,a;if(e===s.MUTED_FOR_ME)n=Object(x.i18n)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=Object(x.i18n)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=Object(x.i18n)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void g(this.container,J.b.wrapEmojiText(t.about));n=Object(x.i18n)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add("group-call-participant-status",a),o.append(...i,n),Object(k.a)(this.container,o)}}class Vo extends As{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=ar(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{Os(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=qr.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=ar(i),a=new No(!0),o=new zo(["presentation","video"]);return a.setState(n),o.setState(n,i),Object(k.a)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:De.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=qr.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}class Ko{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-video-container"),this.info=document.createElement("div"),this.info.classList.add("group-call-participant-video-info"),this.left=document.createElement("div"),this.left.classList.add("group-call-participant-video-info-left"),this.right=document.createElement("div"),this.right.classList.add("group-call-participant-video-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add("group-call-participant-video-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=Object(x.i18n)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new Lt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new No(!1),this.groupCallParticipantStatus=new zo([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),s.classList.add("group-call-participant-video","call-video"),s.paused&&s.play();const n=function(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const s=t.getContext("2d");s.filter="blur(2px)";const i=()=>{s.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return Object(os.a)(()=>(i(),t.isConnected)),i(),t}(s);n.classList.add("group-call-participant-video-blur"),this.container.prepend(n,s),this.updateParticipant(e)}updateParticipant(e){const t=ar(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Go extends Pe{constructor(e){super(),Object(w.g)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)}),s.add(this.instance)("pinned",e=>{this.participantsElements.forEach(t=>{t.forEach(t=>{this.setElementDisplay(t,e)})})}),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()},{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some(t=>!!e[t]);let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach(s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Ko(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)}))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.containers.forEach(e=>{e.destroy()})}}class Wo{constructor(e){this.onOpenProfileClick=()=>{const e=ut.b.getPopup(rr);e&&e.hide(),a.default.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{ln({peerId:this.targetPeerId,title:new Lt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Lt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},Fe.a)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ce(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(te.a)(e.onContextElement,e=>{const t=Object(Me.a)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.verify(i))}),Object(c.a)(e),Object(te.e)(e.touches?e.touches[0]:e,this.element,"right"),Object(te.d)(this.element))},t),t.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&Object(te.c)()}});let s=document.body;Object(Te.a)(document.body,()=>{const e=Object(Te.d)();s=e?ut.b.getPopup(rr).getContainer():document.body,e||Object(te.c)()},t)}}class qo{constructor(e){Object(w.g)(this,e);const t=new T.b(void 0);t.container.classList.add("group-call-participants-scrollable");const s=this.container=document.createElement("div");s.classList.add("group-call-participants");const i=this.sortedList=new Vo(this.instance),{instance:n,listenerSetter:o}=this;this.contextMenu=new Wo(Object.assign(Object.assign({},e),{onContextElement:i.list,listenerSetter:o,instance:n})),this.groupCallParticipantsVideo=new Go(Object.assign(Object.assign({},e),{appendTo:t.container,displayPinned:!1})),t.append(i.list),s.append(t.container),e.appendTo.append(s),o.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)});new yt({scrollable:t,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants:e,isEnd:t})=>(e.forEach(e=>{this.updateParticipant(e)}),t))});this.setInstance(n)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Qo{constructor(e){this.appendTo=e,this.descriptionIntl=new x.default.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let s,i;t===Oo.a.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:s,args:i}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class $o{constructor(e){this.appendTo=e,this.peerTitle=new Lt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?g(s,J.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var Yo=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Xo(e,t,s){const i=e+"-button",n=document.createElement("div");n.classList.add(i,"call-button","rp-overflow"),s.icon&&n.classList.add("tgico-"+s.icon),s.noRipple||Object(se.ripple)(n),s.isDanger&&n.classList.add(i+"-red"),s.isConfirm&&n.classList.add(i+"-green"),s.callback&&Object(l.b)(n,s.callback,{listenerSetter:t});let a=n;if(s.text){const e=document.createElement("div");e.classList.add(i+"-container","call-button-container");const t="string"==typeof s.text?Object(x.i18n)(s.text):s.text;t.classList.add(i+"-text","call-button-text"),e.append(n,t),a=e}return a}class Jo extends B.a{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},Object(w.g)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add("movable-element"),this.addResizeHandlers(),this.setSwipeHandler(),b.b.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove("movable-element"),this.handlers&&this.handlers.forEach(e=>{e.remove()})}destroy(){b.b.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map(e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add("movable-element-resize-handler","movable-element-resize-handler-side-"+e),this.element.append(t),t})}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new Vt({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ct.a.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ct.a.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const s=Object(Me.a)(t,"movable-element-resize-handler");return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=Ct.a.height/2-this.height/2,this.left=Ct.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(I.a)(this.width,this.minWidth,Ct.a.width),this.height=Object(I.a)(this.height,this.minHeight,Ct.a.height)}fixPosition(){this.top=Object(I.a)(this.top,0,Ct.a.height-this.height),this.left=Object(I.a)(this.left,0,Ct.a.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var Zo,er,tr,sr=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)},ir=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s};class nr{constructor(e){Zo.set(this,void 0),Object(w.g)(this,e),this.toggleMovable(!ue.IS_TOUCH_SUPPORTED),this.listenerSetter.add(b.b)("changeScreen",(e,t)=>{t!==b.a.mobile&&e!==b.a.mobile||this.toggleMovable(!ue.IS_TOUCH_SUPPORTED)})}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return sr(this,Zo,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=ir(this,Zo,new Jo(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),ir(this,Zo,void 0,"f")}}}function ar(e){const t=er;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}Zo=new WeakMap,function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(er||(er={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(tr||(tr={}));let or={width:420,height:640};class rr extends ut.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Te.e)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.onVideoClick=()=>{const e=Object(bt.a)([this.btnVideo],!0);this.instance.toggleVideoSharing().finally(()=>{e()})},this.onScreenClick=()=>{const e=Object(bt.a)([this.btnScreen],!0);this.instance.toggleScreenSharing().finally(()=>{e()})},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new gt("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=Object(Te.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(E.a.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=Object(Te.d)(),s=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,i=(t||!!(s&&s.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;i&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach(e=>{e.style.opacity="0"}),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",i),this.btnInvite.classList.toggle("hide",i),this.btnShowColumn.classList.toggle("hide",!i),a&&a.forEach(e=>{e.style.opacity=""})},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},Object(w.g)(this,e),this.videosCount=0,this.container.classList.add("group-call","night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!re.IS_APPLE_MOBILE){const e=this.btnFullScreen=H("fullscreen"),t=this.btnFullScreen2=H("fullscreen group-call-cfs"),i=this.btnExitFullScreen=H("smallscreen");Object(l.b)(e,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(t,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(i,()=>{Object(Te.b)()},{listenerSetter:s}),Object(Te.a)(this.container,this.onFullScreenChange,s)}this.btnInvite=H("adduser");const i=this.btnShowColumn=H("rightpanel group-call-only-big");Object(l.b)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),c=n.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=H("rightpanel");r.append(...[h,c,this.btnFullScreen2].filter(Boolean)),Object(l.b)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new T.b(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new $o(this.title),this.groupCallDescription=new Qo(o),this.groupCallBodyHeaderDescription=new Qo(d),this.constructButtons(),this.groupCallParticipantsVideo=new Go(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new qo(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e)),this.movablePanel=new nr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Me.a)(t,"chatlist")||Object(Me.a)(t,"group-call-button")||Object(Me.a)(t,"btn-icon")||Object(Me.a)(t,"group-call-participants-video-container")||Object(Te.d)())}},onResize:()=>this.toggleBigLayout(),previousState:or}),s.add(t)("state",()=>{this.updateInstance()}),s.add(a.default)("group_call_update",e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()}),s.add(t)("pinned",()=>{this.setHasPinned()}),s.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",()=>{const{movablePanel:e}=this;or=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()}),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=Xo.bind(null,"group-call",this.listenerSetter),s=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),i=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});i.classList.toggle("hide",!Yo);const n=t({noRipple:!0,callback:Object(gs.a)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Ho;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Yo);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(s,i,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===Oo.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Te.b)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const s=function(e,t){const s=tr;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(0,e);this.container.dataset.micState=s===tr.HAND?"hand":s===tr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(s)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var lr,cr=s(166);!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(lr||(lr={}));var dr=lr;class hr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let s;if(this.state=t,t===dr.CONNECTED){s=document.createElement("span"),s.classList.add("call-description-duration");const t=()=>{s.innerText=(""+e.duration).toHHMMSS(!0)};this.interval=window.setInterval(t,1e3),t()}else{let i;switch(t){case dr.PENDING:i=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case dr.REQUESTING:i="Call.StatusRequesting";break;case dr.EXCHANGING_KEYS:i="VoipExchangingKeys";break;case dr.CLOSED:i=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:i="Call.StatusConnecting"}s=Object(x.i18n)(i),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}Object(k.a)(this.container,s),this.container.parentElement||this.appendTo.append(this.container)}}class pr extends Uo{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}class ur{constructor(e,t,s,i){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s,this.appAvatarsManager=i,this.onState=()=>{this.updateInstance(this.instance)};const n=this.listenerSetter=new R.a;n.add(a.default)("call_instance",({instance:e,hasCurrent:t})=>{t||this.updateInstance(e)}),n.add(a.default)("group_call_instance",e=>{this.updateInstance(e)}),n.add(a.default)("group_call_update",e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)}),n.add(a.default)("group_call_amplitude",({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)})}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0),this.instance!==e&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new R.a,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof cr.a?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)));const t=this.instance.isMuted;let s=e instanceof cr.a?e.state:function(e,t){switch(e){case dr.CLOSING:case dr.CLOSED:return Oo.a.CLOSED;case dr.CONNECTED:return t?Oo.a.MUTED:Oo.a.UNMUTED;default:return Oo.a.CONNECTING}}(e.connectionState,t);const{weave:i}=this;i.componentDidMount();const n=s===Oo.a.CLOSED;document.body.classList.contains("is-calling")&&!n||(n&&i.setAmplitude(0),Object(Jt.a)(document.body,"is-calling",!n,250,n?()=>{i.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),n||(i.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!t))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof cr.a)return this.groupCallTitle.update(e);Object(k.a)(this.center,new Lt.a({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new pr,n=H();n.append(i.container),s.append(n);const a=Object(gs.a)(()=>{this.instance.toggleMuted()},600,!0);Object(l.b)(n,e=>{Object(c.a)(e),a()},{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new $o(o),this.groupCallDescription=new Qo(s),this.callDescription=new hr(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=H("endcall_filled");r.append(d),Object(l.b)(d,e=>{Object(c.a)(e);const{instance:t}=this;t&&(t instanceof cr.a?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))},{listenerSetter:e}),Object(l.b)(t,()=>{if(this.instance instanceof cr.a){if(ut.b.getPopup(rr))return;new rr({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}},{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new _o,p=h.render();t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var mr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const gr="chat",br=ue.IS_TOUCH_SUPPORTED?"touchstart":"mousemove";const vr=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.backgroundPromises={},this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){j.a.replaceState();const{onclick:e}=J.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername({userName:e,lastMsgId:t});break;default:this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=dt(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ht.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.default.settings.animationsEnabled?250:0,!1,!0),le.a.setLoop(a.default.settings.stickers.loop),E.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();x.default.setTimeFormat(a.default.settings.timeFormat)},this.onDocumentPaste=(e,t)=>{const s=Ra();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(me.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(m.has(e[0].type)?"media":"document"),new Ua(this.chat,e,i.willAttachType)}})}},ti.a.attach(),Dt.a.start(),this.log=Object(X.b)("IM",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.selectTab(0),window.addEventListener("blur",()=>{E.a.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),E.a.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0})}),window.addEventListener(br,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),document.body.append(this.emojiAnimationContainer),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),j.a.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),Object(Ts.a)(()=>{E.a.setOnlyOnePlayableGroup("lock"),E.a.checkAnimations(!0)},()=>{E.a.setOnlyOnePlayableGroup(""),E.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&Yt.toggleSidebar(!1),e===b.a.mobile?document.body.append(this.emojiAnimationContainer):t===b.a.mobile&&this.columnEl.append(this.emojiAnimationContainer)}),a.default.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i,startParam:n}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer({peerId:t,lastMsgId:i,type:s?"discussion":void 0,threadId:s,startParam:n})}),a.default.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.default.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.default.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{var s;const n=this.chat;if(!n||n.peerId!==e||a.default.overlaysActive||b.b.activeScreen===b.a.mobile&&1!==this.tabId)return;const o=t.find(e=>"sendMessageEmojiInteraction"===e.action._);if("sendMessageEmojiInteraction"===(null===(s=null==o?void 0:o.action)||void 0===s?void 0:s._)){const t=o.action,s=n.bubbles.bubbles[v.a.generateMessageId(o.action.msg_id)];if(s&&ua(s,n.bubbles.scrollable.container)){const n=s.querySelector(".media-sticker-wrapper");JSON.parse(t.interaction.data).a.forEach(e=>{setTimeout(()=>{Object(l.d)(n)},1e3*e.t)}),i.a.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}),a.default.addEventListener("instance_deactivated",()=>{const e=new ut.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(x.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(x.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.onClose=()=>{document.body.classList.add("deactivated-backwards"),To.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)},e.show()}),An.a.get("chatPositions").then(e=>{An.a.setToCache("chatPositions",e||{})}),(pa||vo)&&(this.topbarCall=new ur(xo.a,o.a,G.a,d.a)),To.a.activateInstance();const e=()=>{ko.default.setAuthorized(!0)};setInterval(e,oe.a),e(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new gt("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:ha.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:ha.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),vo&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>mr(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:ha.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:ha.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink(ha.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach(e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.JOIN_CHAT,e);this.processInternalLink(t)}})}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(Mn.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex(e=>e.peerId===a.default.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer({peerId:t.peerId})}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!ue.IS_TOUCH_SUPPORTED&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Da.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return mr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case ha.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:s,startParam:e.start});break}case ha.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(G.a.getChat(t).deleted)try{yield G.a.resolveChannel(t)}catch(e){throw ct({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer({peerId:s,lastMsgId:i,threadId:n});break}case ha.STICKER_SET:new Ri({id:e.set}).show();break;case ha.JOIN_CHAT:ht.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new ma(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&<(Object(x.i18n)("InviteExpired"))});break;case ha.VOICE_CHAT:vo&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e){const{userName:t,lastMsgId:s,threadId:i,commentId:n,startParam:a}=e;return P.a.resolveUsername(t).then(e=>{const t="user"===e._,o=e.id.toPeerId(!t);return i?this.openThread(o,s,i):n?this.openComment(o,s,n):this.setInnerPeer({peerId:o,lastMsgId:s,startParam:a})},e=>{"USERNAME_NOT_OCCUPIED"===e.type?ct({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&ct({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return"messageEmpty"===n._?t=void 0:i.a.generateThreadServiceStartMessage(n),this.setInnerPeer({peerId:e,lastMsgId:t,threadId:s,type:"discussion"})})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}callUser(e,t){return mr(this,void 0,void 0,(function*(){}))}discardCurrentCall(e){}discardCallConfirmation(e){return mr(this,void 0,void 0,(function*(){}))}discardGroupCallConfirmation(e){return mr(this,void 0,void 0,(function*(){const t=xo.a.groupCall;t&&(yield ln({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Lt.a({peerId:t.chatId.toPeerId(!0)}).element,new Lt.a({peerId:e}).element],button:{langKey:"OK"}}),xo.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return mr(this,void 0,void 0,(function*(){const s=e.toChatId(),i=G.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield xo.a.getGroupCallFull(t))._){if(!i)return void ct({langPackKey:"VoiceChat.Chat.Ended"});yield ln({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{mr(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=xo.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield xo.a.createGroupCall(s)}xo.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.default.getTheme();if("image"===t.background.type||"default"===t.background.type&&t.background.slug){const s=M.AppStateManager.STATE_INIT.settings.themes.find(e=>e.name===t.name);if(!(t.background.blur===s.background.blur&&t.background.slug===s.background.slug))return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(w.a)(s.background),this.setBackground("",!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=he.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.default.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=An.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:Object(w.e)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}An.a.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=An.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!ue.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return Ai(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Po([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&Object(Ts.b)(Object(kn.a)(400),400);const s=Object(xs.a)(this.prevTab);Object(xs.a)(e)>s&&j.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(Ks.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),ue.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new Co(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>mr(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=Ra();if(!d||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield Object(me.d)(r,!0),t=d&&!e.length,s=e.filter(e=>m.has(e)).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new Mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new Mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new Mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(Jt.a)(p,"is-visible",l,200,()=>{l||(u.forEach(e=>{e.destroy()}),u.length=0)}),l?u.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||a.default.isOverlayActive||!e.canSend("send_media"))}selectTab(e,t){!1===t&&Po([vn.sidebarEl,this.columnEl,Yt.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?Object(De.a)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(kn.a)(e),Object(Ts.b)(i,e)}return this.tabId=e,Object(Ks.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!j.a.findItemByType("im"))&&j.a.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(P.a.setUserStatus(this.myId,this.offline),ht.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new So(this,G.a,C.a,Jn,i.a,o.a,r.a,n.default,cs.a,P.a,Lo.a,Je.a,ht.a,Mi.a,Ze.a,An.a,Dt.a,jn,v.a,xo.a);return this.chats.length&&e.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(!0)),this.chats.push(e),e}spliceChats(e,t=!0,s,i){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e)),a.default.dispatchEvent("chat_changing",{from:n,to:this.chat});for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=Yt.getTab(yo);e&&e.close();Yt.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(Yt.sharedMediaTab.loadSidebarMedia(!0),Yt.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}setPeer(e={},t){var s;this.init&&(this.init(),this.init=null),null!==(s=e.peerId)&&void 0!==s||(e.peerId=Be.c);const{peerId:i,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(i){if(o>0&&a.peerId&&a.peerId!==i){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===i)return void this.spliceChats(0,!0,!0,t);{const s=this.setPeer(e);return this.spliceChats(0,!1,!1,t),s}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,t)}if(i===a.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,t),!1;if(i||b.b.activeScreen!==b.a.mobile){const s=a.setPeer(i,n,e.startParam),o=(null==s?void 0:s.cached)?s.promise:Promise.resolve();i&&o.then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,t)},0)})}return i?void 0:(this.selectTab(0,t),!1)}setInnerPeer(e){var t;const{peerId:s}=e;if(s===Be.c||!s)return;const i=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex(e=>e.peerId===s&&e.type===i);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const o=this.chat;let r=o;return o.inited&&(r=this.createNewChat()),i&&(r.setType(i),e.threadId&&(r.threadId=e.threadId)),a.default.dispatchEvent("chat_changing",{from:o,to:r}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!P.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let c,d=t.firstElementChild;if(d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new Lt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(_e.a)(J.b.wrapEmojiText(r.emoticon));c.push(e)}const h=Object(x.i18n)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e){var t;return mr(this,void 0,void 0,(function*(){let s;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const i=e.toChatId(),a=yield n.default.getChatFull(i);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(s=n.default.getChatMembersString(i),o<2)return s;const r=yield n.default.getOnlines(i);if(r>1){const e=document.createElement("span");e.append(...Object(x.join)([s,Object(x.i18n)("OnlineCount",[Object(I.d)(r)])],!1)),s=e}return s}{const i=P.a.getUser(e);if(a.default.myId===e)return;if(i){if(s=P.a.getUserStatusString(i.id),!P.a.isBot(e)){let n=this.getPeerTyping(e);if(n||"userStatusOnline"!==(null===(t=i.status)||void 0===t?void 0:t._)||(n=document.createElement("span"),n.classList.add("online"),n.append(s)),n)return n}return s}}}}))}setPeerStatus(e,t,s,i,n){s&&(t.innerHTML=i?"‎":"");const a=t.querySelector(".peer-typing-container");a&&this.getPeerTyping(e,a)||this.getPeerStatus(e).then(e=>{n()&&Object(k.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};de.a&&(de.a.appImManager=vr);var fr=vr;var yr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class wr extends B.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),ue.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Me.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.buttons.close.click()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||Object(Me.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(X.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ee.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=H("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new Or,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=H(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=H("zoomout",{noRipple:!0}),this.zoomElements.btnOut.addEventListener("click",()=>this.changeZoom(!1)),this.zoomElements.btnIn=H("zoomin",{noRipple:!0}),this.zoomElements.btnIn.addEventListener("click",()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Se({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(this.buttons.download.addEventListener("click",this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{e.addEventListener("click",this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),this.buttons.zoom.addEventListener("click",()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)}),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},ue.IS_TOUCH_SUPPORTED){new Vt({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(Te.d)())return;if(Math.abs(e)/Ct.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/Ct.a.height>.2||t>125)&&(this.buttons.close.click(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Me.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new Vt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Ie({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();j.a.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,E.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return yr(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof Or||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Me.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Me.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=ua(l,Object(Me.a)(l,"scrollable"),!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,m,g="";if(o?(p=1===s?Ct.a.width:-h.width,u=h.top):(p=c.left,u=c.top),g+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){m=i.firstElementChild;const e=m.querySelector(".ckin__player");if(e){const t=e.firstElementChild;m.append(t),e.remove()}m.style.cssText||(i.classList.remove("active"),this.setFullAspect(m,h,c),i.offsetLeft,i.classList.add("active"))}else m=document.createElement("div"),m.classList.add("media-viewer-aspecter"),i.prepend(m);m.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(g+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=Ct.a.width/2-c.width/2,t=Ct.a.height/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=g;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=Object(ae.a)(),C={onAnimationEnd:L},E=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(E)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",L.resolve()},r),i.classList.remove("opening"),C;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?Io(0,0,n-9/b,a,...s):Io(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}m&&(m.style.borderRadius=f,t&&m.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),m||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(rs.b)(t,s))),i.style.display="",Object(De.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(De.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),m&&this.setFullAspect(m,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),m&&(i.querySelector("video"),i.classList.remove("active"),m.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),C}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=d.map(e=>e*o);let u;u=a?Io(0,0,l-9/s*o,c,...p):Io(9/s*o,0,l,c,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Me.a)(e,"document")){if(Object(Me.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(rs.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(k.a)(this.author.date,Object(oe.d)(t));const s=e.isPeerId();let i;s?i=new Lt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=J.b.wrapEmojiText(e),i.classList.add("peer-title")),Object(k.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||Be.c)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],d=[],h){return yr(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const p="document"===e._,u=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,d,o),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout(()=>{this.listLoader.load(!0)},0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const m=this.content.media,g=!n||n===m;g&&(n=m),this.target={element:n};const v=++this.tempId;m.firstElementChild&&(m.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),ue.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),a.default.isOverlayActive=!0,E.a.checkAnimations(!0),re.IS_MOBILE_SAFARI||j.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const f=this.content.mover,y=Ct.a.width;let w=0;const S=Ct.a.height;S<1e6&&!b.b.isMobile&&(w=120);const L=S-120-w;let I=Promise.resolve();const M=r.a.setAttachmentSize(e,m,y,L,!b.b.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(g){const t=he.a.getCacheContext(e,M.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(I=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),m.append(s))}const P=!(!p||!e.supportsStreaming),T=P?this.preloaderStreamable:this.preloader;let k;if(u){const t=h&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,o=f.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==v&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),T&&T.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),re.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type&&(s.muted=!0,s.autoplay=!0,s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==v)return;(this.videoPlayer=new Oe(s,!0,P)).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(P){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{T.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{Object(c.a)(e)}),e()}this.lazyLoadQueue.unshift({load:()=>{const o=he.a.getCacheContext(e),r=P?Promise.resolve():C.a.downloadDoc(e);return P||i.then(()=>{o.url||T.attach(f,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==v)return void this.log.warn("media viewer changed video");if(t){const e=fe.setSingleMedia(s,h);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}const e=o.url;n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(rs.a)(s,e),this.updateMediaSource(n,e,"video"),l()}),r}})});k=I.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=he.a.getCacheContext(e,M.type),i=p?C.a.downloadDoc(e):r.a.preloadPhoto(e,M);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==v)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(f,t,"img"),b.b.isMobile){const e=f.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(rs.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(De.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(f),this.preloader.setManual()}),i}})});k=I.then(t)}return this.setMoverPromise=k.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var Sr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Lr extends wr{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||Lr.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new Ns(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Hs({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=Yt.getTab(Qt);e&&e.close()}fr.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:i?"discussion":void 0,threadId:i})})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,fr.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&C.a.saveDocFile(e,fr.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new T.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),this.buttons.forward.addEventListener("click",this.onForwardClick),this.author.container.addEventListener("click",this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),t.target.click()}),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=J.b.wrapRichText(t,{entities:e.totalEntities})),g(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return Sr(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e),h="messageService"===e._||!i.a.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach(e=>{e.classList.toggle("hide",h)}),this.wholeDiv.classList.toggle("no-forwards",h);const p=h;[this.buttons.download,this.btnMenuDownload.element].forEach(e=>{e.classList.toggle("hide",p)});const u=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach(e=>{e.classList.toggle("hide",!u)}),this.setCaption(e);const m=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,m}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||m.has(e.mime_type)}}class Cr extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var i;if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const n=(null==e?void 0:e.photoId)||(null===(i=this.current)||void 0===i?void 0:i.photoId);return r.a.getUserPhotos(this.peerId,n,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var Er=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ir extends wr{constructor(e){super(new Cr({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),fr.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return Er(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var Mr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Pr=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach(e=>{e.update()})};function Tr(e,t,s,a,o,l){return Mr(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new Lr).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){!Object(w.f)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new Ir(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",Pr),a.default.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||Pr(e)});const kr=new Map,xr=new Set;class Or extends HTMLElement{constructor(){super(...arguments),this.isDialog=!1,this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;Object(l.b)(this,t=>Mr(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield Tr(this,this.peerId,()=>this.peerId===s),e=!1})))}}disconnectedCallback(){const e=kr.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||kr.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||Be.c;if(this.peerId===e)return;this.peerId=o.a.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||Be.c;if(i){const e=kr.get(i);e&&(e.delete(this),e.size||kr.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!xr.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=kr.get(this.peerId);return e||(e=new Set,kr.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(xr.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}xr.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=kr.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);kr.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?ct({langPackKey:"PinFolderLimitReached"}):new gt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new Xi(vn).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(x.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.mutePeer(this.selectedId,!1)},this.onMuteClick=()=>{i.a.mutePeer(this.selectedId,!0)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new At(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(ft.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=qr.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(x.i18n)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ce(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var Fr,_r=s(147);class Dr{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{hn.a.get("dc").then(e=>{e||(e=dn.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===_r.a.Connected;this.connecting&&s&&ti.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===_r.a.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,de.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(k.a)(this.statusEl,Object(x.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=Dr.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ht.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>ht.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");de.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(Jt.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,de.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(X.b)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(U.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",e=>{console.log(e),this.setConnectionStatus()}),a.default.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,de.b&&this.log("updating",this.updating),this.setState())}),a.default.addEventListener("state_synchronized",e=>{de.b&&this.log("state_synchronized",e),e||(this.updating=!1,de.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Dr.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(x.i18n)(e)),s.addEventListener("click",e=>{Object(c.a)(e),t()}),s}}function jr(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}Dr.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(Fr||(Fr={}));const Br=window.devicePixelRatio,Rr=20*Br,Ur=2.5*Br,Hr=2*Br,Nr=1*Br;function zr(e=!1){const t=document.createElement("canvas");t.width=t.height=Rr;const s=t.getContext("2d"),i=(Rr-(3*Hr+2*Ur))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Date.now(),r=(l=(o-n)%1e3,c=0,d=1e3,-1/2*(Math.cos(Math.PI*l/d)-1)+c);var l,c,d;s.clearRect(0,0,Rr,Rr),s.fillStyle=e&&!b.b.isMobile?Do.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=r>=.5?e%2?2-2*r:2*(r-.5):e%2?2*r:1-2*r;let n=4+8*t;n*=Br;jr(s,i+e*Hr+e*Ur,(Rr-n)/2,Hr,n,Nr,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(os.a)(o),o()},setActive:t=>{e=t,o()}}}var Vr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Kr extends As{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Os(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Wr.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:De.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Gr{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(X.b)("DIALOGS",X.a.Log|X.a.Error|X.a.Warn|X.a.Debug),this.contextMenu=new Ar,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new pn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),P.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount),this.updateContactsLength(!0)},i=new _s({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=Ct.a.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(De.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>this.scroll.loadedAll[e]?(this.loadContacts&&this.loadContacts(),Promise.resolve()):this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e)),this.chatsPreloader=Object(te.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=dt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),ue.IS_TOUCH_SUPPORTED&&Bs({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new x.default.IntlElement({key:"FilterAllChatsShort"}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:this.allChatsIntlElement.element,orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",()=>{M.default.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,P.a.clear(),G.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new T.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(Z.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),M.default.getState().then(e=>this.onStateLoaded(e)),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new Dr(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{le.a.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}setOnlineStatus(e,t){const s=e.classList.contains("is-online");!s&&t&&e.classList.add("is-online"),Object(Jt.a)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove("is-online")},t&&!s?2:0)}initListeners(){a.default.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!P.a.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=P.a.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}}),a.default.addEventListener("chat_update",e=>{const t=e.toPeerId(!0),s=i.a.getDialogOnly(t);s&&this.processDialogForCallStatus(s)}),a.default.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.default.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.default.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.default.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.default.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.default.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.default.addEventListener("dialog_notify_settings",e=>{this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.default.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.default.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{this.setDialogActive(e,!0)})}),a.default.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())}),a.default.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),Os(n.menu,t,s.orderIndex),Os(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Vr(this,void 0,void 0,(function*(){Dt.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.default.storagesResults.dialogs.length&&Mi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Dt.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e);this.setFilterUnreadCount(0)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new T.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Kr(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=J.a.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),t.append(s),Object(se.ripple)(t);Os(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;Os(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{const t=Object.keys(this.filtersRendered).length>1,s=!this.folders.menuScrollContainer.classList.contains("hide");t!==s&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!s&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()},0)})),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>Vr(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=Ct.a.height/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(x._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(x._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=cs.a.getAnimatedEmojiSticker(e);return n?Cs({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new $i(vn).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new x.default.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Object(rs.b)(e,"assets/img/EmptyChats.svg"),Object(De.d)()]).then(([e])=>{s.classList.add("visible"),t.classList.toggle("has-contacts",!!e)}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=P.a.getContacts().then(t=>{const s=this.emptyDialogsPlaceholderSubtitle;if(s){let e,i;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",i=[Object(x.i18n)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",i=[]),s.compareAndUpdate({key:e,args:i})}if(e){this.chatList.parentElement.classList.toggle("has-contacts",!!t.length)}return this.updateContactsLengthPromise=void 0,t.length})}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?fr.setInnerPeer:fr.setPeer).bind(fr);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(ft.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r({peerId:e,lastMsgId:s})}else r()}},{capture:!0}),de.b&&e.addEventListener("dblclick",e=>{const t=Object(ft.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(te.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const p=e.peerId;{let e;if(!t.deleted&&!h){const s=i.a.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),Ss({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(k.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(x.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append(Object(x.i18n)("FromYou")):i.append(new Lt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(k.a)(s.lastTimeSpan,Object(oe.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Dt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(Jt.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(ds.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&Object(ds.a)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const m=s?0:200;if(Object(Jt.a)(t.unreadBadge,"is-visible",d,m,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(Jt.a)(t.mentionsBadge,"is-visible",p,m,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let g=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",g=!1),t.unreadBadge.classList.toggle("unread",g),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e){const t=i.a.getDialogOnly(e);if(!t){const t=e||Be.c;return{peerId:t,peer:o.a.getOutputPeer(t),pFlags:{}}}return t}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=zr(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(Jt.a)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Dt.a.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!vo)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=G.a.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogAndSetLastMessage(e){const{peerId:t,message:s,query:n}=e,a=Wr.addDialogNew(Object.assign(Object.assign(Object.assign({},e),i.a.getMessageSenderPeerIdOrName(s)),{dialog:this.getDialog(t)}));return this.setLastMessage(a.dialog,s,a.dom,n),s.peerId!==t&&(a.dom.listEl.dataset.peerId=""+s.peerId),a}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,c=54,d=!!t,h,p,u){var m,g,b;const v=this.getDialog(e),f=v.peerId,y=new Or;if(y.loadPromises=p,y.lazyLoadQueue=h,y.setAttribute("dialog",r?"1":"0"),void 0!==u&&y.setAttribute("peer-title",u),y.setAttribute("peer",""+f),y.classList.add("dialog-avatar","avatar-"+c),s&&f!==a.default.myId&&f.isUser()){"userStatusOnline"===(null===(m=P.a.getUser(f).status)||void 0===m?void 0:m._)&&this.setOnlineStatus(y,!0)}const w=document.createElement("div");w.classList.add("user-caption");const S=document.createElement("span");S.classList.add("user-title");const L=new Lt.a({peerId:f,fromName:u,dialog:r,onlyFirstName:n,plainText:!1});S.append(L.element),S.classList.add("tgico");const C=o.a.getPeer(f);(null===(g=null==C?void 0:C.pFlags)||void 0===g?void 0:g.verified)&&S.append(Ut());const E=document.createElement("span");E.classList.add("user-last-message"),E.setAttribute("dir","auto");const I=document.createElement("li");I.classList.add("chatlist-chat"),i&&Object(se.ripple)(I),I.append(y,w),I.dataset.peerId=""+f;const M=document.createElement("span");M.classList.add("message-status","sending-status");const T=document.createElement("span");T.classList.add("message-time");const k=document.createElement("div");k.className="dialog-subtitle-badge badge badge-24";const x=document.createElement("p");x.classList.add("dialog-title");const O=document.createElement("span");O.classList.add("dialog-title-details"),O.append(M,T),x.append(S,O);const A=document.createElement("p");A.classList.add("dialog-subtitle"),A.append(E),w.append(x,A);const F={avatarEl:y,captionDiv:w,titleSpan:L.element,titleSpanContainer:S,statusSpan:M,lastTimeSpan:T,unreadBadge:k,lastMessageSpan:E,containerEl:I,listEl:I,subtitleEl:A};if(t){t[l?"append":"prepend"](I)}return d||(I.dialogDom=F,(null===(b=fr.chat)||void 0===b?void 0:b.peerId)===f&&this.setDialogActive(I,!0)),{dom:F,dialog:v}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;const s=t.lastMessageSpan.querySelector(".peer-typing-container"),i=fr.getPeerTyping(e.peerId,s);!s&&i&&(Object(k.a)(t.lastMessageSpan,i),t.lastMessageSpan.classList.add("user-typing"))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const Wr=new Gr;de.a.appDialogsManager=Wr;var qr=t.default=Wr},175:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return c}));var i=s(6),n=s(66),a=s(1),o=s(15),r=s(71);let l=0;function c(e,t=(()=>Promise.resolve()),s=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h=document.createElement("div");h.classList.add("c-ripple");let p;e.classList.contains("rp-square")&&h.classList.add("is-square"),e[c?"prepend":"append"](h);const u=(e,i)=>{const o=Date.now(),r=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");p=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{r.remove()}),s&&s(c)};if(er.classList.add("hiding"),Math.max(s-d/2,0)),setTimeout(t,s)}else r.classList.add("hiding"),setTimeout(t,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",p),p=null,g=!1},t&&t(c),window.requestAnimationFrame(()=>{const t=h.getBoundingClientRect();r.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-a/2,l=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",h.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==h)&&(d===e||!Object(r.a)(t.target,d));let g=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{p&&p()};d.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;let{clientX:s,clientY:i}=t.touches[0];u(s,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(g)return void(g=!1);let{clientX:t,clientY:s}=e;u(t,s),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})},{passive:!0})}},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return a})),s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return r})),s.d(t,"d",(function(){return l}));var i=s(1),n=s(57);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,s={}){const i=s.listenerSetter?s.listenerSetter.add(e):e.addEventListener.bind(e);s.touchMouseDown=!0,i(a,t,s)}function r(e,t,s){e.removeEventListener(a,t,s)}function l(e){Object(n.a)(e,a)}},34:function(e,t,s){"use strict";var i=s(16),n=s(18);t.a=(e,t={})=>{const s=document.createElement(t.asDiv?"div":"button");return s.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&s.classList.add("rp-square"),Object(n.ripple)(s)),t.onlyMobile&&s.classList.add("only-handhelds"),t.disabled&&s.setAttribute("disabled","true"),t.text&&s.append(Object(i.i18n)(t.text)),s}},35:function(e,t,s){"use strict";s.d(t,"f",(function(){return h})),s.d(t,"g",(function(){return p})),s.d(t,"c",(function(){return g})),s.d(t,"d",(function(){return y})),s.d(t,"e",(function(){return w})),s.d(t,"b",(function(){return C})),s.d(t,"a",(function(){return E}));var i=s(29),n=s(5),a=s(30),o=s(38),r=s(1),l=s(0),c=s(15),d=s(49);function h(e,t=!1){const s='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=s,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",s),e.lastElementChild}function p(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,h(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=h;let u=e=>{let t=b.getBoundingClientRect(),{clientX:s,clientY:i}=e,n=s>=t.right?s-t.right:t.left-s,a=i>=t.bottom?i-t.bottom:t.top-i;(n>=100||a>=100)&&g()};const m=e=>{g()},g=()=>{b&&(b.classList.remove("active"),b.parentElement.classList.remove("menu-open"),f&&f.remove(),b=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",u),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{b&&g()});let b=null,v=null,f=null;function y(e,t){g(),l.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),b=e,b.classList.add("active"),b.parentElement.classList.add("menu-open"),f||(f=document.createElement("div"),f.classList.add("btn-menu-overlay"),f.addEventListener(a.a,e=>{Object(n.a)(e),m()})),b.parentElement.insertBefore(f,b),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",u),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},s,i){let{scrollWidth:n,scrollHeight:a}=s;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let d="top";const h={x:{left:e,right:e-n},intermediateX:"right"===i?8:l-n-8,y:{top:t,bottom:t-a},intermediateY:t=8},u={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let e;e=p[i]?h.x[i]:(i="center",h.intermediateX),s.style.left=e+"px"}{let e;e=u[d]?h.y[d]:(d="center",h.intermediateY),s.style.top=e+"px"}s.className=s.className.replace(/(top|center|bottom)-(left|center|right)/g,""),s.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let S=!1,L=0;function C(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,S=!1},400),S=!0}function E(e,t,s){const i=s?s.add(e):e.addEventListener.bind(e),a=s?s.removeManual.bind(s,e):e.removeEventListener.bind(e);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let s;const o={capture:!0},r=()=>{clearTimeout(s),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),s=window.setTimeout(()=>{S?r():(t(a.touches[0]),r(),b&&e.addEventListener("touchend",n.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?s=>{t(s),b&&e.addEventListener("touchend",n.a,{once:!0})}:t)}},46:function(e,t,s){"use strict";s.d(t,"b",(function(){return c})),s.d(t,"a",(function(){return d}));var i=s(1),n=s(37),a=s(83),o=s(77),r=s(5);class l{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(n.b)("SCROLL"+(t?"-"+t:""),n.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class c extends l{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,s=this.lastScrollTop;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",s=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=s,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,s){"use strict";var i=s(29),n=s(0),a=s(37),o=s(8),r=s(5),l=s(39),c=s(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const s=this.navigations.pop();s?(this.manual=!e,this.handleItem(s)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const s=this.navigations[t];if(s.type===e)return{item:s,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(l.e)(this.navigations,e)}removeByType(e,t=!1){for(let s=this.navigations.length-1;s>=0;--s){if(this.navigations[s].type===e&&(this.navigations.splice(s,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(17),n=s(31),a=s(18),o=s(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const s=this.input=document.createElement("input");let r;if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey&&i.default.getState().then(t=>{const a=Object(n.d)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(a):a,this.setValueSilently(o),s.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(o._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,s),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,s){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}s.d(t,"a",(function(){return i}))},57:function(e,t,s){"use strict";function i(e,t){const s=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(s)}s.d(t,"a",(function(){return i}))},60:function(e,t,s){"use strict";function i(e,t){return e.closest(t)}s.d(t,"a",(function(){return i}))},66:function(e,t,s){"use strict";var i=s(44),n=s(45),a=s(29),o=s(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},79:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(1);function n(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(e),a.collapse(!1),a.select()}}},82:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(0);function n(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},86:function(e,t,s){"use strict";var i=s(29),n=s(33);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a,t.a=a}}]); -//# sourceMappingURL=14.6aa9cb644edbb8b0e00a.chunk.js.map \ No newline at end of file diff --git a/public/14.6aa9cb644edbb8b0e00a.chunk.js.map b/public/14.6aa9cb644edbb8b0e00a.chunk.js.map deleted file mode 100644 index 5e928a3cc..000000000 --- a/public/14.6aa9cb644edbb8b0e00a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/poll.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/helpers/eachTimeout.ts","webpack:///./src/environment/geolocationSupport.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/confirmationPopup.ts","webpack:///./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/environment/webrtcSupport.ts","webpack:///./src/environment/callSupport.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/popups/sponsored.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/environment/groupCallSupport.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/components/lineBlobDrawable.ts","webpack:///./src/components/topbarWeave.ts","webpack:///./src/helpers/dom/customProperties.ts","webpack:///./src/lib/rlottie/rlottieIcon.ts","webpack:///./src/components/superIcon.ts","webpack:///./src/components/groupCall/microphoneIcon.ts","webpack:///./src/components/groupCall/participantMutedIcon.ts","webpack:///./src/components/groupCall/index.ts","webpack:///./src/components/groupCall/participantStatus.ts","webpack:///./src/components/groupCall/participantsList.ts","webpack:///./src/components/groupCall/participantVideo.ts","webpack:///./src/components/call/videoCanvasBlur.ts","webpack:///./src/components/groupCall/participantVideos.ts","webpack:///./src/components/groupCall/participants.ts","webpack:///./src/components/groupCall/description.ts","webpack:///./src/components/groupCall/title.ts","webpack:///./src/environment/screenSharingSupport.ts","webpack:///./src/components/call/button.ts","webpack:///./src/components/movableElement.ts","webpack:///./src/helpers/movablePanel.ts","webpack:///./src/lib/calls/callState.ts","webpack:///./src/components/call/description.ts","webpack:///./src/components/groupCall/microphoneIconMini.ts","webpack:///./src/components/topbarCall.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/helpers/roundRect.ts","webpack:///./src/components/groupCallActiveIcon.ts","webpack:///./src/helpers/easing/easeInOutSine.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/components/ripple.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","TelInputField","label","pasted","lastValue","telEl","HTMLInputElement","inputMode","pixelRatio","window","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","remove","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","TrackingMonkey","inputField","max","playAnimation","frame","min","round","idleAnimation","stop","canvas","display","Promise","all","CodeInputField","lastLength","slice","onFill","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","loadedAll","current","loadPromiseUp","loadPromiseDown","dispatchJump","items","item","pop","push","shift","unshift","load","onJump","older","resolve","anchor","promise","loadMore","result","forEach","processed","processItem","onLoadedMore","backLimit","maxId","mid","incrementMessageId","getSearch","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","b","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilter","context","useSearch","reset","removeEventListener","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","setListClickListener","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","setTimeout","focus","res","searchGroup","fromId","addDialogAndSetLastMessage","drawStatus","avatarSize","meAsSaved","err","console","error","replaceContent","catch","placeholder","prevValue","timeout","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","args","init","selectTab","tabs","delete","removeAll","eventListener","dispatchEvent","cleanup","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","open","getContext","clearRect","uploadAvatar","isGeoChat","setTitle","avatarEdit","_upload","section","inputWrapper","groupNameInputField","maxLength","groupLocationInputField","canBeEdited","valueCheck","contains","userLocationCoords","userLocationAddress","nextBtn","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","disabled","createChat","toUserId","chatsSection","nameArgs","new","format","startLocating","userId","dom","addDialogNew","dialog","rippleEnabled","lastMessageSpan","getUserStatusString","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","SHOULD_USE_SAFARI_FIX","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","set","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","go","setTargets","setMedia","getMediaFromMessage","onPause","onEnded","isTrusted","paused","clean","s","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","playbackRate","autoload","pFlags","is_scheduled","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","loadAvatar","cached","getPeerTitle","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","willBePlayedMedia","prev","addMedia","setSearchContext","wasPlaying","willBePlayed","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","decimals","_removeListeners","percents","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","hideControls","showControlsTimeout","isShown","controlsLocked","canHideControls","showControls","setHideTimeout","toggleControls","show","relatedTarget","showOnLeaveToClassName","findUpClassName","visible","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","d","volumeSvg","btn","firstElementChild","video","wrapper","setup","parentNode","appendChild","skin","stylePlayer","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","overlaysActive","good","toggleFullScreen","altKey","onFullScreen","rate","settingsButton","player","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","wrapVoiceMessage","audioEl","out","barHeightMax","mediaSizes","isMobile","minW","maxW","availW","svg","createElementNS","setAttributeNS","timeDiv","waveform","Uint8Array","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","rects","children","audio","lastIndex","ceil","node","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","noAutoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","wrapEmojiText","isRound","mediaChildren","middleware","textContent","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","stateKey","appStateManager","getState","state","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","overlayClosable","avatarEl","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","getChatInviteLink","caption","noDelimiter","changed","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","toggleNoForwards","onChatUpdate","noforwards","loading","loaded","getPromise","checkForTriggers","chatsContainer","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","forceDirection","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","listEl","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","textArgs","getChatFull","chatUpdateListeners","addChatUpdateListener","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","permissionsRow","setPermissionsLength","reduce","acc","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","mutePeer","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","addInitial","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","onFirstSwipe","onSwipeResult","onSwipe","loadCallbacks","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","setPeerStatus","needClear","bio","tagName","getProfileByPeerId","notifications","setMoreDetails","self","setPeerStatusInterval","setInterval","setMoreDetailsTimeout","oldAvatars","setPeer","cleaned","cleanupHTML","setAvatar","getPeerUsername","verified","override","getProfile","userFull","rAbout","wrapRichText","canSetNext","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","times","votersCount","multiplier","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","render","wrapDocument","audioElement","extSplitted","split","ext","isArray","toLowerCase","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","saveDocFile","downloading","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","mutateElement","mutate","onlyThumb","emoji","withThumb","needUpscale","stickerType","sticker","loadLottieWorkers","toneIndex","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","loadAnimationWorker","animationData","saveLottiePreview","data","sendInteractionThrottled","preloadAnimatedEmojiStickerAnimation","getAnimation","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","animationDiv","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","bubble","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","emojiAnimationContainer","throttle","firstTime","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","lottieLoader","blob","URL","createObjectURL","getStickerSet","stickerSet","documents","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","getUserStatusForSort","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","selectedMids","doNotAnimate","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canForward","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","log","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","setLastMessage","elemsToAppend","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","hash","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","sharedMediaDiv","processCallback","processEmptyFilter","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","cleanSearchText","titleSpan","formatPhoneNumber","arg","globalContacts","intlElement","IntlElement","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","addMultipleEventsListeners","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","inputRule","rule","assign","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","phoneSection","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","privacyTab","updateActiveSessions","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hex","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","gridSection","grid","backgroundColor","uploadTempId","clicked","onUploadClick","file","access_hash","dc_id","file_reference","saveDoc","wallpaper","slug","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","cacheStorage","_tempId","onReady","imageUrl","naturalWidth","naturalHeight","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","averageColor","uploadButton","colorButton","resetButton","invokeApiHashable","accountWallpapers","wallpapers","gridContainer","pattern","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","loadStickerSet","installed_date","toggleStickerSet","esgSticker","eachMinute","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","initialValue","minValue","valueDiv","range","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","str","toLocaleTimeString","hour","minute","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","gifsCheckboxField","videosCheckboxField","suggestCheckboxField","bigCheckboxField","loopCheckboxField","stickerSets","renderStickerSet","getAllStickers","allStickers","sets","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","getSelf","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","wrapDraftText","ul","renderMore","_length","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","logOut","phoneDiv","buttonsDiv","edit","folders","general","fillElements","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","confirmationPopup","isLocationWatched","errorCategory","retryBtn","locatedPeers","dialogSize","parseDistance","peopleSection","sortedList","btnMakeVisible","makeButton","btnMakeInvisible","btnCreateGroup","startWatching","stopWatching","distanceUnit","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","lat1","long1","lat2","long2","asin","sqrt","cos","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","openUsername","userName","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","initSearch","archivedCount","unreadDialogsCount","requestPeer","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","getAttribute","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","releaseSinglePeer","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","updated","postKey","replies","leftPart","recent_repliers","getHistoryStorage","channel_id","isUnread","read_max_id","max_id","readMaxId","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","setTime","bubbleContainer","messageDiv","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","timeSpan","inner","clonedArgs","renderReplies","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","floor","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","pack","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","fixEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","Emoji","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","recentStickers","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","categoryPush","menuWrapper","menuScroll","getRecentStickers","pushRecentSticker","inlineResults","setHash","geo","accuracy_radius","botId","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","covered","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","INTERNAL_LINK_TYPE","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowBottom","sticky","overflow","horizontal","visualViewport","windowHeight","innerWidth","innerHeight","chatInvite","request_needed","processUpdateMessage","putPhoto","peopleCount","IGNORE_ACTIONS","SERVICE_AS_REGULAR","TEST_SCROLL","appStickersManager","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","appChatsManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","callDiv","callUser","spoiler","showDuration","useRafs","spoilerTimeout","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","via","peerIdStr","savedFrom","messageId","documentDiv","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","distanceToEnd","getDistanceToEnd","lastScrollDirection","topbar","pinnedMessage","setCorrectIndex","setStickyDateManually","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","deleteEmptyDateGroups","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","MAX","replyAfter","shouldReply","canSend","_target","initMessageReply","highlightBubble","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","sponsoredMessage","random_id","apiManager","invokeApiSingle","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","timestamps","lastVisible","dateMessage","visibleRect","previousStickyDate","needReflow","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","readContents","isMentionUnread","readHistory","bad","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","loadMoreHistory","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","deleteSelectedMids","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","scrollToBubbleEnd","lastDateGroup","getLastDateGroup","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","margin","axis","getNormalSize","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","bubblesToo","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","samePeer","chatType","topMessage","pinnedMessages","isTarget","savedPosition","getChatSavedPosition","getReadMaxIdIfUnread","isJump","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","oldChatInner","lockGroup","lastScrollTop","unlockGroup","fromUp","followingUnread","mountedByLastMsgId","findNextMountedBubbleByMsgId","afterSetPromise","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","Bottom","onScrolledAllDown","getDialogOnly","unread_mark","markDialogUnread","canWrite","queue","setUnreadDelimiter","local","getDateContainerByMessage","addBubble","additionalCallback","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","fwdFrom","nameContainer","processingWebPage","noAutoDownloadMedia","previewResizer","preview","quote","mediaSize","quoteTextDiv","site_name","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","texts","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","renderMessage","isBackLimit","previousScrollHeightMinusTop","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","newScrollTop","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","renderEmptyPlaceholder","addOffset","service","generateLocalMessageId","peer_id","getOutputPeer","saveMessages","side","checkPlaceholders","cacheSeconds","sponsoredMessages","generateLocalFirstMessage","bot_info","checkIfEmptyPlaceholderNeeded","getRenderedLength","realLoadCount","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","safeCount","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","buttonsEl","marginTop","appPollsManager","appDocsManager","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","isTargetAGroupedItem","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","groupedItem","noForwards","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","replyToMsgId","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendAlbum","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","mimeType","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","hidden","onVisible","listType","navigationItem","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","hideOtherHelpers","onChangeScreen","getStickersByEmoticon","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","childNodes","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","listElement","BASE","BASE_CLASS_LIST_ELEMENT","getReadyToSend","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","helpers","toggleListNavigation","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","dataURL","switch_pm","btnSwitchToPM","switchToPM","checkQuery","appWebPagesManager","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","webPage","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","tail","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","onGoDownClick","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","pinnedControlBtn","originalChat","pinnedMessageContainer","neededFakeContainer","getNeededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","isStartButtonNeeded","unread_count","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","updateMessageInput","isAnonymousSending","compareAndUpdate","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","btnClose","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","prevEl","nextEl","attachClick","toggleEl","volumeProgressLineContainer","tunnel","progressWrapper","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","deltaY","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","menuButtons","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","getChannelFull","channelFull","linked_chat_id","getCachedFullChat","onCallClick","chatContextMenuHintWasShown","contactPeerId","attachClickEvent","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","destroy","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","backgroundEl","Log","Warn","Debug","_item","backgroundImage","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","autoDownload","setPrefix","wasAlreadyUsed","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","amplitude","speedScale","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","stateId","createGradient","shader","fillStyle","getGradientFromType","x0","y0","createLinearGradient","MUTED_BY_ADMIN","addColorStop","UNMUTED","MUTED","CONNECTING","dt","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","draw","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","matchMedia","setAmplitude","setCanvasSize","cache","computedStyle","getProperty","getComputedStyle","getPropertyValue","playPart","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","skipAnimation","startFrame","endFrame","frameCount","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","getItem","invoke","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","propertyValue","hexToRgb","getColorByMutedState","generateEqualParts","clearMutedStateModifier","withIcons","icons","iconClassName","element2","actionClassName","instance","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","peerTitle","groupCallParticipantMutedIcon","groupCallParticipantStatus","renderFrame","callVideoCanvasBlur","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","displayPinned","shouldDisplay","shouldDisplayElement","isPinned","setPinned","hasAnyVideo","some","participantElements","participantVideo","getVideoElementFromParticipantByType","setParticipant","_onLengthChange","onOpenProfileClick","popup","getPopup","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","groupCallParticipantsVideo","getGroupCallParticipants","descriptionIntl","mediaDevices","_className","buttonDiv","isConfirm","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","handlers","swipeHandler","resizeHandlerClassName","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setCursor","_width","_height","toggleMovable","movable","movableOptions","setPositionToCenter","destroyElements","raise_hand_rating","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","setThemeColor","movablePanel","isBig","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","CLOSED","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","interval","connectionState","CONNECTED","PENDING","REQUESTING","EXCHANGING_KEYS","connectedAt","appAvatarsManager","onState","hasCurrent","amplitudes","weave","currentDescription","instanceListenerSetter","clearCurrentInstance","callDescription","CLOSING","convertCallStateToGroupState","componentDidMount","componentWillUnmount","groupCallMicrophoneIconMini","interlocutorUserId","CLASS_NAME","throttledMuteClick","weaveContainer","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","backgroundPromises","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","isIDLE","updateStatus","createNewChat","chatsSelectTab","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","stickerWrapper","parse","singleInstance","activateInstance","setToCache","topbarCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","protocol","makeLink","VOICE_CHAT","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","IGNORE_KEYS","isOverlayActive","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","getGroupCallFull","discardCurrentCall","call","saveGroupCall","createGroupCall","broadcastEvent","STATE_INIT","getBackground","setBackground","getFile","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","fromIndex","justReturn","spliced","chatFrom","beforeDestroy","chatIndex","spliceChats","existingIndex","oldChat","setType","dot","eye","getPeerTypings","langPackKeys","private","multi","mapa","typingElement","getTypingElement","descriptionElement","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","onWheel","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","isVideo","useContainerAsTarget","moveTheMover","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","onCaptionClick","cantForwardMessage","cantDownloadMessage","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","isDialog","addedToQueue","oldValue","newPeerId","getPeerMigratedTo","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","groupCallActiveIcon","START_X","startTime","wasMounted","itemProgress","startAnimation","indexKey","appDialogsManager","addListDialog","isBatch","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","changeFiltersAllChatsKey","getDialogIndexKey","hasClassName","getDialogDom","setOnlineStatus","processDialogForCallStatus","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","clientWidth","wasShowing","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","setCallStatus","call_not_empty","getMessageSenderPeerIdOrName","addDialog","fromName","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","create","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","stream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","rippleClickId","attachListenerTo","drawRipple","clickId","elapsedTime","touchStartFired","clickY","isRippleUnneeded","touchEnd","CLICK_EVENT_NAME","detachClickEvent","simulateClickEvent","rippleSquare","putPreloader","returnDiv","setButtonLoader","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","openBtnMenu","positionMenu","menuWidth","menuHeight","windowWidth","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","onCancel","ScrollableBase","logPrefix","onScrollMeasure","needCheckAfterAnimation","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","ScrollableX","splitCount","scrollHorizontally","deltaX","navigations","manual","currentHash","isPossibleSwipe","pushState","handleItem","scrollRestoration","backByItem","noHistory","origin","CheckboxField","stateValue","stateValues","checkSvg","bg","withHover","simulateEvent","kind","scheduleFlush","do","read","write","ignoreTouchCheck","selectNodeContents","createTextRange","textRange","moveToElementText","TouchEvent","currentHashPromise","newHashPromise","password","new_settings","invokeCrypto","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","inputCheckPassword","setUser"],"mappings":"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","file":"14.6aa9cb644edbb8b0e00a.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { forEachReverse } from \"./array\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"./array\";\nimport { safeAssign } from \"./object\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { forEachReverse } from \"./array\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n this.container.addEventListener('click', () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n if(this.isGeoChat){\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length){\r\n appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n }\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n this.peerIds.forEach(userId => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating(){\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { copy, deepEqual } from \"../helpers/object\";\r\nimport { DocumentAttribute, Message, MessageMedia, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\r\n keys.forEach(key => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement) {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n rootScope.dispatchEvent('media_play', {doc: appMessagesManager.getMediaFromMessage(message), message, media});\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n this.playingMedia = media;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { clamp } from \"../helpers/number\";\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport { safeAssign } from \"../helpers/object\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (options: Partial<{noRipple: true, onlyMobile: true, listenerSetter: ListenerSetter, asDiv: boolean}> = {}, direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', buttons: ButtonMenuItemOptions[], onOpen?: (e: Event) => void) => {\r\n options.asDiv = true;\r\n const button = ButtonIcon('more btn-menu-toggle', options);\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport { safeAssign } from \"../object\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected showControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n\n constructor() {\n super(false);\n this.showControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', () => {\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = () => {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.showControlsTimeout) {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.showControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n public btn: HTMLElement;\n protected volumeSvg: HTMLElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n this.btn = document.createElement('div');\n this.btn.classList.add('player-volume');\n\n this.btn.innerHTML = `\n \n `;\n this.btn.classList.add('btn-icon');\n this.volumeSvg = this.btn.firstElementChild as HTMLElement;\n\n this.btn.append(this.container);\n\n attachClickEvent(this.volumeSvg, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n if(!volume || muted) {\n d = `M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z`;\n } else if(volume > .5) {\n d = `M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z`;\n } else if(volume > 0 && volume < .25) {\n d = `M7 9v6h4l5 5V4l-5 5H7z`;\n } else {\n d = `M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z`;\n }\n\n try {\n this.volumeSvg.innerHTML = ``;\n } catch(err) {}\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends ControlsHover {\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n constructor(protected video: HTMLVideoElement, play = false, streamable = false, duration?: number) {\n super();\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused;\n },\n showOnLeaveToClassName: 'media-viewer-caption'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n // this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && code === 'Equal') {\n appMediaPlaybackController.playbackRate += .25;\n } else if(e.altKey && code === 'Minus') {\n appMediaPlaybackController.playbackRate -= .25;\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n \n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = [0.25, 0.5, 1, 1.25, 1.5, 2].map((rate) => {\n return { \n regularText: rate === 1 ? 'Normal' : '' + rate, \n onClick: () => {\n this.video.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n const settingsButton = this.wrapper.querySelector('.settings') as HTMLElement;\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(settingsButton);\n settingsButton.append(btnMenu);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n }\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport { clamp, formatBytes } from \"../helpers/number\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach(mid => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach(elem => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const duration = doc.duration;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(svg, timeDiv);\n\n let waveform = (doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n svg.insertAdjacentHTML('beforeend', html);\n const rects = Array.from(svg.children) as HTMLElement[];\n\n let progress = audioEl.querySelector('.audio-waveform') as HTMLDivElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const onTimeUpdate = () => {\n const lastIndex = audio.currentTime === audio.duration ? 0 : Math.ceil(audio.currentTime / audio.duration * barCount);\n \n //svg.children[lastIndex].setAttributeNS(null, 'fill', '#000');\n //svg.children[lastIndex].classList.add('active'); #Иногда пропускает полоски..\n rects.forEach((node, idx) => node.classList.toggle('active', idx < lastIndex));\n //++lastIndex;\n //console.log('lastIndex:', lastIndex, audio.currentTime);\n //}, duration * 1000 / svg.childElementCount | 0/* 63 * duration / 10 */);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map(s => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map(element => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n onLoad(doc.type !== 'audio' && !this.noAutoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n this.append(downloadDiv);\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(doc.type !== 'audio' && !this.noAutoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport { accumulate } from \"../helpers/array\";\r\nimport { clamp } from \"../helpers/number\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public subtitle: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n havePadding = true;\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n if(options.titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(options.titleRight) {\r\n const titleRight = document.createElement('div');\r\n titleRight.classList.add('row-title', 'row-title-right');\r\n\r\n if(typeof(options.titleRight) === 'string') {\r\n titleRight.innerHTML = options.titleRight;\r\n } else {\r\n titleRight.append(options.titleRight);\r\n }\r\n\r\n c.append(titleRight);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from \"../components/scrollable\";\r\nimport { safeAssign } from \"./object\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { safeAssign } from \"../helpers/object\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { filterUnique, indexOfAndSplice } from \"../helpers/array\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n this.selectedContainer.addEventListener('click', (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n this.chatsContainer.addEventListener('click', (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach(value => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport { deepEqual } from \"../../../helpers/object\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n // @ts-ignore\n if(options.participant && defaultBannedRights.pFlags[mainFlag]) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format('UserRestrictionsDisabled', true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n const chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_type')) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_permissions') && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && appChatsManager.hasRights(this.chatId, 'change_permissions')) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.mutePeer(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { putPreloader, setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void> = new Map();\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n });\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(appProfileManager.getChatFull(peerId.toChatId()));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { User } from \"../layer\";\nimport { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text;\n row.container.style.display = '';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n public avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(public scrollable: Scrollable) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.setAttribute('dialog', '1');\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n appProfileManager.getProfileByPeerId(this.peerId).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n \n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.notifications.container\n );\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n this.notifications.checkboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.mutePeer(this.peerId);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n rootScope.addEventListener('user_update', (userId) => {\n if(this.peerId === userId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self) {\n if(user.phone) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n } else {\n this.phone.container.style.display = 'none';\n }\n }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n if(!this.peerId) return;\n\n const peerId = this.peerId;\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId);\n };\n\n public cleanupHTML() {\n this.bio.container.style.display = 'none';\n this.phone.container.style.display = 'none';\n this.username.container.style.display = 'none';\n this.location.container.style.display = 'none';\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n }\n\n public setAvatar() {\n if(this.peerId !== rootScope.myId) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n const peerId = this.peerId;\n\n this.cleanupHTML();\n\n this.setAvatar();\n\n // username\n if(peerId !== rootScope.myId) {\n let username = appPeersManager.getPeerUsername(peerId);\n if(username) {\n setText(appPeersManager.getPeerUsername(peerId), this.username);\n }\n \n const muted = appNotificationsManager.isPeerLocalMuted(peerId, false);\n this.notifications.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n this.notifications.container.style.display = 'none';\n });\n }\n \n //let membersLi = this.profileTabs.firstElementChild.children[0] as HTMLLIElement;\n if(peerId.isUser()) {\n //membersLi.style.display = 'none';\n\n let user = appUsersManager.getUser(peerId);\n if(user.phone && peerId !== rootScope.myId) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n }\n }/* else {\n //membersLi.style.display = appPeersManager.isBroadcast(peerId) ? 'none' : '';\n } */\n\n this.setMoreDetails();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: true,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public setMoreDetails(override?: true) {\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId) {\n return;\n }\n\n let promise: Promise;\n if(peerId.isUser()) {\n promise = appProfileManager.getProfile(peerId, override).then(userFull => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n if(userFull.rAbout && peerId !== rootScope.myId) {\n setText(userFull.rAbout, this.bio);\n }\n \n //this.log('userFull', userFull);\n return true;\n });\n } else {\n promise = appProfileManager.getChatFull(peerId.toChatId(), override).then((chatFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n if(chatFull.about) {\n setText(RichTextProcessor.wrapRichText(chatFull.about), this.bio);\n }\n\n // @ts-ignore\n if(chatFull?.location?._ == 'channelLocation') {\n // @ts-ignore\n setText(chatFull.location.address, this.location);\n }\n\n return true;\n });\n }\n\n promise.then((canSetNext) => {\n if(canSetNext) {\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n (results.recent_voters || [])/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { readBlobAsText } from '../helpers/blob';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { formatBytes } from '../helpers/number';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport assumeType from '../helpers/assumeType';\r\nimport appMessagesIdsManager from '../lib/appManagers/appMessagesIdsManager';\r\nimport throttle from '../helpers/schedulers/throttle';\r\nimport { SendMessageEmojiInteractionData } from '../types';\r\nimport IS_VIBRATE_SUPPORTED from '../environment/vibrateSupport';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, noAutoDownload, size, searchContext}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = (doc.type !== 'video' || (doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && !isAlbumItem)) \r\n && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos);\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if(preloader && !isUpload) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n preloader.attach(container, false, promise);\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, noAutoDownload, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n \r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, noAutoDownload, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n noAutoDownload,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n needUpscale?: boolean\r\n}): Promise {\r\n const stickerType = doc.sticker;\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((doc.thumbs?.length || doc.stickerCachedThumbs) && !div.firstElementChild && (!downloaded || stickerType === 2 || onlyThumb) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(stickerType === 2 && (withThumb || onlyThumb) && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n return await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(async(json) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) return;\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: json,\r\n width,\r\n height,\r\n name: 'doc' + doc.id,\r\n needUpscale\r\n }, group, toneIndex);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n const data: SendMessageEmojiInteractionData = {\r\n a: [],\r\n v: 1\r\n };\r\n\r\n let sendInteractionThrottled: () => void;\r\n\r\n appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\r\n\r\n attachClickEvent(div, async(e) => {\r\n cancelEvent(e);\r\n const animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n const doc = appStickersManager.getAnimatedEmojiSoundDocument(emoji);\r\n if(doc) {\r\n const audio = document.createElement('audio');\r\n audio.style.display = 'none';\r\n div.parentElement.append(audio);\r\n\r\n try {\r\n await appDocsManager.downloadDoc(doc);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n audio.src = cacheContext.url;\r\n audio.play();\r\n await onMediaLoad(audio, undefined, true);\r\n \r\n audio.addEventListener('ended', () => {\r\n audio.src = '';\r\n audio.remove();\r\n }, {once: true});\r\n } catch(err) {\r\n \r\n }\r\n }\r\n\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji, true);\r\n if(!doc) {\r\n return;\r\n }\r\n \r\n const animationDiv = document.createElement('div');\r\n animationDiv.classList.add('emoji-animation');\r\n\r\n const size = 280;\r\n animationDiv.style.width = size + 'px';\r\n animationDiv.style.height = size + 'px';\r\n\r\n wrapSticker({\r\n div: animationDiv,\r\n doc,\r\n middleware,\r\n withThumb: false,\r\n needFadeIn: false,\r\n loop: false,\r\n width: size,\r\n height: size,\r\n play: true,\r\n group: 'none'\r\n }).then(animation => {\r\n assumeType(animation);\r\n animation.addEventListener('enterFrame', (frameNo) => {\r\n if(frameNo === animation.maxFrame) {\r\n animation.remove();\r\n animationDiv.remove();\r\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\r\n }\r\n });\r\n\r\n if(IS_VIBRATE_SUPPORTED) {\r\n animation.addEventListener('firstFrame', () => {\r\n navigator.vibrate(100);\r\n }, {once: true});\r\n }\r\n });\r\n\r\n const generateRandomSigned = (max: number) => {\r\n const r = Math.random() * max * 2;\r\n return r > max ? -r % max : r;\r\n };\r\n\r\n const bubble = findUpClassName(div, 'bubble');\r\n const isOut = bubble.classList.contains('is-out');\r\n\r\n const randomOffsetX = generateRandomSigned(16);\r\n const randomOffsetY = generateRandomSigned(4);\r\n const stableOffsetX = size / 8 * (isOut ? 1 : -1);\r\n const setPosition = () => {\r\n if(!isInDOM(div)) {\r\n return;\r\n }\r\n \r\n const rect = div.getBoundingClientRect();\r\n /* const boxWidth = Math.max(rect.width, rect.height);\r\n const boxHeight = Math.max(rect.width, rect.height);\r\n const x = rect.left + ((boxWidth - size) / 2);\r\n const y = rect.top + ((boxHeight - size) / 2); */\r\n\r\n const rectX = isOut ? rect.right : rect.left;\r\n\r\n const addOffsetX = (isOut ? -size : 0) + stableOffsetX + randomOffsetX;\r\n const x = rectX + addOffsetX;\r\n // const y = rect.bottom - size + size / 4;\r\n const y = rect.top + ((rect.height - size) / 2) + randomOffsetY;\r\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\r\n animationDiv.style.top = y + 'px';\r\n animationDiv.style.left = x + 'px';\r\n };\r\n\r\n const onScroll = throttleWithRaf(setPosition);\r\n\r\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\r\n\r\n setPosition();\r\n\r\n if(bubble) {\r\n if(isOut) {\r\n animationDiv.classList.add('is-out');\r\n } else {\r\n animationDiv.classList.add('is-in');\r\n }\r\n }\r\n\r\n appImManager.emojiAnimationContainer.append(animationDiv);\r\n\r\n if(!sendInteractionThrottled) {\r\n sendInteractionThrottled = throttle(() => {\r\n const length = data.a.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n const firstTime = data.a[0].t;\r\n \r\n data.a.forEach((a) => {\r\n a.t = (a.t - firstTime) / 1000;\r\n });\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n appMessagesManager.setTyping(appImManager.chat.peerId, {\r\n _: 'sendMessageEmojiInteraction',\r\n msg_id: appMessagesIdsManager.getServerMessageId(+bubble.dataset.mid),\r\n emoticon: emoji,\r\n interaction: {\r\n _: 'dataJSON',\r\n data: JSON.stringify(data)\r\n }\r\n }, true);\r\n \r\n data.a.length = 0;\r\n }, 1000, false);\r\n }\r\n\r\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\r\n if(e.isTrusted) {\r\n data.a.push({\r\n i: 1,\r\n t: Date.now()\r\n });\r\n \r\n sendInteractionThrottled();\r\n }\r\n });\r\n }\r\n\r\n return animation;\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(stickerType === 1) {\r\n const image = new Image();\r\n const thumbImage = div.firstElementChild !== image && div.firstElementChild;\r\n needFadeIn = (needFadeIn || !downloaded || thumbImage) && rootScope.settings.animationsEnabled;\r\n\r\n image.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n renderImageFromUrl(image, cacheContext.url, () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(image);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n image.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n };\r\n \r\n if(cacheContext.url) r();\r\n else {\r\n appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId).then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || stickerType === 2) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && stickerType === 1) {\r\n loadThumbPromise = loadPromise as any;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated) {\r\n return promise\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(json => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: json,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(image, URL.createObjectURL(blob), () => {\r\n container.append(image);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, noAutoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n if(media._ === 'photo') {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, noAutoDownload, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n noAutoDownload,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { insertInDescendSortedArray } from \"./array\";\nimport { getMiddleware } from \"./middleware\";\nimport { safeAssign } from \"./object\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { safeAssign } from \"../helpers/object\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> = {}) {\n super({\n getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || ((element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { safeAssign } from \"../../helpers/object\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.appMessagesManager.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.appMessagesManager.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = (doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n selectionLeft: HTMLDivElement;\n selectionRight: HTMLDivElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-sending') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\n } */\n }\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, getObjectKeysAndSort, safeAssign } from \"../helpers/object\";\nimport { escapeRegExp, limitSymbols } from \"../helpers/string\";\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: () => appMessagesManager.canForward(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.mediaTab.contentTab.childElementCount/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n private processPhotoVideoFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n\n private processDocumentFilter({message, elemsToAppend, inputFilter}: ProcessSearchSuperResult) {\n const document = appMessagesManager.getMediaFromMessage(message);\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n noAutoDownload: true\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n\n private processUrlFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n for(const message of messages) {\n try {\n options.message = message;\n processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n }\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n showMore.addEventListener('click', () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n this.membersList.list.addEventListener('click', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = (appProfileManager.getChatFull(id) as Promise).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = chatFull.participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\ntype PrivacySectionStr = LangPackKey | '';\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const phoneCaption: LangPackKey = 'PrivacyPhoneInfo';\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [phoneCaption, phoneCaption, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTab {\r\n public privacyTab: AppPrivacyAndSecurityTab;\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.privacyTab = this;\r\n tab.authorizations = this.authorizations;\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(numberVisibilityRow.container, lastSeenTimeRow.container, photoVisibilityRow.container, callRow.container, linkAccountRow.container, groupChatsAddRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = 1;\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map(v => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport { clamp } from \"../helpers/number\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach(color => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'color' ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.color = hex.toLowerCase();\r\n background.type = 'color';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n // * set active if type is color\r\n if(background.type === 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(background.color || '#cccccc');\r\n \r\n if(background.type !== 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport { averageColor } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n this.setBackgroundDocument(active.dataset.slug, appDocsManager.getDoc(active.dataset.docId));\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n \r\n this.setBackgroundDocument(wallpaper.slug, wallpaper.document).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n deferred.then(() => {\r\n this.clicked.delete(wallpaper.document.id);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(wallpaper.document.id);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private addWallPaper(wallpaper: WallPaper.wallPaper, append = true) {\r\n if(wallpaper.pFlags.pattern || \r\n !wallpaper.document || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0) {\r\n return;\r\n }\r\n\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n const wrapped = wrapPhoto({\r\n photo: wallpaper.document,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: appPhotosManager.choosePhotoSize(wallpaper.document, 200, 200)\r\n });\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n\r\n if(this.theme.background.type === 'image' && this.theme.background.slug === wallpaper.slug) {\r\n container.classList.add('active');\r\n }\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const {docId, slug} = target.dataset;\r\n if(this.clicked.has(docId)) return;\r\n this.clicked.add(docId);\r\n\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(slug, doc);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (slug: string, doc: MyDocument) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url: string) => {\r\n //const perf = performance.now();\r\n averageColor(url).then(pixel => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n background.slug = slug;\r\n background.type = 'image';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n this.saveToCache(slug, url);\r\n appImManager.applyCurrentTheme(slug, url).then(deferred.resolve);\r\n });\r\n };\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'image' ? this.grid.querySelector(`.grid-item[data-slug=\"${background.slug}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport const averageColor = (imageUrl: string): Promise => {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n resolve(outPixel);\r\n });\r\n });\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(name: LangPackKey, step: number, initialValue: number, minValue: number, maxValue: number) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n valueDiv.innerHTML = '' + initialValue;\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map(row => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('AutoDownloadMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const contactsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadContacts', \r\n name: 'contacts',\r\n stateKey: 'settings.autoDownload.contacts',\r\n withRipple: true\r\n });\r\n const privateCheckboxField = new CheckboxField({\r\n text: 'AutodownloadPrivateChats', \r\n name: 'private',\r\n stateKey: 'settings.autoDownload.private',\r\n withRipple: true\r\n });\r\n const groupsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadGroupChats', \r\n name: 'groups',\r\n stateKey: 'settings.autoDownload.groups',\r\n withRipple: true\r\n });\r\n const channelsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadChannels', \r\n name: 'channels',\r\n stateKey: 'settings.autoDownload.channels',\r\n withRipple: true\r\n });\r\n\r\n container.append(contactsCheckboxField.label, privateCheckboxField.label, groupsCheckboxField.label, channelsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.AutoplayMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const gifsCheckboxField = new CheckboxField({\r\n text: 'AutoplayGIF', \r\n name: 'gifs', \r\n stateKey: 'settings.autoPlay.gifs',\r\n withRipple: true\r\n });\r\n const videosCheckboxField = new CheckboxField({\r\n text: 'AutoplayVideo', \r\n name: 'videos', \r\n stateKey: 'settings.autoPlay.videos',\r\n withRipple: true\r\n });\r\n\r\n container.append(gifsCheckboxField.label, videosCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const container = section('Telegram.InstalledStickerPacksController');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n container[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n container.append(suggestCheckboxField.label, loopCheckboxField.label);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats'\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { deepEqual, copy } from \"../../../helpers/object\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach(o => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') this.onEditOpen();\r\n else this.onCreateOpen();\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarElement from \"../../avatar\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private avatarElem: AvatarElement;\r\n private nameDiv: HTMLElement;\r\n private phoneDiv: HTMLElement;\r\n\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n language: HTMLButtonElement\r\n } = {} as any;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.header.append(btnMenu);\r\n\r\n this.avatarElem = new AvatarElement();\r\n this.avatarElem.setAttribute('clickable', '');\r\n this.avatarElem.classList.add('profile-avatar', 'avatar-120');\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n this.nameDiv = document.createElement('div');\r\n this.nameDiv.classList.add('profile-name');\r\n\r\n this.phoneDiv = document.createElement('div');\r\n this.phoneDiv.classList.add('profile-subtitle');\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const className = 'profile-button btn-primary btn-transparent';\r\n buttonsDiv.append(this.buttons.edit = Button(className, {icon: 'edit', text: 'EditAccount.Title'}));\r\n buttonsDiv.append(this.buttons.folders = Button(className, {icon: 'folder', text: 'AccountSettings.Filters'}));\r\n buttonsDiv.append(this.buttons.general = Button(className, {icon: 'settings', text: 'Telegram.GeneralSettingsViewController'}));\r\n buttonsDiv.append(this.buttons.notifications = Button(className, {icon: 'unmute', text: 'AccountSettings.Notifications'}));\r\n buttonsDiv.append(this.buttons.privacy = Button(className, {icon: 'lock', text: 'AccountSettings.PrivacyAndSecurity'}));\r\n buttonsDiv.append(this.buttons.language = Button(className, {icon: 'language', text: 'AccountSettings.Language'}));\r\n \r\n this.scrollable.append(this.avatarElem, this.nameDiv, this.phoneDiv, buttonsDiv);\r\n this.scrollable.container.classList.add('profile-content-wrapper');\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n this.buttons.folders.addEventListener('click', () => {\r\n new AppChatFoldersTab(this.slider).open();\r\n });\r\n\r\n this.buttons.general.addEventListener('click', () => {\r\n new AppGeneralSettingsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.notifications.addEventListener('click', () => {\r\n new AppNotificationsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.privacy.addEventListener('click', () => {\r\n new AppPrivacyAndSecurityTab(this.slider).open();\r\n });\r\n\r\n this.buttons.language.addEventListener('click', () => {\r\n new AppLanguageTab(this.slider).open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.fillElements();\r\n }\r\n\r\n public fillElements() {\r\n const user = appUsersManager.getSelf();\r\n const peerId = user.id.toPeerId(false);\r\n this.avatarElem.setAttribute('peer', '' + peerId);\r\n\r\n this.nameDiv.append(new PeerTitle({peerId: peerId}).element);\r\n this.phoneDiv.innerHTML = user.phone ? appUsersManager.formatUserPhone(user.phone) : '';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', name);\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find(button => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport type { LazyLoadQueueIntersector } from \"../../lazyLoadQueue\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueueIntersector;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n protected init() {\r\n this.container.classList.add('people-nearby-container');\r\n this.setTitle('PeopleNearby');\r\n\r\n this.errorCategory = document.createElement('div');\r\n this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n const emoji = '🧭';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n stickerContainer.classList.add('sticker-container');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 86,\r\n height: 86,\r\n emoji,\r\n needUpscale: true\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n this.locatedPeers = new Map();\r\n\r\n const m = () => {\r\n const sortedUserList = new SortedUserList({\r\n avatarSize: 42, \r\n createChatListOptions: {\r\n dialogSize: 48,\r\n new: true\r\n },\r\n autonomous: false,\r\n onUpdate: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n const elements: HTMLElement[] = [\r\n this.parseDistance(peer.distance)\r\n ];\r\n\r\n if(!element.id.isUser()) {\r\n elements.push(appProfileManager.getChatMembersString(element.id.toChatId()));\r\n }\r\n\r\n element.dom.lastMessageSpan.textContent = '';\r\n element.dom.lastMessageSpan.append(...join(elements, false));\r\n },\r\n getIndex: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n return 0x7FFFFFFF - peer.distance;\r\n }\r\n });\r\n\r\n appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n return sortedUserList;\r\n };\r\n \r\n const peopleSection = this.peopleSection = new SettingChatListSection({\r\n name: 'PeopleNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const chatsSection = this.chatsSection = new SettingChatListSection({\r\n name: 'ChatsNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const btnMakeVisible = peopleSection.makeButton({\r\n text: 'MakeMyselfVisible',\r\n icon: 'location'\r\n });\r\n\r\n const btnMakeInvisible = peopleSection.makeButton({\r\n text: 'StopShowingMe',\r\n icon: 'location'\r\n });\r\n\r\n const btnCreateGroup = chatsSection.makeButton({\r\n text: 'NearbyCreateGroup',\r\n icon: 'newgroup'\r\n });\r\n\r\n attachClickEvent(btnMakeVisible, () => {\r\n confirmationPopup({\r\n titleLangKey: 'MakeMyselfVisibleTitle',\r\n descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n button: {\r\n langKey: 'OK'\r\n }\r\n }).then(() => {\r\n this.startWatching();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnMakeInvisible, () => {\r\n this.stopWatching();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnCreateGroup, () => {\r\n new AppNewGroupTab(this.slider).open([], true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n btnMakeVisible.classList.add('primary');\r\n btnMakeInvisible.classList.add('danger');\r\n btnCreateGroup.classList.add('primary');\r\n\r\n this.content.append(this.retryBtn);\r\n this.scrollable.append(\r\n stickerContainer,\r\n caption,\r\n peopleSection.container,\r\n chatsSection.container,\r\n this.errorCategory\r\n );\r\n }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach(peer => {\r\n const peerId = appPeersManager.getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatNumber } from \"../../helpers/number\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { FormatterArguments, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLButtonElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n new AppPeopleNearbyTab(this).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername({\n userName: 'TelegramTips'\n });\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, (e) => {\n filteredButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' alpha ' + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n appStateManager.getState().then(state => {\n this.searchGroups.recent.clear();\n \n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n appStateManager.releaseSinglePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n appStateManager.pushToState('recentSearch', recentSearch);\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (e) => {\r\n const message = e;\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('div');\r\n leftPart.classList.add('replies-footer-avatars');\r\n }\r\n\r\n replies.recent_repliers.slice().reverse().forEach((peer, idx) => {\r\n let avatarElem = leftPart.children[idx] as AvatarElement;\r\n if(!avatarElem) {\r\n avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-30');\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n \r\n if(this.loadPromises) {\r\n avatarElem.loadPromises = this.loadPromises;\r\n }\r\n }\r\n \r\n avatarElem.setAttribute('peer', '' + appPeersManager.getPeerId(peer));\r\n \r\n if(!avatarElem.parentNode) {\r\n leftPart.append(avatarElem);\r\n }\r\n });\r\n\r\n // if were 3 and became 2\r\n (Array.from(leftPart.children) as HTMLElement[]).slice(replies.recent_repliers.length).forEach(el => el.remove());\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.append(leftPart);\r\n }\r\n \r\n let text: HTMLElement;\r\n if(replies) {\r\n if(replies.replies) {\r\n text = i18n('Comments', [replies.replies]);\r\n } else {\r\n text = i18n('LeaveAComment');\r\n }\r\n } else {\r\n text = i18n('ViewInChat');\r\n }\r\n\r\n if(replies) {\r\n const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n } else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n }\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport { formatNumber } from \"../../helpers/number\";\nimport { Message } from \"../../layer\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat from \"./chat\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (chat: Chat, message: Message.message | Message.messageService, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => {\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n bubble.classList.add('channel-post');\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n \n if(message.edit_date && chat.type !== 'scheduled' && !message.pFlags.edit_hide) {\n bubble.classList.add('is-edited');\n \n args.unshift(editedSpan = makeEdited());\n }\n \n if(chat.type !== 'pinned' && message.pFlags.pinned) {\n bubble.classList.add('is-pinned');\n \n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n messageDiv.append(timeSpan);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { validateInitObject } from \"../../helpers/object\";\nimport I18n from \"../langPack\";\nimport { isObject } from \"../mtproto/bin_utils\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.sticker === 2) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.sticker === 2,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport { insertInDescendSortedArray } from \"../../helpers/array\";\r\nimport appStateManager from \"./appStateManager\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { safeAssign } from \"./object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED && false;\n\nexport default IS_CALL_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(element: HTMLElement, overflowElement: HTMLElement, lookForSticky?: boolean) {\r\n const rect = element.getBoundingClientRect();\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, bottom: overflowBottom} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowRect.left\r\n || rect.left >= overflowRect.right) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: 0,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: 0\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { addCancelButton } from \".\";\r\nimport { numberThousandSplitter } from \"../../helpers/number\";\r\nimport { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { getObjectKeysAndSort } from \"../../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReplyMarkup, SponsoredMessage, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport { forEachReverse } from \"../../helpers/array\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\n\r\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreadedObserver: IntersectionObserver;\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n \r\n private loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appChatsManager: AppChatsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-sending')) {\r\n bubble.classList.remove('is-sending');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n const scrolledDown = this.scrolledDown;\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n if(scrolledDown) {\r\n this.scrollToBubbleIfLast(mounted.bubble);\r\n }\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n // attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.chat.canSend()) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.chat.canSend()) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n if(false) this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\r\n\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.finishPeerChange();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n });\r\n\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.viewsObserver.unobserve(entry.target);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.chat.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId()),\r\n random_id: sponsoredMessage.random_id\r\n });\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.container.offsetHeight;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.scrollTop += Math.round(part);\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries = (entries: any) => {\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n \r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.scrollTop = needScrollTop;\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\r\n }\r\n\r\n public setStickyDateManually() {\r\n const timestamps = Object.keys(this.dateMessages).map(k => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId)\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n const distanceToEnd = this.scrollable.getDistanceToEnd();\r\n if(!IS_TOUCH_SUPPORTED && this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }\r\n \r\n if(distanceToEnd < 300 && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n\r\n this.setStickyDateManually();\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-sending')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n \r\n this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n let deleted = false;\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n this.onScroll();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)/* && this.chat.setPeerPromise */) {\r\n const dateGroup = bubble.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n return this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering\r\n });\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n private getLastDateGroup() {\r\n let lastTime = 0, lastElem: HTMLElement;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n if(dateMessage.firstTimestamp > lastTime) {\r\n lastElem = dateMessage.container;\r\n lastTime = dateMessage.firstTimestamp;\r\n }\r\n }\r\n\r\n return lastElem;\r\n }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && message.date === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled') {\r\n lastMsgId = 0;\r\n }\r\n\r\n this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let readMaxId = 0, savedPosition: ReturnType;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer) {\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = isJump || chatType === 'scheduled' ? 0 : topMessage;\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollTop = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = savedPosition.top;\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const followingUnread = readMaxId === lastMsgId && !isTarget;\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const isChannel = this.appPeersManager.isChannel(this.peerId);\r\n const canWrite = this.chat.canSend();\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return Promise.resolve();\r\n\r\n return this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => (acc.push(...promises), acc), []);\r\n\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n // this.setStickyDateManually();\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: Message.message | Message.messageService, reverse: boolean) {\r\n if(message.pFlags.local) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._))) {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: Message.message | Message.messageService, reverse = false, multipleRender = false, bubble: HTMLElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n const isMessage = message._ === 'message';\r\n const groupId = isMessage && message.grouped_id;\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(groupId && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(this.peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = '' + message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = '' + message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupId && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(groupId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n \r\n const timeSpan = MessageRender.setTime(this.chat, message, bubble, bubbleContainer, messageDiv);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n const messageWithReplies = isMessage && this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = our && (!fwdFrom || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.height = attachmentDiv.style.height;\r\n bubbleContainer.style.width = attachmentDiv.style.width;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + contact.user_id.toPeerId());\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyChat(peerId) && !this.appPeersManager.isBroadcast(peerId)) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(fwdFrom.from_name);\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!fwdFromId && fwdFrom && fwdFrom.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */fwdFrom.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((fwdFrom && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: (Message.message | Message.messageService | number)[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n //const padding = 10000;\r\n //const realLength = this.scrollable.container.childElementCount;\r\n let previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\r\n //if(realLength > 0/* && (reverse || isSafari) */) { // for safari need set when scrolling bottom too\r\n //if(!this.scrollable.isHeavyScrolling) {\r\n this.messagesQueueOnRender = () => {\r\n const {scrollTop, scrollHeight} = this.scrollable;\r\n\r\n //previousScrollHeight = scrollHeight;\r\n //previousScrollHeight = scrollHeight + padding;\r\n previousScrollHeightMinusTop = reverse ? scrollHeight - scrollTop : scrollTop;\r\n\r\n //this.chatInner.style.paddingTop = padding + 'px';\r\n /* if(reverse) {\r\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\r\n } else {\r\n previousScrollHeightMinusTop = scrollTop;\r\n } */\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\r\n } */\r\n this.messagesQueueOnRender = undefined;\r\n };\r\n //}\r\n //}\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: typeof history[0]) => {\r\n const message: Message.message | Message.messageService = typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n if(message.pFlags.local) {\r\n this.processLocalMessageRender(message);\r\n } else {\r\n this.safeRenderMessage(message, reverse, true);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(previousScrollHeightMinusTop !== undefined) {\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\r\n \r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n this.log('performHistoryResult: will set scrollTop', \r\n previousScrollHeightMinusTop, this.scrollable.scrollHeight, \r\n newScrollTop, this.scrollable.container.clientHeight); */\r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? this.scrollable.scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n \r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\r\n } */\r\n\r\n // touchSupport for safari iOS\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = 'hidden');\r\n this.scrollable.scrollTop = newScrollTop;\r\n //this.scrollable.scrollTop = this.scrollable.scrollHeight;\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = '');\r\n\r\n this.scrollable.lastScrollTop = newScrollTop;\r\n this.scrollable.lastScrollDirection = 0;\r\n\r\n if(IS_SAFARI/* && !isAppleMobile */) { // * fix blinking and jumping\r\n reflowScrollableElement(this.scrollable.container);\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, this.scrollable.scrollTop, this.scrollable.scrollHeight, this.isHeavyAnimationInProgress);\r\n } */\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, isSponsored);\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = this.appPeersManager.getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = this.appMessagesIdsManager.generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = this.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite).show();\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.viewsObserver.observe(button); \r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.chat.canSend() && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const method: 'append' | 'prepend' = isSponsored ? 'append' : 'prepend';\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner[method](bubble);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderMid = message.mid;\r\n // }\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = this.appMessagesIdsManager.generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(this.appMessagesIdsManager.generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): GenerateLocalMessageType {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message], {storage: new Map()});\r\n message.mid = mid;\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'bottom' && this.appPeersManager.isBroadcast(this.peerId)/* && false */) {\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n \r\n const promise = this.getSponsoredMessagePromise = this.chat.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId())\r\n }, {cacheSeconds: 300}).then(sponsoredMessages => {\r\n if(!middleware()) return;\r\n\r\n /* forEachReverse(sponsoredMessages.messages, (message, idx, arr) => {\r\n if(message.chat_invite || message.chat_invite_hash) {\r\n arr.splice(idx, 1);\r\n }\r\n }); */\r\n\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n \r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n if(!sponsoredMessage) {\r\n return;\r\n }\r\n\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n const message = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(() => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n const promise = this.performHistoryResult([message], false, true);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId)) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return this.appProfileManager.getProfile(this.peerId.toUserId()).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 38/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = Object.keys(this.bubbles).length > 0/* || additionMsgId */ ? Math.max(40, pageCount) : pageCount;//const realLoadCount = 50;\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n constructor(private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n const onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(this.element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n if(isSponsored) {\r\n this.buttons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.isSponsored);\r\n });\r\n } else {\r\n this.noForwards = !this.appMessagesManager.canForward(this.message);\r\n\r\n this.buttons.forEach(button => {\r\n let good: boolean;\r\n \r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = contentWrapper || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n \r\n button.element.classList.toggle('hide', !good);\r\n });\r\n }\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(this.element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, side);\r\n openBtnMenu(this.element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n });\r\n };\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private init() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => (this.message as Message.message).pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile((this.message as any).media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || !this.message.pFlags.out) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n\r\n this.element = ButtonMenu(this.buttons, this.chat.bubbles.listenerSetter);\r\n this.element.id = 'bubble-contextmenu';\r\n this.element.classList.add('contextmenu');\r\n this.chat.container.append(this.element);\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n threadId: this.chat.threadId,\r\n replyToMsgId: this.chat.input.replyToMsgId,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n const {sendSilent, scheduleDate} = input;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const replyToMsgId = input.replyToMsgId;\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n replyToMsgId, \n threadId: this.chat.threadId,\n silent: sendSilent, \n scheduleDate,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n caption,\n replyToMsgId,\n threadId: this.chat.threadId,\n isMedia: isMedia,\n silent: sendSilent,\n scheduleDate,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n SetTransition(this.container, 'is-visible', !hide, rootScope.settings.animationsEnabled ? 200 : 0, () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController, protected className: string, onSelect: (target: Element) => boolean | void) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[]) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach(d => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n this.toggle(!data.length);\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getProfileByPeerId(peerId).then(full => {\n if(!middleware()) {\n return;\n }\n\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n const index = new SearchIndex({\n ignoreCase: true\n });\n \n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach(botCommand => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n name: c, \n description: botCommand.description\n });\n\n index.indexObject(botCommand.command, c);\n });\n });\n\n const found = index.search(query);\n const filtered = Array.from(found).map(command => commands.get(command));\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n clearDraft: true,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent,\r\n replyToMsgId: this.chat.input.replyToMsgId\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport { copy } from '../../helpers/object';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLButtonElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n constructor(private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete danger btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public center(animate = false) {\r\n const neededFakeContainer = this.getNeededFakeContainer();\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(this.startParam !== undefined || \r\n !this.chat.canSend() || \r\n this.chat.type === 'pinned' || \r\n this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(this.appPeersManager.canPinMessage(this.chat.peerId) ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n\r\n this.center(false);\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.chat.canSend();\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canWrite;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n const i = I18n.weakMap.get(messageInput) as I18n.IntlElement;\r\n if(i) {\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, 'spoiler')\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = !this.editMessage?.media && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.appWebPagesManager.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n }).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n if(!richValue.trim()) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend('send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {threadId, peerId} = chat;\r\n const {replyToMsgId, noWebPage, sendSilent, scheduleDate} = this;\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n replyToMsgId: replyToMsgId,\r\n threadId: threadId,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n scheduleDate: scheduleDate,\r\n silent: sendSilent,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n silent: sendSilent,\r\n scheduleDate: scheduleDate,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend(flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n isMedia: true, \r\n replyToMsgId: this.replyToMsgId, \r\n threadId: this.chat.threadId,\r\n silent: this.sendSilent, \r\n scheduleDate: this.scheduleDate,\r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n newReply.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { Message } from \"../../layer\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then(needClose => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter(className => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('pprevious active', {noRipple: true});\n const nextEl = ButtonIcon('nnext active', {noRipple: true});\n\n prevEl.innerHTML = ``;\n nextEl.innerHTML = ``;\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n this.wrapperUtils.prepend(this.volumeSelector.btn);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', ({doc, message, media}) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n this.toggleEl.classList.add('flip-icon');\n this.toggle(false);\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_pause', () => {\n this.toggleEl.classList.remove('flip-icon');\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_stop', () => {\n this.toggle(true);\n });\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map(n => +n);\r\n const byDecimal = Array.from('' + number).map(n => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLButtonElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n private verifyCallButton = (type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId) && !!this.appUsersManager.getUser(this.peerId.toUserId()).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, () => {\n this.appMessagesManager.mutePeer(this.peerId);\n });\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(this.appPeersManager.isAnyChat(peerId)) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isBroadcast(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { State } from \"../../lib/appManagers/appStateManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n\n public noAutoDownloadMedia: boolean;\n public noForwards: boolean;\n\n public inited: boolean;\n \n constructor(public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n }\n\n public setBackground(url: string): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n if(theme.background.type === 'color' && document.documentElement.style.cursor === 'grabbing') {\n const _item = this.backgroundEl.lastElementChild as HTMLElement;\n if(_item && _item.dataset.type === theme.background.type) {\n item = _item;\n }\n }\n \n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n item.dataset.type = theme.background.type;\n }\n\n if(theme.background.type === 'color') {\n item.style.backgroundColor = theme.background.color;\n item.style.backgroundImage = 'none';\n }\n\n return new Promise((resolve) => {\n const cb = () => {\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n this.backgroundEl.append(item);\n\n // * одного недостаточно, при обновлении страницы все равно фон появляется неплавно\n // ! с requestAnimationFrame лучше, но все равно иногда моргает, так что использую два фаста.\n fastRaf(() => {\n fastRaf(() => {\n SetTransition(item, 'is-visible', true, 200, prev ? () => {\n prev.remove();\n } : null);\n });\n });\n\n resolve();\n };\n\n if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager, this.appChatsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n this.noForwards = this.appPeersManager.noForwards(peerId);\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n if(startParam === undefined && this.isStartButtonNeeded()) {\n startParam = BOT_START_PARAM;\n }\n\n const result = this.bubbles.setPeer(peerId, lastMsgId, startParam);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n const peerId = this.peerId;\n if(!peerId) {\n return;\n }\n\n let type: keyof State['settings']['autoDownload'];\n\n if(!peerId.isUser()) {\n if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n } else {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n }\n\n this.noAutoDownloadMedia = !rootScope.settings.autoDownload[type];\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange(startParam);\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return this.appPeersManager.isBot(this.peerId) && \n !this.appMessagesManager.getDialogOnly(this.peerId) && \n !this.appMessagesManager.getHistoryStorage(this.peerId).history.length;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { clamp } from \"../../helpers/number\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const selectionTop = selectionRect.top + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n if(document.activeElement !== this.appImManager.chat.input.messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else {\r\n this.setMouseUpEvent();\r\n }\r\n });\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n private handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n private handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render() {\n const className = 'topbar-call-weave';\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map(options => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then(player => {\n return lottieLoader.waitForFirstFrame(player);\n }).then(player => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find(part => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../helpers/noop\";\nimport { safeAssign } from \"../helpers/object\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map(item => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined && this.getColor) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach(item => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private onVideoClick = () => {\n const toggle = toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach(element => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach(element => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from \".\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopup(PopupGroupCall) as PopupGroupCall).getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopup(PopupGroupCall);\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport { ripple } from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { clamp } from \"../helpers/number\";\nimport { safeAssign } from \"../helpers/object\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach(handler => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map(side => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport { safeAssign } from \"./object\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = ('' + instance.duration).toHHMMSS(true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\n// import PopupCall from \"./call\";\nimport type { AppAvatarsManager } from \"../lib/appManagers/appAvatarsManager\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager,\n private appAvatarsManager: AppAvatarsManager,\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('call_instance', ({instance, hasCurrent}) => {\n if(!hasCurrent) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n if(this.instance !== instance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if(!document.body.classList.contains('is-calling') || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopup(PopupGroupCall)) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n }/* else if(this.instance instanceof CallInstance) {\n new PopupCall({\n appAvatarsManager: this.appAvatarsManager,\n appPeersManager: this.appPeersManager,\n instance: this.instance\n }).show();\n } */\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render();\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, Message, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { copy, getObjectKeysAndSort } from '../../helpers/object';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport { numberThousandSplitter } from '../../helpers/number';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport appAvatarsManager from './appAvatarsManager';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise} = {};\n \n private topbarCall: TopbarCall;\n emojiAnimationContainer: HTMLDivElement;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n document.body.append(this.emojiAnimationContainer);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n this.applyCurrentTheme();\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n if(from === ScreenSize.mobile) {\n document.body.append(this.emojiAnimationContainer);\n } else if(to === ScreenSize.mobile) {\n this.columnEl.append(this.emojiAnimationContainer);\n }\n });\n\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid, startParam} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId,\n startParam\n });\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n rootScope.overlaysActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find(typing => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[appMessagesIdsManager.generateMessageId(typing.action.msg_id)];\n if(bubble && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach(a => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n (popup as any).onClose = () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.show();\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager, appAvatarsManager);\n }\n\n /* if(IS_CALL_SUPPORTED) {\n rootScope.addEventListener('call_instance', ({instance, hasCurrent}) => {\n if(hasCurrent) {\n return;\n }\n \n new PopupCall({\n appAvatarsManager,\n appCallsManager,\n appPeersManager,\n instance\n }).show();\n });\n } */\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach(name => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange();\n this.attachKeydownListener();\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer({peerId: nextDialog.peerId});\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return appUsersManager.resolveUsername(userName).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message: Message = appMessagesManager.getMessageByPeer(peerId, threadId);\n if(message._ === 'messageEmpty') {\n lastMsgId = undefined;\n } else {\n appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n /* const call = appCallsManager.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n appCallsManager.startCallInternal(userId, type === 'video'); */\n }\n\n private discardCurrentCall(toPeerId: PeerId) {\n /* if(appCallsManager.currentCall) return this.discardCallConfirmation(toPeerId);\n else if(appGroupCallsManager.groupCall) return this.discardGroupCallConfirmation(toPeerId);\n else return Promise.resolve(); */\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n /* const currentCall = appCallsManager.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appCallsManager.currentCall === currentCall) {\n await currentCall.hangUp();\n }\n } */\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.type === 'image' || (theme.background.type === 'default' && theme.background.slug)) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n theme.background.slug === defaultTheme.background.slug;\n\n if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n const promises = this.chats.map(chat => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !chat.canSend('send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager\n );\n\n if(this.chats.length) {\n chat.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(true));\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n rootScope.dispatchEvent('chat_changing', {from: chatFrom, to: this.chat});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n promise.then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex(chat => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n rootScope.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(RichTextProcessor.wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n this.zoomElements.btnOut.addEventListener('click', () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n this.zoomElements.btnIn.addEventListener('click', () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n this.buttons.download.addEventListener('click', this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n el.addEventListener('click', this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n this.buttons.zoom.addEventListener('click', () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.buttons.close.click();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.buttons.close.click();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n rootScope.isOverlayActive = true;\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer(video, play, supportsStreaming);\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n this.buttons.forward.addEventListener('click', this.onForwardClick);\n this.author.container.addEventListener('click', this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach(button => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach(button => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId || this.current?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport { isObject } from \"../helpers/object\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog = false;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, true);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n a.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: this.allChatsIntlElement.element,\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n\n this.setFilterUnreadCount(0);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n menuTab.append(span);\n ripple(menuTab);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = appUsersManager.getContacts().then(users => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return Promise.resolve();\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object') {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = appDialogsManager.addDialogNew({\n ...options,\n ...appMessagesManager.getMessageSenderPeerIdOrName(message),\n dialog: this.getDialog(peerId),\n });\n\n this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n _dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n if(fromName !== undefined) avatarEl.setAttribute('peer-title', fromName);\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\n }\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.e0b3ee5569e2564c790f.chunk.js b/public/14.e0b3ee5569e2564c790f.chunk.js new file mode 100644 index 000000000..a451f5a83 --- /dev/null +++ b/public/14.e0b3ee5569e2564c790f.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[14],{103:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(5),n=s(40);class a extends n.b{constructor(e={}){super(Object.assign({plainText:!0},e)),this.passwordVisible=!1,this.onVisibilityClick=e=>{Object(i.a)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()};const t=this.input;t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const s=document.createElement("input");s.classList.add("stealthy"),s.tabIndex=-1,s.type="password",t.parentElement.prepend(s),t.parentElement.insertBefore(s.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),this.container.classList.add("input-field-password"),this.container.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}},109:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(79),n=s(85),a=s(0),o=s(40);class r extends o.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let s;a.IS_APPLE?s=-.16*e:a.IS_ANDROID&&(s=0),t.style.setProperty("--letter-spacing",s+"px")}const s=this.setValueSilently.bind(this);this.setValueSilently=e=>{s(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const s=this.value;let i;Math.abs(s.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+s),this.pasted=!1,this.setLabel();let o,r,l,c="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(n.a)(this.value),o=i.formatted,r=i.country,c=i.leftPattern,l=i.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=c,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},110:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(54);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then(e=>(this.animation=e,this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())}),this.passwordInputField.onVisibilityClickAdditional=()=>{this.passwordInputField.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},i.a.waitForFirstFrame(e)))}remove(){this.animation&&this.animation.remove()}}},121:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(54);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const s=e.input;s.addEventListener("blur",()=>{this.playAnimation(0)}),s.addEventListener("input",t=>{this.playAnimation(e.value.length)})}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas.style.display="none"),this.animation.canvas.style.display=""):t=0;const s=this.needFrame>t?-1:1;this.animation.setDirection(s),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([i.a.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then(e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),i.a.waitForFirstFrame(e))),i.a.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then(e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas.style.display="none"),this.animation.addEventListener("enterFrame",e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas.style.display="",this.idleAnimation.play(),this.animation.canvas.style.display="none")}),i.a.waitForFirstFrame(e)))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},122:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(40);class n extends i.b{constructor(e){super(Object.assign({plainText:!0},e));const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let s=0;this.input.addEventListener("input",t=>{this.input.classList.remove("error"),this.setLabel();const i=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(i);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===s)return;s=n})}}},165:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Gr}));var i=s(42),n=s(74),a=s(15),o=s(43),r=s(55),l=s(30),c=s(5),d=s(116),h=s(161),p=s(169);const u=[...h.a].concat([...p.a]);var m=new Set(u);function g(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(38),v=s(104),f=s(39);function y(e){Object(f.d)(e.history,(t,s,i)=>{t.action.photo||(i.splice(s,1),void 0!==e.count&&--e.count)})}var w=s(31);class S{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,Object(w.g)(this,e)}setTargets(e,t,s){this.previous=e,this.next=t,this.reverse=s}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.loadedAllUp=this.loadedAllDown=e,this.loadPromiseUp=this.loadPromiseDown=null}go(e,t=!0){let s,i;if(e>0){if(s=this.next.splice(0,e),i=s.pop(),!i)return;this.previous.push(this.current,...s)}else{if(s=this.previous.splice(this.previous.length+e,-e),i=s.shift(),!i)return;this.next.unshift(...s,this.current)}return this.next.length0),this.current}load(e){if(e&&this.loadedAllDown)return Promise.resolve();if(!e&&this.loadedAllUp)return Promise.resolve();if(e&&this.loadPromiseDown)return this.loadPromiseDown;if(!e&&this.loadPromiseUp)return this.loadPromiseUp;let t;t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0];const s=this.loadMore(t,e,this.loadCount).then(t=>{if(e&&this.loadPromiseDown!==s||!e&&this.loadPromiseUp!==s)return;t.items.length{const s=this.processItem?this.processItem(t):t;s&&(e?this.reverse?this.previous.unshift(s):this.next.push(s):this.reverse?this.next.push(s):this.previous.unshift(s))}),this.onLoadedMore&&this.onLoadedMore()},()=>{}).then(()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null});return e?this.loadPromiseDown=s:this.loadPromiseUp=s,s}}class L extends S{constructor(e={}){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var n;const a=t?0:s;let o=null===(n=this.current)||void 0===n?void 0:n.mid;return e&&(o=e.mid),t||(o=v.a.incrementMessageId(o,1)),i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:s,backLimit:a})).then(e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&y(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history}))},processItem:t=>{if(this.filterMids([t.mid]).length)return e.processItem(t)}})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const s=s=>s.peerId===e&&t.has(s.mid),i=(e,t,i)=>{s(e)&&i.splice(t,1)};Object(f.d)(this.previous,i),Object(f.d)(this.next,i),this.current&&s(this.current)&&this.onEmptied&&this.onEmptied()},this.onHistoryMultiappend=e=>{if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;const t=e[this.searchContext.peerId];if(!t)return;const s=Array.from(t).sort((e,t)=>e-t),i=this.filterMids(s).map(e=>this.processItem(e)).filter(Boolean);i.length&&this.next.push(...i)},this.onMessageSent=({message:e})=>{this.onHistoryMultiappend({[e.peerId]:new Set([e.mid])})},a.default.addEventListener("history_delete",this.onHistoryDelete),a.default.addEventListener("history_multiappend",this.onHistoryMultiappend),a.default.addEventListener("message_sent",this.onMessageSent)}filterMids(e){const t=this.searchContext.isScheduled?i.a.getScheduledMessagesStorage(this.searchContext.peerId):i.a.getMessagesStorage(this.searchContext.peerId);return i.a.filterMessagesByInputFilter(this.searchContext.inputFilter._,e,t,e.length)}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),this.searchContext.useSearch||(this.loadedAllDown=this.loadedAllUp=!0)}reset(){super.reset(),this.searchContext=void 0}cleanup(){this.reset(),a.default.removeEventListener("history_delete",this.onHistoryDelete),a.default.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.default.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0}}var C=s(76),E=s(71),I=s(64),M=s(17),P=s(41),T=s(46),k=s(36),x=s(16);class O{constructor(e,t,s=!0,i,n=!0,a=!0,o){this.name=e,this.type=t,this.clearable=s,this.autonomous=a,this.onFound=o,this.list=qr.createChatList(),this.container=document.createElement("div"),i&&(this.container.className=i),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append(Object(x.i18n)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",n&&qr.setListClickListener(this.list,o,void 0,a)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class A{constructor(e,t,s,i){this.container=e,this.searchInput=t,this.searchGroups=s,this.onSearch=i,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new T.b(this.container),this.listsContainer=this.scrollable.container;for(let e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout(()=>{this.searchMore(),this.searchTimeout=0},0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(let e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,s=""){this.peerId=e,this.threadId=t,this.query!==s&&(this.searchInput.inputField.value=s),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=i.a.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then(t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:s,history:i}=t;i.length&&i[0].mid===this.minMsgId&&i.shift();const n=this.searchGroups.messages;i.forEach(t=>{try{const s=this.peerId?t.fromId:t.peerId;qr.addDialogAndSetLastMessage({peerId:s,container:this.scrollable,drawStatus:!1,avatarSize:54,meAsSaved:!1,message:t,query:e})}catch(e){console.error("[appSearch] render search result",e)}}),n.toggle(),this.minMsgId=i.length&&i[i.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=i.length,-1===this.foundCount&&(this.foundCount=s,n.nameEl&&Object(k.a)(n.nameEl,Object(x.i18n)(s?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[s])),this.onSearch&&this.onSearch(this.foundCount))}).catch(e=>{console.error("search error",e),this.searchPromise=null})}}var F=s(40);class _{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;let e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout(()=>{this.onChange(e)},200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new F.b({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const s=document.createElement("i");s.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(s,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}var D=s(132),j=s(49),B=s(48),R=s(80),U=s(34);var H=(e,t={})=>Object(U.a)("btn-icon",Object.assign({icon:e||void 0},t)),N=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class z{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){this.slider=e,this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=H("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new T.b(this.content,void 0,void 0,!0),this.container.append(this.header,this.content),this.slider.addTab(this),this.listenerSetter=new R.a}close(){return this.slider.closeTab(this)}open(...e){return N(this,void 0,void 0,(function*(){if(this.init)try{const e=this.init();this.init=null,e instanceof Promise&&(yield e)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)}))}init(){}onCloseAfterTimeout(){this.destroyable&&(this.slider.tabs.delete(this),this.container.remove()),this.listenerSetter&&this.listenerSetter.removeAll()}setTitle(e){this.title.innerHTML="",this.title.append(Object(x.i18n)(e))}}class V extends z{constructor(e){super(e),this.eventListener=new B.a}onCloseAfterTimeout(){return this.eventListener.dispatchEvent("destroy"),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{j.a.findItemByType(this.navigationType)?j.a.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,s)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return!1;const i=this.historyTabIds.pop();this.onCloseTab(i,t,s);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof z?n.container:n:this.canHideFirst?-1:0,t),!0},Object(w.g)(this,e),this.tabs||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=Object(D.a)(this.tabsContainer,"navigation",250),this.canHideFirst||this._selectTab(0),Array.from(this.sidebarEl.querySelectorAll(".sidebar-close-button")).forEach(e=>{Object(l.b)(e,this.onCloseBtnClick)})}selectTab(e){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const t=e instanceof z?e:this.tabs.get(e);return t&&(t.onOpen&&t.onOpen(),t.onOpenAfterTimeout&&setTimeout(()=>{t.onOpenAfterTimeout()},250)),j.a.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof z?e.container:e),!0}removeTabFromHistory(e){Object(f.e)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let s=this.historyTabIds.length-1;s>=0;--s){const i=this.historyTabIds[s];if(i!==t){if(i instanceof e)break;this.removeTabFromHistory(i)}}}getTab(e){return this.historyTabIds.find(t=>t instanceof e)}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,s){s||j.a.removeByType(this.navigationType,!0);const i=e instanceof z?e:this.tabs.get(e);i&&(i.onClose&&i.onClose(),i.onCloseAfterTimeout&&setTimeout(()=>{i.onCloseAfterTimeout()},250))}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}}var G=s(51),W=s(139);class q{constructor(e){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),this.container.addEventListener("click",()=>{(new W.a).open(this.canvas,e)})}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}var Q=(e={})=>Object(U.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class $ extends z{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(){this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new pn({}),t=document.createElement("div");t.classList.add("input-wrapper"),this.groupNameInputField=new F.b({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new F.b({label:"ChatLocation",name:"location",canBeEdited:!1}),t.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.groupNameInputField.input.addEventListener("input",()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)}),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.groupNameInputField.value;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;G.a.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),this.peerIds.length&&G.a.inviteToChannel(e,this.peerIds),vn.removeTabFromHistory(this),vn.selectTab(0)})}else this.nextBtn.disabled=!0,G.a.createChat(e,this.peerIds.map(e=>e.toUserId())).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),vn.removeTabFromHistory(this),vn.selectTab(0)})});const s=new pn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=qr.createChatList({new:!0});s.content.append(i),e.content.append(this.avatarEdit.container,t),this.content.append(this.nextBtn),this.scrollable.append(e.container,s.container)}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}open(e,t=!1){this.isGeoChat=t,this.peerIds=e;const s=super.open();return s.then(()=>{t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(x.default.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),this.peerIds.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.list,drawStatus:!1,rippleEnabled:!1,avatarSize:48});t.lastMessageSpan.append(P.a.getUserStatusString(e))})}),s}startLocating(){navigator.geolocation.getCurrentPosition(e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then(e=>e.json()).then(e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)})},e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")})}}var Y=s(88),X=s(37),J=s(32),Z=s(131),ee=s(84),te=s(35),se=s(18),ie=s(99),ne=s(98),ae=s(45),oe=s(59),re=s(0),le=s(54),ce=s(167),de=s(29),he=s(73),pe=s(57),ue=s(1),me=s(113),ge=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const be=(()=>{try{return re.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();const ve=new class{constructor(){if(this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this._volume=1,this._muted=!1,this._playbackRate=1,this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=C.a.getDoc(t.docId);"audio"===s.type&&s.supportsStreaming&&be&&this.handleSafariStreamable(e);const i=he.a.getCacheContext(s);e.src=i.url;const n=this.waitingDocumentsForLoad[s.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[s.id])},this.onPlay=e=>{const t=e.target,s=this.mediaDetails.get(t),{peerId:n,mid:o}=s,r=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop();const e=e=>e.mid===o&&e.peerId===n;if(!this.listLoader.current||!e(this.listLoader.current)){let t,s=this.listLoader.previous.findIndex(e);-1!==s?t=-(this.listLoader.previous.length-s):(s=this.listLoader.next.findIndex(e),-1!==s&&(t=s+1)),-1!==s?t&&this.listLoader.go(t,!1):this.setTargets({peerId:n,mid:o})}this.setMedia(t,r)}setTimeout(()=>{a.default.dispatchEvent("media_play",{doc:i.a.getMediaFromMessage(r),message:r,media:t})},0)},this.onPause=e=>{a.default.dispatchEvent("media_pause")},this.onEnded=e=>{e.isTrusted&&(this.onPause(e),this.next()||(this.stop(),a.default.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(pe.a)(e,"ended");const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const s=t.peerId,i=t.isScheduled?this.scheduled:this.media,n=i.get(s);n&&(n.delete(t.mid),n.size||i.delete(s)),e.remove(),this.mediaDetails.delete(e)}return this.playingMedia=void 0,!0},this.playItem=e=>{const{peerId:t,mid:s}=e,i=this.searchContext.isScheduled;this.getMedia(t,s,i).play(),setTimeout(()=>{this.resolveWaitingForLoadMedia(t,s,i)},0)},this.next=()=>!this.lockedSwitchers&&this.listLoader.go(1),this.previous=()=>{const e=this.playingMedia;return e&&(e.currentTime>5||!this.listLoader.previous.length)?(e.currentTime=0,void this.toggle(!0)):!this.lockedSwitchers&&this.listLoader.go(-1)},this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}a.default.addEventListener("document_downloaded",e=>{const t=this.waitingDocumentsForLoad[e.id];if(t)for(const e of t)this.onMediaDocumentLoad(e)});const e={};["volume","muted","playbackRate"].forEach(t=>{const s="_"+t;e[t]={get:()=>this[s],set:e=>{this[s]!==e&&(this[s]=e,this.playingMedia&&(this.playingMedia[t]=e),this.dispatchPlaybackParams())}}}),Object.defineProperties(this,e)}dispatchPlaybackParams(){const{volume:e,muted:t,playbackRate:s}=this;a.default.dispatchEvent("media_playback_params",{volume:e,muted:t,playbackRate:s})}addMedia(e,t,s){const{peerId:n,mid:o}=e,r=!!e.pFlags.is_scheduled?this.scheduled:this.media;let l=r.get(e.peerId);l||r.set(e.peerId,l=new Map);let c=l.get(o);if(c)return c;const d=i.a.getMediaFromMessage(e);l.set(o,c=document.createElement("round"===d.type||"video"===d.type?"video":"audio")),"round"===d.type&&c.setAttribute("playsinline","true");const h={peerId:n,mid:o,docId:d.id,clean:s,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(c,h),c.volume=1,this.container.append(c),c.addEventListener("play",this.onPlay),c.addEventListener("pause",this.onPause),c.addEventListener("ended",this.onEnded),"audio"!==d.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==a.default.myId&&c.addEventListener("timeupdate",()=>{i.a.readMessages(n,[o])},{once:!0});const p=Object(ae.a)();if(t)p.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let s=t.get(n);s||t.set(n,s=new Map),s.set(o,p)}return p.then(()=>{const e=he.a.getCacheContext(d);if(d.supportsStreaming||e.url)this.onMediaDocumentLoad(c);else{let e=this.waitingDocumentsForLoad[d.id];e||(e=this.waitingDocumentsForLoad[d.id]=new Set),e.add(c),C.a.downloadDoc(d)}}),c}getMedia(e,t,s){const i=(s?this.scheduled:this.media).get(e);return null==i?void 0:i.get(t)}handleSafariStreamable(e){e.addEventListener("play",()=>{const t=e.currentTime;e.addEventListener("progress",()=>{e.currentTime=e.duration-1,e.addEventListener("progress",()=>{e.currentTime=t,e.paused||e.play()},{once:!0})},{once:!0})})}resolveWaitingForLoadMedia(e,t,s){const i=s?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=i.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||i.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var s;return ge(this,void 0,void 0,(function*(){yield Object(me.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=he.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){const s=e.fromId||e.peerId,i=o.a.getPeerPhoto(s);if(i){const n=d.a.loadAvatar(s,i,"photo_small");if(n.cached){const e=yield n.loadPromise;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=x.default.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(re.IS_APPLE?ue.IS_TOUCH_SUPPORTED?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach(e=>{const t=`${e}x${e}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}getMessageByMedia(e){const t=this.mediaDetails.get(e),{peerId:s,mid:n}=t;return t.isScheduled?i.a.getScheduledMessageByPeer(s,n):i.a.getMessageByPeer(s,n)}toggle(e){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!0))}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!Object(w.b)(this.searchContext,e)&&(this.searchContext=Object(w.a)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,s){this.listLoader?this.listLoader.reset():this.listLoader=new L({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{a.default.dispatchEvent("media_stop"),this.stop()}});const i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.load(!1)}setMedia(e,t){this.playingMedia=e,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const s=this.playingMedia,i=this.pause();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};de.a.appMediaPlaybackController=ve;var fe=ve,ye=s(112);function we(e,t,s,i){const n=e=>{s({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),i&&i({x:t.pageX,y:t.pageY,event:t})},o=s=>{0===s.button?(t({x:s.pageX,y:s.pageY,event:s}),n(s),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),s({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},l=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",c,{passive:!1,once:!0}),i&&i({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},c=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",l,{passive:!1,once:!0})};return e.addEventListener("touchstart",c,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",c),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",l)}}class Se{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const s=this.seek=document.createElement("input");s.classList.add("progress-line__seek"),s.type="range",s.step=""+this.step,s.min=""+this.min,s.max=""+this.max,s.value=""+t,t&&this.setProgress(t);const i=""+this.step,n=i.indexOf(".");this.decimals=-1===n?0:i.length-n-1,this.container.append(this.filled,s)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=we(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=Object(I.a)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const s=this.vertical?this.rect.height:this.rect.width,i=Object(I.a)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,s);let n=this.min+i/s*(this.max-this.min);return n-this.min<(this.max-this.min)/2&&(n-=this.step/10),n=+n.toFixed(this.decimals),n=Object(I.a)(n,this.min,this.max),this.setProgress(n),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(n),n}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}const Le=e=>{if(e.element)return e.element;const{icon:t,text:s,onClick:i,checkboxField:n,noCheckboxClickListener:a}=e,o=document.createElement("div");o.className="btn-menu-item"+(t?" tgico-"+t:""),Object(se.ripple)(o);let r=e.textElement;r||(r=e.textElement=s?Object(x.i18n)(s):document.createElement("span"),e.regularText&&(r.innerHTML=e.regularText)),r.classList.add("btn-menu-item-text"),o.append(r);const d=!!n||!!e.keepOpen;return Object(l.b)(o,e=>{Object(c.a)(e);!1!==i(e)&&(d||Object(te.c)(),n&&!a&&(n.checked="radio"===n.input.type||!n.checked))},e.options),n&&o.append(n.label),e.element=o};var Ce=(e,t)=>{const s=document.createElement("div");s.classList.add("btn-menu"),t&&e.forEach(e=>{e.options?e.options.listenerSetter=t:e.options={listenerSetter:t}});const i=e.map(Le);return s.append(...i),s};const Ee=(e,t,s)=>{((null==s?void 0:s.listenerSetter)?s.listenerSetter.add(e):e.addEventListener.bind(e))(l.a,s=>{if(!e.classList.contains("btn-menu-toggle"))return!1;const i=e.querySelector(".btn-menu");Object(c.a)(s),e.classList.contains("menu-open")?Object(te.c)():(t&&t(s),Object(te.d)(i))})};var Ie=(e={},t,s,i)=>{e.asDiv=!0;const n=H("more btn-menu-toggle",e),a=Ce(s,e.listenerSetter);return a.classList.add(t),Ee(n,i,e),n.append(a),n},Me=s(6);class Pe extends B.a{constructor(){super(!1),this.hideControls=()=>{clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0;const e=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!e||this.controlsLocked)return}else if(!e)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.showControlsTimeout?(clearTimeout(this.showControlsTimeout),this.showControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.showControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.showControlsTimeout=0}setup(e){Object(w.g)(this,e);const{listenerSetter:t,element:s}=this;ue.IS_TOUCH_SUPPORTED?t.add(s)("click",()=>{this.toggleControls()}):(t.add(s)("mousemove",()=>{this.showControls()}),t.add(s)("mouseenter",()=>{this.showControls(!1)}),t.add(s)("mouseleave",e=>{e.relatedTarget&&this.showOnLeaveToClassName&&Object(Me.a)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()}))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}var Te=s(111);class ke extends Se{constructor(e,t,s,i){super({step:1e3/60/1e3,min:0,max:1,withTransition:s,useTransform:i},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{let e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let s=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{s=!this.media.paused,s&&this.media.pause()},onMouseUp:e=>{s&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,s=this.media.currentTime;let i=0,n=0;for(let a=0;a=t&&t>=i&&(i=t,n=e.end(a))}const a=this.media.duration?n/this.media.duration:0;this.filledLoad.style.width=100*a+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(fe.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}class xe extends Se{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&Object(c.a)(e),fe.muted=!fe.muted},this.setVolume=()=>{const{volume:e,muted:t}=fe;let s;s=!e||t?"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z":e>.5?"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z":e>0&&e<.25?"M7 9v6h4l5 5V4l-5 5H7z":"M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z";try{this.volumeSvg.innerHTML=``}catch(e){}this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);fe.muted=!1,fe.volume=t}}),this.btn=document.createElement("div"),this.btn.classList.add("player-volume"),this.btn.innerHTML='\n \n ',this.btn.classList.add("btn-icon"),this.volumeSvg=this.btn.firstElementChild,this.btn.append(this.container),Object(l.b)(this.volumeSvg,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("media_playback_params",this.setVolume),this.setVolume()}}class Oe extends Pe{constructor(e,t=!1,s=!1,i){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.listenerSetter=new R.a,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!this.video.paused,showOnLeaveToClassName:"media-viewer-caption"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(i),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new ke(e,s),t.prepend(this.progress.container)}if(t){e.play().catch(t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())}).finally(()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)})}}stylePlayer(e){const{wrapper:t,video:s,skin:i,listenerSetter:n}=this;t.classList.add(i);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===i){const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=String(0|s.duration).toHHMMSS();const l=new xe(n),d=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),ue.IS_TOUCH_SUPPORTED||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.default.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;return"KeyF"===i?this.toggleFullScreen():"KeyM"===i?fe.muted=!fe.muted:"Space"===i?this.togglePlay():e.altKey&&"Equal"===i?fe.playbackRate+=.25:e.altKey&&"Minus"===i?fe.playbackRate-=.25:!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"}),n?(Object(c.a)(e),!1):void 0})),n.add(s)("dblclick",()=>{ue.IS_TOUCH_SUPPORTED||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(Te.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=String(0|s.currentTime).toHHMMSS()}),n.add(s)("play",()=>{t.classList.add("played")},{once:!0}),n.add(s)("pause",()=>{this.showControls(!1)})}n.add(s)("play",()=>{t.classList.add("is-playing")}),n.add(s)("pause",()=>{t.classList.remove("is-playing")}),s.duration||e?r.innerHTML=String(Math.round(s.duration||e)).toHHMMSS():Object(me.e)(s).then(()=>{r.innerHTML=String(Math.round(s.duration)).toHHMMSS()})}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`}setBtnMenuToggle(){const e=[.25,.5,1,1.25,1.5,2].map(e=>({regularText:1===e?"Normal":""+e,onClick:()=>{this.video.playbackRate=e}})),t=Ce(e),s=this.wrapper.querySelector(".settings");t.classList.add("top-left"),Ee(s),s.append(t)}toggleFullScreen(){const e=this.wrapper;if(re.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(Te.d)()?Object(Te.b)():Object(Te.e)(e)}onFullScreen(e){const t=Object(Te.d)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners()}}var Ae=s(124),Fe=s(70),_e=s(94),De=s(44);function je(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(De.b,e)}var Be=s(47);function Re(e){e.classList.add("is-voice");const t=e.message,s=i.a.getMediaFromMessage(t);t.pFlags.out&&e.classList.add("is-out");const n=b.b.isMobile?16:23,a=b.b.isMobile?152:190,o=b.b.isMobile?190:256,r=s.duration,d=Object(I.a)(r/60*o,a,o),h=document.createElementNS("http://www.w3.org/2000/svg","svg");h.classList.add("audio-waveform"),h.setAttributeNS(null,"width",""+d),h.setAttributeNS(null,"height",""+n),h.setAttributeNS(null,"viewBox",`0 0 ${d} ${n}`);const p=document.createElement("div");p.classList.add("audio-time"),e.append(h,p);let u=s.attributes.find(e=>"documentAttributeAudio"===e._).waveform||new Uint8Array([]);u=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let s;try{const i=new DataView(e.buffer);s=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){s=new Uint8Array([])}return s}(u.slice(0,63));const m=Math.max(...u),g=u.length?u.length:100,v=Math.min(d/4|0,g);let f=0;const y=n-4;let w="";for(let e=0,t=0,s=0;e=g){s=s+v-g,s<(v+1)/2&&f\n `,t+=4,f=s<(v+1)/2?0:i}else f{let t=e.audio;const s=()=>{const e=t.currentTime===t.duration?0:Math.ceil(t.currentTime/t.duration*v);S.forEach((t,s)=>t.classList.toggle("active",s0&&t.currentTime!==t.duration)&&s();const i=je(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.readyPromise.then(()=>{let e=!1,s=!1;function i(e){let s;if(e instanceof MouseEvent)s=e.offsetX;else{const t=e.target.getBoundingClientRect();s=e.targetTouches[0].pageX-t.left}const i=s/d*t.duration;t.currentTime=i}L.addEventListener("mouseleave",i=>{e&&(t.play(),e=!1),s=!1}),L.addEventListener("mousemove",t=>{s=!0,e&&i(t)}),L.addEventListener("mousedown",s=>{s.preventDefault(),0===s.button&&(t.paused||t.pause(),i(s),e=!0)}),L.addEventListener("mouseup",i=>{s&&e&&(t.play(),e=!1)}),Object(l.b)(L,e=>{Object(c.a)(e),t.paused||i(e)})},Fe.a),()=>{L.remove(),L=null,t=null}}}function Ue(e=!0){const t=new ye.a({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}a.default.addEventListener("messages_media_read",({mids:e,peerId:t})=>{e.forEach(e=>{const s=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${s}, .media-round.is-unread${s}`)).forEach(e=>{e.classList.remove("is-unread")})})});const He=e=>{let t,s;const i=!e.classList.contains("search-super-item"),n=Object(Me.a)(e,i?"bubbles-inner":"tabs-tab");if(n){const a=':not([data-is-outgoing="1"])',o=".audio:not(.is-voice)"+a;let r;if(r=e.matches(o)?[o]:[".audio.is-voice"+a,".media-round"+a],i){const e=".bubble:not(.webpage) ";r=r.map(t=>e+t)}const l=r.join(", "),c=Array.from(n.querySelectorAll(l)),d=c.indexOf(e),h=c.map(e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid}));t=h.slice(0,d),s=h.slice(d+1)}return[t,s]};class Ne extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new R.a}render(){var e,t;this.classList.add("audio"),this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=i.a.getMediaFromMessage(this.message),n="voice"===s.type,a=!this.voiceAsMusic&&n,o=this.message.pFlags.is_outgoing,r=o&&this.preloader,d=String(0|s.duration).toHHMMSS();this.innerHTML='\n
\n
\n
\n
\n
\n
';const h=this.firstElementChild,p=document.createElement("div");p.classList.add("audio-download");"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),r&&(this.classList.add("is-outgoing"),this.append(p));const u=a?Re(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(_e.a)(n.audioPerformer)),t?a.push(Object(oe.d)(s.date)):a.length||a.push(Object(I.b)(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(x.joinElementsWith)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new Ae.a;l.dataset.fontWeight=e.dataset.fontWeight,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new ke(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.lastChild.replaceWith(s.container))};return e.addAudioListener("play",i),(!e.audio.paused||e.audio.currentTime>0)&&i(),()=>{s.removeListeners(),s.container.remove(),s=null}}}(this),m=this.querySelector(".audio-time");m.innerHTML=d;const g=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=fe.addMedia(this.message,e),s=this.readyPromise=Object(ae.a)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?s.resolve():this.addAudioListener("canplay",()=>s.resolve(),{once:!0}),this.onTypeDisconnect=u();const i=()=>String(0|t.currentTime).toHHMMSS()+(a?" / "+d:""),n=()=>{m.innerText=i(),h.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&n();const o=(e,s=t.paused)=>{if(e&&Object(c.a)(e),s){const e=!!this.searchContext;if(fe.setSearchContext(this.searchContext||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?He(this):[];fe.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,s)}t.play().catch(()=>{})}else t.pause()};return Object(l.b)(h,e=>o(e),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",()=>{h.classList.remove("playing"),m.innerText=d}),this.addAudioListener("timeupdate",()=>{!t.currentTime&&t.paused||fe.isSafariBuffering(t)||(m.innerText=i())}),this.addAudioListener("pause",()=>{h.classList.remove("playing")}),this.addAudioListener("play",n),o};if(null===(e=s.thumbs)||void 0===e?void 0:e.length){const e=[],t=Ss({photo:s,message:null,container:h,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});h.style.width=h.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach(e=>e.classList.add("audio-thumb"))}if(o)r&&(this.dataset.isOutgoing="1",this.preloader.attach(p,!1));else{let e=this.preloader;g("audio"!==s.type&&!this.noAutoDownload);const i=t=>{if(this.audio.src)return;fe.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(fe.willBePlayed(this.audio),re.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=Ue(!1),s=Object(ae.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=Fe.a;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(p,!1,s),e=this.addAudioListener("pause",()=>{s.cancel()},{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then(()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)})}else{e=Ue(),t||(this.readyPromise=Object(ae.a)());const n=()=>{i();const n=C.a.downloadDoc(s);return t||n.then(()=>{this.readyPromise.resolve()}),e.attach(p,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.append(p),this.classList.add("downloading"),this.readyPromise.then(()=>{this.classList.remove("downloading"),p.classList.add("downloaded"),setTimeout(()=>{p.remove()},200),fe.willBePlayedMedia===this.audio&&(this.audio.play(),fe.willBePlayed(void 0))})};(null===(t=this.audio)||void 0===t?void 0:t.src)||("audio"===s.type||this.noAutoDownload?Object(l.b)(h,()=>{i(!0)},{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}):i(!1))}}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter.removeAll(),this.listenerSetter=null,this.preloader=null)}}customElements.define("audio-element",Ne);class ze{constructor(e,t){this.className=e,this.fill=t,this.container=document.createElement("div"),this.container.className=e,this.border=document.createElement("div"),this.border.classList.add(e+"-border"),this.content=document.createElement("div"),this.content.classList.add(e+"-content"),this.title=document.createElement("div"),this.title.classList.add(e+"-title"),this.title.setAttribute("dir","auto"),this.subtitle=document.createElement("div"),this.subtitle.classList.add(e+"-subtitle"),this.subtitle.setAttribute("dir","auto"),this.content.append(this.title,this.subtitle),this.container.append(this.border,this.content)}}function Ve(e){var t,s;let{title:n,titleEl:a,subtitle:o,subtitleEl:l,mediaEl:c,message:d,loadPromises:h}=e;void 0!==n&&("string"==typeof n&&(n=Object(Y.f)(n,140),n=J.a.wrapEmojiText(n)),Object(k.a)(a,n)),h||(h=[]);let p=d&&d.media,u=!1,m=!1;const g=c?Array.from(c.children).slice():[];let b;if(p&&c){if(l.textContent="",l.append(i.a.wrapMessageForReply(d,void 0,void 0,void 0,void 0,!0)),p.webpage&&(p=p.webpage),p.photo||p.document&&(null===(t=p.document.thumbs)||void 0===t?void 0:t.length)){b=fr.chat.bubbles.getMiddleware();const e=fr.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Cs({doc:p.document,div:c,lazyLoadQueue:e,group:gr,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;m="round"===t.type;try{Ss({photo:t,container:c,boxWidth:32,boxHeight:32,size:r.a.choosePhotoSize(t,32,32),middleware:b,lazyLoadQueue:e,noBlur:!0,withoutPreloader:!0,loadPromises:h}),u=!0}catch(e){}}}}else d?(l.textContent="",l.append(i.a.wrapMessageForReply(d))):("string"==typeof o&&(o=Object(Y.f)(o,140),o=J.a.wrapEmojiText(o)),Object(k.a)(l,o||""));return Promise.all(h).then(()=>{b&&!b()||(g.forEach(e=>e.remove()),c&&c.classList.toggle("is-round",m))}),u}class Ke extends ze{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ve({title:e,titleEl:this.title,subtitle:t,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s});this.container.classList.toggle("is-media",i),i?this.content.prepend(this.mediaEl):this.mediaEl.remove()}),this.className=e}}const Ge=0,We=1,qe=2,Qe=4,$e=8;class Ye{constructor(e,t,s,i,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=s,this.spacing=i,this.maxHeight=n,this.count=e.length,this.ratios=Ye.countRatios(e),this.proportions=Ye.countProportions(this.ratios),this.averageRatio=Object(f.a)(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new Xe(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:$e|Qe|qe}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:We|$e|Qe},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:We|qe|Qe}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),s=this.maxWidth-t-this.spacing,i=Math.min(this.maxHeight,Math.round(Math.min(s/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:s,height:i},sides:We|$e|Qe},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:We|qe|Qe}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),s=e-t-this.spacing,i=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],s*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-i);return[{geometry:{x:0,y:0,width:n,height:e},sides:We|$e|Qe},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:We|qe},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:Qe|qe}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=(this.maxWidth-this.spacing)/2,i=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(s/this.ratios[1],s/this.ratios[2]))),n=e-s-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:Qe|$e},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:Qe|qe}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),s=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),i=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),s*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),s*this.ratios[3])),a=e-i-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,s);return[{geometry:{x:0,y:0,width:e,height:t},sides:$e|We|qe},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:Qe|$e},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:Qe},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:qe|Qe}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),s=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),i=Math.round(s/this.ratios[1]),n=Math.round(s/this.ratios[2]),a=e-i-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,s));return[{geometry:{x:0,y:0,width:t,height:e},sides:We|$e|Qe},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:We|qe},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:qe},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:Qe|qe}]}static countRatios(e){return e.map(e=>e.w/e.h)}static countProportions(e){return e.map(e=>e>1.2?"w":e<.8?"n":"q").join("")}}class Xe{constructor(e,t,s,i,n,a=4*s/3){this.averageRatio=t,this.maxWidth=s,this.minWidth=i,this.spacing=n,this.maxHeight=a,this.ratios=Xe.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(I.a)(e,1,2.75):Object(I.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=this.ratios.slice(e,e+t),i=Object(f.a)(s,0);return(this.maxWidth-(t-1)*this.spacing)/i},i=e=>{let i=[],n=0;for(let t of e)i.push(s(n,t)),n+=t;t.push({lineCounts:e,heights:i})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||i([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const s=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||s>3||i([e,t,s])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let s=1;s!==this.count-e-t;++s){const n=this.count-e-t-s;e>3||t>3||s>3||n>3||i([e,t,s,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:s}=e,i=s.length,o=Object(f.a)(t,0)+this.spacing*(i-1),r=Math.min(...t),l=(Math.max(...t),r{for(let e=1;e!==i;++e)if(s[e-1]>s[e])return 1.5;return 1})(),d=Math.abs(o-this.maxHeight)*l*c;(!n||d{if(this.uploadAvatar)return!0;let e=0,t=0,s=0;return this.inputFields.forEach(i=>{i.isValid()&&(i.isChanged()&&++e,i.required&&++s),i.required&&++t}),t===s&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},Object(w.g)(this,e),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=Q({icon:"check"}),e.withoutAvatar||(this.avatarElem=document.createElement("avatar-element"),this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.setAttribute("peer",""+this.peerId),e.doNotEditAvatar||(this.avatarEdit=new q(e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach(e=>{this.listenerSetter.add(e.input)("input",this.handleChange)}),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach(t=>t.input.toggleAttribute("disabled",e)),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then(()=>{t&&(this.disabled=!1)},()=>{this.disabled=!1})}}function tt(e,t){const s=document.createElement("form");return e.forEach(e=>{const{container:i,input:n}=e;s.append(i),n.addEventListener("change",e=>{n.checked&&t(n.value,e)})}),s}class st{constructor(e={}){this.freezed=!1,this.container=document.createElement(e.radioField||e.checkboxField?"label":"div"),this.container.classList.add("row"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("row-subtitle"),this.subtitle.setAttribute("dir","auto"),e.subtitle?"string"==typeof e.subtitle?g(this.subtitle,e.subtitle):this.subtitle.append(e.subtitle):e.subtitleLangKey&&this.subtitle.append(Object(x.i18n)(e.subtitleLangKey,e.subtitleLangArgs)),this.container.append(this.subtitle);let t=!!e.havePadding;if(e.radioField||e.checkboxField){if(t=!0,e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label)),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):this.container.append(this.checkboxField.label),e.noCheckboxSubtitle||t||this.checkboxField.input.addEventListener("change",()=>{Object(k.a)(this.subtitle,Object(x.i18n)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))})}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;if(e.titleRight?(t=document.createElement("div"),t.classList.add("row-title-row"),this.container.append(t)):t=this.container,this.title=document.createElement("div"),this.title.classList.add("row-title"),this.title.setAttribute("dir","auto"),e.title?this.title.innerHTML=e.title:this.title.append(Object(x.i18n)(e.titleLangKey)),t.append(this.title),e.titleRight){const s=document.createElement("div");s.classList.add("row-title","row-title-right"),"string"==typeof e.titleRight?s.innerHTML=e.titleRight:s.append(e.titleRight),t.append(s)}}e.icon&&(t=!0,this.title.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),t&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&this.container.addEventListener("click",t=>{this.freezed||e.clickable(t)}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||Object(se.ripple)(this.container,void 0,void 0,!0))}}const it=(e,t)=>tt(e.map(e=>({container:e.container,input:e.radioField.input})),t);function nt(e){navigator.clipboard?navigator.clipboard.writeText(e):function(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}(e)}var at=s(61);class ot{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field");const s=this.input=document.createElement("input");s.type="radio",s.name="input-radio-"+e.name,e.value&&(s.value=e.value,e.stateKey&&(M.default.getState().then(t=>{s.checked=Object(w.d)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{M.default.setByKey(e.stateKey,e.value)})));const i=this.main=document.createElement("div");i.classList.add("radio-field-main"),e.text?i.innerHTML=e.text:e.langKey&&Object(x._i18n)(i,e.langKey),t.append(s,i)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}const rt=document.createElement("div");function lt(e){Object(k.a)(rt,e),document.body.append(rt),rt.dataset.timeout&&clearTimeout(+rt.dataset.timeout),rt.dataset.timeout=""+setTimeout(()=>{rt.remove(),delete rt.dataset.timeout},3e3)}function ct(e){lt(Object(x.i18n)(e.langPackKey))}function dt(e,t,s=!0,i=!0){let n,a,o,r,l=!1;return(...c)=>(a||(a=new Promise((e,t)=>(o=e,r=t))),n?(clearTimeout(n),l=!0,r(),a=new Promise((e,t)=>(o=e,r=t))):s&&(o(e(...c)),l=!1),n=setTimeout(()=>{!i||s&&!l||o(e(...c)),n=a=o=r=void 0,l=!1},t),a.catch(()=>{}),a)}rt.classList.add("toast");var ht=s(33);class pt extends F.b{constructor(e){super(e),this.checkUsernameDebounced=dt(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",()=>{const e=this.getValue();if(e===this.originalValue||!e.length)return this.setState(F.a.Neutral,this.options.label),void(this.options.onChange&&this.options.onChange());J.b.isUsernameValid(e)?this.setState(F.a.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?this.options.onChange&&this.options.onChange():this.checkUsernameDebounced(e)})}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){this.checkUsernamePromise||(this.options.peerId?this.checkUsernamePromise=ht.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ht.a.invokeApi("account.checkUsername",{username:e}),this.checkUsernamePromise.then(t=>{this.getValue()===e&&(t?this.setState(F.a.Valid,this.options.availableText):this.setError(this.options.takenText))},t=>{if(this.getValue()===e)switch(t.type){case"USERNAME_INVALID":this.setError(this.options.invalidText)}}).then(()=>{this.checkUsernamePromise=void 0,this.options.onChange&&this.options.onChange();const t=this.getValue();t!==e&&this.isValidToChange()&&J.b.isUsernameValid(t)&&this.checkUsername(t)}))}}var ut=s(58),mt=s(50);class gt extends ut.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(ut.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){let e=new Or;e.setAttribute("dialog","1"),e.setAttribute("peer",""+t.peerId),e.classList.add("avatar-32"),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append(Object(x.i18n)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const s=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append(Object(x.i18n)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new mt.a(e);e.checkboxField=t,s.append(t.label)}),t.buttons.forEach(e=>{if(e.callback){const s=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach(t=>{t.checkboxField.checked&&e.add(t.text)}),s(e)}}})),this.container.insertBefore(s,this.header.nextElementSibling)}}var bt=s(53);class vt extends V{init(){this.container.classList.add("edit-peer-container","group-type-container");const e=G.a.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new pn({name:e?"ChannelType":"GroupType"}),s=Object(at.b)(),i=new st({radioField:new ot({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new st({radioField:new ot({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=it([i,o],e=>{const t=[d,u];"public"===e&&t.reverse(),t[0].container.classList.remove("hide"),t[1].container.classList.add("hide"),g()}),c=G.a.getChat(this.chatId);t.content.append(r);const d=new pn({}),h=new st({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{nt(this.chatFull.exported_invite.link),lt(x.default.format("LinkCopied",!0))}}),p=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new gt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(bt.a)([p],!0);n.default.getChatInviteLink(this.chatId,!0).then(t=>{e(),h.title.innerHTML=t})}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()},{listenerSetter:this.listenerSetter}),d.content.append(h.container,p);const u=new pn({caption:e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup",noDelimiter:!0}),m=document.createElement("div");m.classList.add("input-wrapper");const g=()=>{const e=i.radioField.checked&&"t.me/"!==v||b.isValidToChange()&&b.input.classList.contains("valid");f.classList.toggle("is-visible",e)},b=new pt({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:g,peerId:this.chatId.toPeerId(!0),head:"t.me/"}),v="t.me/"+(c.username||"");m.append(b.container),u.content.append(m);const f=Q({icon:"check",className:"is-visible"});this.content.append(f),Object(l.b)(f,()=>{Object(te.g)(f);const e=o.radioField.checked?b.getValue():"";G.a.migrateChat(this.chatId).then(t=>G.a.updateUsername(t,e)).then(()=>{this.close()})},{listenerSetter:this.listenerSetter}),("t.me/"!==v?o:i).radioField.checked=!0,b.setOriginalValue(v),this.scrollable.append(t.container,d.container,u.container);{const t=new pn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new mt.a({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.toggleNoForwards(this.chatId,s.checked).then(()=>{e()})});const i=()=>{s.setValueSilently(!!c.pFlags.noforwards)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&i()}),i(),t.content.append(s.label),this.scrollable.append(t.container)}}}var ft=s(60);class yt{constructor(e){this.loading=!1,this.loaded=!1,Object(w.g)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then(e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()},()=>{this.promise=void 0,this.loading=!1})))}}var wt=s(83),St=s(100),Lt=s(52),Ct=s(96),Et=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class It{constructor(e){this.container=document.createElement("div"),this.list=qr.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize=48,this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=null),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(let e in this.tempIds)++this.tempIds[e];this.list=qr.createChatList(),this.promise=null,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},Object(w.g)(this,e),this.container.classList.add("selector");const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>(this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter(e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t}),this.filterPeerTypeBy&&(e=e.filter(e=>{if(e.isPeerId()){if(!o.a.getPeer(e).deleted)return this.filterPeerTypeBy.find(t=>o.a[t](e))}return!0})),t(e)),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?Object(x._i18n)(this.input,this.placeholder,void 0,"placeholder"):Object(x._i18n)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new pn({});e.innerContainer.classList.add("selector-search-section");let t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new T.b(t),this.selectedContainer.addEventListener("click",e=>{if(this.freezed)return;let t=e.target;if(t=Object(Me.a)(t,"selector-user"),!t)return;const s=t.dataset.key,i=this.chatsContainer.querySelector('[data-peer-id="'+s+'"]');i?i.click():this.remove(s.toPeerId())}),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const s=new pn({name:this.sectionNameLangPackKey,noShadow:!0});s.content.append(this.list),this.chatsContainer.append(s.container),this.scrollable=new T.b(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),this.chatsContainer.addEventListener("click",e=>{const t=Object(St.a)(e.target,"data-peer-id");if(Object(c.a)(e),!t)return;if(this.freezed)return;let s=t.dataset.peerId;if(s=s.isPeerId()?s.toPeerId():s,!this.multiSelect)return void this.add(s);this.selected.has(s)?this.remove(s):this.add(s);const i=t.querySelector("input");i.checked=!i.checked});const i=dt(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(mn()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout(()=>{let t=this.getMoreResults();e.onFirstRender&&t.then(()=>{e.onFirstRender()})},0)}renderSaved(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!P.a.testSelfSearch(this.query)||this.renderResultsFunc([a.default.myId])}getTempId(e){return void 0===this.tempIds[e]&&(this.tempIds[e]=0),++this.tempIds[e]}getMoreDialogs(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=Ct.a.height/72*1.25|0,t=this.getTempId("dialogs"),s=i.a.getConversations(this.query,this.offsetIndex,e,this.folderId,!0).promise;this.promise=s;const n=yield s;if(this.tempIds.dialogs!==t)return;this.promise=null;let o=n.dialogs;if(o.length){const e=o[o.length-1].index||0;o=o.slice(),o.findAndSplice(e=>e.peerId===a.default.myId),this.chatRightsAction&&(o=o.filter(e=>this.filterByRights(e.peerId))),this.renderSaved(),this.offsetIndex=e}if(this.renderResultsFunc(o.map(e=>e.peerId)),n.isEnd){if(!this.loadedWhat.dialogs)return this.renderSaved(),this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs();if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return e.isUser()&&("send_messages"!==this.chatRightsAction||P.a.canSendToUser(e))||G.a.hasRights(e.toChatId(),this.chatRightsAction)}getMoreContacts(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const t=this.getTempId("contacts"),s=Promise.all([e?P.a.getContactsPeerIds(this.query):[],this.query?P.a.searchContacts(this.query):void 0]);this.promise=s;let[i,n]=yield s;if(this.tempIds.contacts!==t)return;if(n){let t=e?n.my_results.concat(n.results):n.my_results;this.chatRightsAction&&(t=t.filter(e=>this.filterByRights(e))),this.peerType.includes("dialogs")||(t=t.filter(e=>e.isUser())),this.cachedContacts=Object(f.b)(i.concat(t))}else this.cachedContacts=i.slice();Object(f.e)(this.cachedContacts,a.default.myId),this.promise=null}const t=Ct.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return Et(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.channelParticipants)return;const e=this.getTempId("channelParticipants"),t=n.default.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount),s=yield t;if(this.tempIds.channelParticipants!==e)return;const i=s.participants.map(e=>G.a.getParticipantPeerId(e));Object(f.e)(i,a.default.myId),this.renderResultsFunc(i),(this.list.childElementCount>=s.count||s.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){const e=(()=>{const e=[];return!this.peerType.includes("dialogs")||this.loadedWhat.archived||(e.push(this.getMoreDialogs()),this.loadedWhat.archived)?(!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts||e.push(this.getMoreContacts()),this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants&&e.push(this.getMoreChannelParticipants()),e):e})(),t=Promise.all(e);return e.length&&t.then(this.checkForTriggers),t}renderResults(e){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=e.filter(e=>P.a.isNonContactUser(e))),e.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.scrollable,drawStatus:!1,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const s=this.selected.has(e),i=new mt.a;s&&(i.input.checked=!0),t.containerEl.prepend(i.label)}let s;s=e.isAnyChat()?n.default.getChatMembersString(e.toChatId()):e===a.default.myId?Object(x.i18n)(this.selfPresence):P.a.getUserStatusString(e),t.lastMessageSpan.append(s)})}add(e,t,s=!0){if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const i=document.createElement("div");i.classList.add("selector-user","scale-in");const n=document.createElement("avatar-element");return n.classList.add("selector-user-avatar","tgico"),n.setAttribute("dialog","1"),n.classList.add("avatar-32"),i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Lt.a({peerId:e.toPeerId(),dialog:!0}).element),n.setAttribute("peer",""+e)),t&&("string"==typeof t?i.innerHTML=t:(Object(k.a)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",n),this.selectedContainer.insertBefore(i,this.input),this.onChange&&this.onChange(this.selected.size),s&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),i}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const s=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};a.default.settings.animationsEnabled?t.addEventListener("animationend",s,{once:!0}):s()}getSelected(){return[...this.selected]}addInitial(e){e.forEach(e=>{this.add(e,void 0,!1)}),window.requestAnimationFrame(()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:wt.a.Static})})}}var Mt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Pt extends ut.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new It({appendTo:this.body,onChange:()=>Mt(this,void 0,void 0,(function*(){const t=this.selector.getSelected(),s=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(s);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()})),peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),ue.IS_TOUCH_SUPPORTED||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:46,peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence}),this.title.append(this.selector.input)}}class Tt extends V{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new pn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=qr.createChatList({new:!0});s.append(i);const{dom:n}=qr.addDialogNew({dialog:this.userId.toPeerId(!1),container:i,drawStatus:!1,rippleEnabled:!0,avatarSize:48});n.lastMessageSpan.append(P.a.getUserStatusString(this.userId));const a=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0});e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&Object(w.b)(this.participant.banned_rights.pFlags,e.pFlags)||G.a.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new pn({});if("channelParticipantBanned"===this.participant._){const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});Object(l.b)(s,()=>{const t=Object(bt.a)([s],!0);G.a.clearChannelParticipantBannedRights(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()},()=>{t()})},{listenerSetter:this.listenerSetter}),t.content.append(s)}const s=Object(U.a)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});Object(l.b)(s,()=>{Object(bt.a)([s],!0);G.a.kickFromChannel(this.chatId,this.participant).then(()=>{this.eventListener.removeEventListener("destroy",e),this.close()})},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container)}}}var kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class xt{constructor(e){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const t=G.a.getChat(e.chatId).default_banned_rights,s=e.participant?G.a.combineParticipantBannedRights(e.chatId,e.participant.banned_rights):t;for(const i of this.v){const n=i.flags[0];i.checkboxField=new mt.a({text:i.text,checked:G.a.hasRights(e.chatId,n,s),restriction:!0,withRipple:!0}),e.participant&&t.pFlags[n]&&(i.checkboxField.input.disabled=!0,Object(l.b)(i.checkboxField.label,e=>{lt(x.default.format("UserRestrictionsDisabled",!0))},{listenerSetter:e.listenerSetter})),this.toggleWith[n]&&e.listenerSetter.add(i.checkboxField.input)("change",()=>{if(!i.checkboxField.checked){this.v.filter(e=>this.toggleWith[n].includes(e.flags[0])).forEach(e=>{e.checkboxField.checked=!1})}}),e.appendTo.append(i.checkboxField.label)}}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v){!t.checkboxField.checked&&t.flags.forEach(t=>{e.pFlags[t]=!0})}return e}}class Ot extends V{init(){return kt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new pn({name:"ChannelPermissionsHeader"});e=new xt({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content}),this.eventListener.addEventListener("destroy",()=>{G.a.editChatDefaultBannedRights(this.chatId,e.takeOut())},{once:!0}),this.scrollable.append(t.container)}{const t=new pn({name:"PrivacyExceptions"}),s=new st({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Pt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>kt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void lt("User is no longer participant")}const s=new Tt(this.slider);s.participant=t,s.chatId=this.chatId,s.userId=e,s.open()}));t.content.append(s.container);const r=t.generateContentElement();r.classList.add("chatlist-container");const c=qr.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();i(s)},{listenerSetter:this.listenerSetter});const d=(t,s)=>{const i=s.banned_rights,n=G.a.getChat(this.chatId).default_banned_rights,a=[];e.v.forEach(e=>{const t=e.flags[0];i.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)});const o=t.querySelector(".user-last-message");a.length&&(o.innerHTML="",o.append(...Object(x.join)(a.map(e=>Object(x.i18n)(e)),!1))),o.classList.toggle("hide",!a.length)},h=(e,t)=>{const{dom:s}=qr.addDialogNew({dialog:o.a.getPeerId(e.peer),container:c,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:t});d(s.listEl,e)};this.listenerSetter.add(a.default)("updateChannelParticipant",e=>{var t,s,i;const n="channelParticipantBanned"===(null===(t=e.new_participant)||void 0===t?void 0:t._)&&!e.new_participant.banned_rights.pFlags.view_messages,a=c.querySelector(`[data-peer-id="${e.user_id}"]`);n?(a?d(a,e.new_participant):h(e.new_participant,!1),"channelParticipantBanned"!==(null===(s=e.prev_participant)||void 0===s?void 0:s._)&&++m):(a&&a.remove(),"channelParticipantBanned"===(null===(i=e.prev_participant)||void 0===i?void 0:i._)&&--m),p()});const p=()=>{Object(k.a)(s.subtitle,Object(x.i18n)(m?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[m]))};let u,m=0;const g=()=>(u=new yt({scrollable:this.scrollable,getPromise:()=>n.default.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,c.childElementCount).then(e=>{for(const t of e.participants)h(t,!0);return m=e.count,p(),e.participants.length<50||e.count===c.childElementCount})}),u.load());this.scrollable.append(t.container),G.a.isChannel(this.chatId)?yield g():(p(),this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,g())}))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}class At{constructor(e,t=o.a.getDialogType(e),s){const n=new Lt.a({peerId:e}).element,a=(t,n=p&&!!t.size)=>{let a=G.a.leave(e.toChatId());n&&(a=a.finally(()=>i.a.flushHistory(e))),s&&s(a)},r=t=>{let n;if(e.isUser())n=i.a.flushHistory(e,!1,p?!!t.size:void 0);else{if(!t.size)return a(t);n=G.a.delete(e.toChatId())}s&&s(n)};let l,c,d,h,p;switch(t){case"channel":G.a.hasRights(e.toChatId(),"delete_chat")?(G.a.deleteChannel,l="ChannelDeleteMenu",c="AreYouSureDeleteAndExitChannel",h=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChannelForAll"}]):(l="LeaveChannelMenu",c="ChannelLeaveAlertWithName",d=[n],h=[{langKey:"LeaveChannel",isDanger:!0,callback:a}]);break;case"chat":l="DeleteChatUser",c="AreYouSureDeleteThisChatWithUser",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}],p=[{text:"DeleteMessagesOptionAlso",textArgs:[new Lt.a({peerId:e}).element]}];break;case"saved":l="DeleteChatUser",c="AreYouSureDeleteThisChatSavedMessages",h=[{langKey:"DeleteChatUser",isDanger:!0,callback:r}];break;case"megagroup":case"group":G.a.hasRights(e.toChatId(),"delete_chat")?(l="DeleteMegaMenu",c="AreYouSureDeleteAndExit",h=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:r}],p=[{text:"DeleteChat.DeleteGroupForAll"}]):(l="LeaveMegaMenu",c="AreYouSureDeleteAndExitName",d=[n],h=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>a(e,!0)}])}new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var Ft=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class _t extends z{_init(){return Ft(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.innerHTML="",this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");const e=yield n.default.getChatFull(this.chatId,!0),t=G.a.getChat(this.chatId),s=G.a.isBroadcast(this.chatId),i=G.a.isChannel(this.chatId),o=[],r=e=>{o.push(e)};this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&o.forEach(e=>e())});const c=this.chatId.toPeerId(!0);{const i=new pn({noDelimiter:!0}),n=[],o=document.createElement("div");if(o.classList.add("input-wrapper"),this.chatNameInputField=new F.b({label:s?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new F.b({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),o.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new et({peerId:c,inputFields:n,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),i.content.append(this.editPeer.avatarEdit.container,o),G.a.hasRights(this.chatId,"change_type")){const n=new st({titleLangKey:s?"ChannelType":"GroupType",clickable:()=>{const t=new vt(this.slider);t.chatId=this.chatId,t.chatFull=e,t.open(),this.listenerSetter.add(t.eventListener)("destroy",a)},icon:"lock"}),a=()=>{let e;n.subtitle.textContent="",e=s?t.username?"TypePublic":"TypePrivate":t.username?"TypePublicGroup":"TypePrivateGroup",n.subtitle.append(Object(x.i18n)(e))};a(),i.content.append(n.container)}if(G.a.hasRights(this.chatId,"change_permissions")&&!s){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],s=new st({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Ot(this.slider);e.chatId=this.chatId,e.open()},icon:"permissions"}),n=()=>{s.subtitle.innerHTML=e.reduce((e,s)=>e+ +G.a.hasRights(this.chatId,s,t.default_banned_rights),0)+"/"+e.length};n(),i.content.append(s.container),this.listenerSetter.add(a.default)("chat_update",e=>{this.chatId===e&&n()})}if(this.scrollable.append(i.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];const t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(G.a.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(G.a.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>G.a.editPhoto(t,e))),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter}),s&&G.a.hasRights(this.chatId,"change_info")){const e=new mt.a({text:"PeerInfo.SignMessages",checked:!!t.pFlags.signatures,withRipple:!0});this.listenerSetter.add(e.input)("change",()=>{const t=e.toggleDisability(!0);G.a.toggleSignatures(this.chatId,e.checked).then(()=>{t()})}),r(()=>{e.setValueSilently(!!t.pFlags.signatures)}),i.content.append(e.label)}}if(!s){const t=new pn({});if(!s&&G.a.hasRights(this.chatId,"change_permissions")){const s=new mt.a({text:"ChatHistory",withRipple:!0});this.listenerSetter.add(s.input)("change",()=>{const e=s.toggleDisability(!0);G.a.togglePreHistoryHidden(this.chatId,!s.checked).then(()=>{e()})});const n=()=>{s.setValueSilently(i&&!e.pFlags.hidden_prehistory)};n(),r(n),t.content.append(s.label)}t.content.childElementCount&&this.scrollable.append(t.container)}if(G.a.hasRights(this.chatId,"delete_chat")){const e=new pn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:s?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new At(c,void 0,e=>{const s=Object(bt.a)([t],!0);e.then(()=>{this.close()},()=>{s()})})},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}i||this.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{c===e&&(this.chatId=t.toChatId(),this._init())})}))}init(){return this._init()}}var Dt=s(105);class jt extends z{init(){this.container.classList.add("edit-peer-container","edit-contact-container");const e=!P.a.isContact(this.peerId.toUserId());this.setTitle(e?"AddContactTitle":"Edit");{const t=new pn({noDelimiter:!0}),s=[],n=document.createElement("div");if(n.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new F.b({label:"LastName",name:"contact-lastname",maxLength:70}),this.peerId){const t=P.a.getUser(this.peerId);e?(this.nameInputField.setDraftValue(t.first_name),this.lastNameInputField.setDraftValue(t.last_name)):(this.nameInputField.setOriginalValue(t.first_name),this.lastNameInputField.setOriginalValue(t.last_name))}if(n.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new et({peerId:this.peerId,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),this.peerId){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const r=new mt.a({text:"Notifications"});r.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),this.listenerSetter.add(a.default)("notify_settings",e=>{if("notifyPeer"!==e.peer._)return;const t=o.a.getPeerId(e.peer.peer);if(this.peerId===t){const t=!Dt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new Lt.a({peerId:this.peerId}).element);const c=document.createElement("div");if(c.classList.add("profile-subtitle"),c.append(Object(x.i18n)("EditContact.OriginalName")),t.content.append(s,l,c,n),e){const e=P.a.getUser(this.peerId),s=new st({icon:"phone",titleLangKey:e.phone?void 0:"MobileHidden",title:e.phone?P.a.formatUserPhone(e.phone):void 0,subtitleLangKey:e.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:e.phone?void 0:[new Lt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new st({checkboxField:r}),s=!Dt.a.isPeerLocalMuted(this.peerId,!1);r.checked=s,t.content.append(e.container)}}else t.content.append(n);this.scrollable.append(t.container),Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0,P.a.addContact(this.peerId,this.nameInputField.value,this.lastNameInputField.value,P.a.getUser(this.peerId).phone).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()})},{listenerSetter:this.listenerSetter})}if(!e){const e=new pn({}),t=Object(U.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new gt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(ut.a)([{langKey:"Delete",callback:()=>{const e=Object(bt.a)([t],!0);P.a.deleteContacts([this.peerId]).then(()=>{this.close()},()=>{e()})},isDanger:!0}])}).show()},{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}}}class Bt extends z{init(){this.container.classList.add("add-members-container"),this.nextBtn=Q({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",()=>{const e=this.selector.getSelected().map(e=>e.toPeerId());if(this.skippable)this.takeOut(e),this.close();else{const t=this.takeOut(e);t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()}})}attachToPromise(e){const t=Object(te.g)(this.nextBtn,"arrow_next");e.then(()=>{this.close()},()=>{t()})}open(e){const t=super.open();this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const s="privacy"===this.peerType;return this.selector=new It({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[s?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:s,filterPeerTypeBy:s?["isAnyGroup","isUser"]:void 0}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable),t}}var Rt=!re.IS_FIREFOX&&!1;function Ut(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 24 24"),e.setAttributeNS(null,"width","24"),e.setAttributeNS(null,"height","24"),e.classList.add("verified-icon");const t=document.createElementNS("http://www.w3.org/2000/svg","use");t.setAttributeNS(null,"href","#verified-background"),t.classList.add("verified-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-check"),s.classList.add("verified-check"),e.append(t,s),e}const Ht=e=>e.touches?e.touches[0]:e,Nt=window;let zt=!1;a.default.addEventListener("context_menu_toggle",e=>{zt=e});class Vt{constructor(e){this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.hadMove=!1,this.xDown=null,this.yDown=null,this.reset=e=>{ue.IS_TOUCH_SUPPORTED?Nt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(Nt.removeEventListener("mousemove",this.handleMove),this.setCursorTo.style.cursor=""),this.onReset&&this.hadMove&&this.onReset(),this.xDown=this.yDown=null,this.hadMove=!1},this.handleStart=e=>{const t=Ht(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,ue.IS_TOUCH_SUPPORTED?Nt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):Nt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||zt)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Ht(e),s=t.clientX,i=t.clientY,n=this.xDown-s,a=this.yDown-i;if(!this.hadMove){if(!n&&!a)return;this.hadMove=!0,ue.IS_TOUCH_SUPPORTED||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),this.onFirstSwipe&&this.onFirstSwipe()}const o=this.onSwipe(n,a,e);void 0!==o&&o&&this.reset()},Object(w.g)(this,e),this.setCursorTo=this.element,this.setListeners()}setListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.addEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.addEventListener("mouseup",this.reset))}removeListeners(){ue.IS_TOUCH_SUPPORTED?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),Nt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),Nt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!ue.IS_TOUCH_SUPPORTED&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Kt=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gt{constructor(e){this.scrollable=e,this.loadCallbacks=new Map,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Gt.BASE_CLASS+"-avatar","media-container"),e&&(s="object"!=typeof e?r.a.getPhoto(e):e.action.photo);const i=new Image;i.classList.add("avatar-photo"),i.draggable=!1;const n=()=>{if(s){const e=Ss({container:t,photo:s,size:r.a.choosePhotoSize(s,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach(e=>{e.classList.add("avatar-photo")})}else{const e=o.a.getPeerPhoto(this.peerId);d.a.putAvatar(t,this.peerId,e,"photo_big",i)}};return this.avatars.childElementCount<=3?n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.avatars.append(t),this.addTab(),e},this.container=document.createElement("div"),this.container.classList.add(Gt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Gt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Gt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Gt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Gt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Gt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Gt.BASE_CLASS+"-arrow",Gt.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext);const t=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1);let s=!1,i=!1;Object(l.b)(this.container,e=>Kt(this,void 0,void 0,(function*(){if(i)return void Object(c.a)(e);if(s)return void(s=!1);if(!t())return;const n=this.container.getBoundingClientRect(),a=e.pageX,o=a-n.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||o>n.width*(1/3)&&o{t.push({element:this.avatars.children[s],item:e})});const s=t.slice(0,this.listLoader.previous.length),n=t.slice(this.listLoader.previous.length+1),a=this.avatars.children[this.listLoader.previous.length];i=!0,Tr(a,e,()=>e===this.peerId,this.listLoader.current,s,n),i=!1}else{const e=a>n.right-n.width/2;let t;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,t=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(t),Object(De.b)(()=>{this.avatars.classList.remove("no-transition")})}})));const n=()=>{s=!0,document.body.addEventListener(ue.IS_TOUCH_SUPPORTED?"touchend":"click",e=>{s=!1},{once:!0})};let a=0,h=0,p=0,u=0;new Vt({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-Gt.SCALE;return s>0?s=0:st()?!this.container.classList.contains("is-single")&&!i:(n(),Object(c.a)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();a=e.width,u=-a*(this.tabs.childElementCount-1),h=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",h+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(p)/(a/Gt.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(De.b)(()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")})}});this.intersectionObserver=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)})})}setPeer(e){this.peerId=e;const t=o.a.getPeerPhoto(e);if(!t)return;const s=this.listLoader=new S({loadCount:50,loadMore:(t,a,o)=>{if(!a)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t||s.current;return r.a.getUserPhotos(e,i,o).then(e=>({count:e.count,items:e.photos}))}{const t=[];return s.current||t.push(n.default.getChatFull(e.toChatId())),t.push(i.a.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:o,backLimit:0})),Promise.all(t).then(e=>{const t=e.pop();if(y(t),!s.current){const n=e[0],a=t.history.findAndSplice(e=>e.action.photo.id===n.chat_photo.id);s.current=a||i.a.generateFakeAvatarMessage(this.peerId,n.chat_photo)}return{count:t.count,items:t.history}})}},processItem:this.processItem,onJump:(e,t)=>{const s=this.listLoader.index,i=100*Gt.SCALE*s;this.avatars.style.transform=Gt.TRANSLATE_TEMPLATE.replace("{x}",`-${i}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active");this.tabs.children[s].classList.add("active"),this.loadNearestToTarget(this.avatars.children[s])}});"userProfilePhoto"===t._&&(s.current=t.photo_id),this.processItem(s.current),s.load(!0)}addTab(){const e=document.createElement("div");e.classList.add(Gt.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),s=t.indexOf(e);t.slice(Math.max(0,s-3),Math.min(t.length,s+3)).forEach(e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))})}}Gt.BASE_CLASS="profile-avatars",Gt.SCALE=Rt?2:1,Gt.TRANSLATE_TEMPLATE=Rt?`translate3d({x}, 0, -1px) scale(${Gt.SCALE})`:"translate({x}, 0)";let Wt=(e,t)=>{t.title.innerHTML=e,t.container.style.display=""};class qt{constructor(e){this.scrollable=e,this.setPeerStatus=(e=!1)=>{if(!this.peerId)return;const t=this.peerId;fr.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId)},Rt||this.scrollable.container.classList.add("no-parallax")}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new pn({noDelimiter:!0}),this.avatar=new Or,this.avatar.classList.add("profile-avatar","avatar-120"),this.avatar.setAttribute("dialog","1"),this.avatar.setAttribute("clickable",""),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new st({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&n.default.getProfileByPeerId(this.peerId).then(e=>{nt(e.about),lt(x.default.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new st({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{nt("@"+o.a.getPeer(this.peerId).username),lt(x.default.format("UsernameCopied",!0))}}),this.phone=new st({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{nt("+"+P.a.getUser(this.peerId).phone),lt(x.default.format("PhoneCopied",!0))}}),this.location=new st({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.notifications=new st({checkboxField:new mt.a({toggle:!0}),titleLangKey:"Notifications",icon:"unmute"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.notifications.container),this.element.append(this.section.container),Rt&&this.element.append(mn()),this.notifications.checkboxField.input.addEventListener("change",e=>{e.isTrusted&&i.a.mutePeer(this.peerId)}),a.default.addEventListener("dialog_notify_settings",e=>{if(this.peerId===e.peerId){const e=Dt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),a.default.addEventListener("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("peer_bio_edit",e=>{e===this.peerId&&this.setMoreDetails(!0)}),a.default.addEventListener("user_update",e=>{this.peerId===e&&this.setPeerStatus()}),a.default.addEventListener("contacts_update",e=>{if(this.peerId===e){const t=P.a.getUser(e);t.pFlags.self||(t.phone?Wt(P.a.formatUserPhone(t.phone),this.phone):this.phone.container.style.display="none")}}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4)}cleanupHTML(){this.bio.container.style.display="none",this.phone.container.style.display="none",this.username.container.style.display="none",this.location.container.style.display="none",this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0,this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0)}setAvatar(){if(this.peerId!==a.default.myId){if(o.a.getPeerPhoto(this.peerId)){const e=this.avatars;return this.avatars=new Gt(this.scrollable),this.avatars.setPeer(this.peerId),this.avatars.info.append(this.name,this.subtitle),this.avatar.remove(),e?e.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),void(Rt&&this.scrollable.container.classList.add("parallax"))}}Rt&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars=void 0),this.avatar.setAttribute("peer",""+this.peerId),this.section.content.prepend(this.avatar,this.name,this.subtitle)}fillProfileElements(){var e;if(!this.cleaned)return;this.cleaned=!1;const t=this.peerId;if(this.cleanupHTML(),this.setAvatar(),t!==a.default.myId){o.a.getPeerUsername(t)&&Wt(o.a.getPeerUsername(t),this.username);const e=Dt.a.isPeerLocalMuted(t,!1);this.notifications.checkboxField.checked=!e}else Object(De.b)(()=>{this.notifications.container.style.display="none"});if(t.isUser()){let e=P.a.getUser(t);e.phone&&t!==a.default.myId&&Wt(P.a.formatUserPhone(e.phone),this.phone)}this.setMoreDetails(),Object(k.a)(this.name,new Lt.a({peerId:t,dialog:!0}).element);const s=o.a.getPeer(t);(null===(e=null==s?void 0:s.pFlags)||void 0===e?void 0:e.verified)&&this.name.append(Ut()),this.setPeerStatus(!0)}setMoreDetails(e){this.setMoreDetailsTimeout&&(window.clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=0);const t=this.peerId,s=this.threadId;if(!t)return;let i;i=t.isUser()?n.default.getProfile(t,e).then(e=>this.peerId===t&&this.threadId===s&&(e.rAbout&&t!==a.default.myId&&Wt(e.rAbout,this.bio),!0)):n.default.getChatFull(t.toChatId(),e).then(e=>{var i;return this.peerId===t&&this.threadId===s&&(e.about&&Wt(J.b.wrapRichText(e.about),this.bio),"channelLocation"==(null===(i=null==e?void 0:e.location)||void 0===i?void 0:i._)&&Wt(e.location.address,this.location),!0)}),i.then(e=>{e&&(this.setMoreDetailsTimeout=window.setTimeout(()=>this.setMoreDetails(!0),6e4))})}setPeer(e,t=0){this.peerId===e&&this.threadId===t||(this.init&&this.init(),this.peerId=e,this.threadId=t,this.cleaned=!0)}}class Qt extends z{constructor(e){super(e,!1),this.threadId=0,this.historiesStorage={}}init(){this.container.classList.add("shared-media-container","profile-container");const e=Object(U.a)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t);const s=document.createElement("div");s.className="transition slide-fade";const i=document.createElement("div");i.classList.add("transition-item"),this.title.append(Object(x.i18n)("Profile")),this.editBtn=H("edit"),i.append(this.title,this.editBtn);const n=document.createElement("div");n.classList.add("transition-item");const o=this.title.cloneNode();o.append(Object(x.i18n)("PeerInfo.SharedMedia")),n.append(o),s.append(i,n),this.header.append(s),this.profile=new qt(this.scrollable),this.profile.init(),this.scrollable.append(this.profile.element);this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const s=e.top-1<=56;t.classList.toggle("state-back",s),this.searchSuper.container.classList.toggle("is-full-viewport",s),r(+s),s||this.searchSuper.cleanScrollPositions()};const r=Object(D.a)(s,"slide-fade",400,null,!1);r(0),Object(l.b)(this.closeBtn,e=>{this.closeBtn.firstElementChild.classList.contains("state-back")?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),r(0),t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),Object(l.b)(this.editBtn,e=>{let t;t=this.peerId.isAnyChat()?new _t(this.slider):new jt(this.slider),t&&(t instanceof _t?t.chatId=this.peerId.toChatId():t.peerId=this.peerId,t.open())}),a.default.addEventListener("contacts_update",e=>{this.peerId===e&&this.toggleEditBtn()}),a.default.addEventListener("chat_update",e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()}),a.default.addEventListener("history_multiappend",e=>{for(const t in e)this.renderNewMessages(t.toPeerId(),Array.from(e[t]))}),a.default.addEventListener("history_delete",({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))}),a.default.addEventListener("message_sent",({message:e})=>{this.renderNewMessages(e.peerId,[e.mid])}),this.searchSuper=new Zs({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{let t="members"===e.type&&a.default.settings.animationsEnabled?250:0;setTimeout(()=>{c.classList.toggle("is-hidden","members"!==e.type)},t)}}),this.profile.element.append(this.searchSuper.container);const c=Q({icon:"addmember_filled"});this.content.append(c),c.addEventListener("click",()=>{const e=this.peerId,t=this.peerId.toChatId(),s=G.a.isChannel(t),i=(t,i)=>{let n,a,o,r,l;if(t.length>1)n="AddMembersAlertTitle",a=[Object(x.i18n)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map(e=>{const t=document.createElement("b");return t.append(new Lt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Lt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Lt.a({peerId:t[0]}).element],checked:!0}])}r.push(new Lt.a({peerId:e}).element),new gt("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:i}],checkboxes:l}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&ct({langPackKey:"InviteToGroupError"})};if(s){const e=new Bt(this.slider);e.open({type:"channel",skippable:!1,takeOut:s=>(i(s,()=>{const i=G.a.inviteToChannel(t,s);i.catch(n),e.attachToPromise(i)}),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new Pt({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout(()=>{i([e],s=>{G.a.addChatUser(t,e,s.size?void 0:0).catch(n)})},0)}})})}renderNewMessages(e,t){if(!this.init&&this.historiesStorage[e]){t=t.slice().reverse();for(const s of this.searchSuper.mediaTabs){const n=s.inputFilter,a=this.searchSuper.filterMessagesByType(t.map(t=>i.a.getMessageByPeer(e,t)),n);if(a.length){const t=this.historiesStorage[e][n];t&&t.unshift(...a.map(e=>({mid:e.mid,peerId:e.peerId}))),this.peerId===e&&-1!==this.searchSuper.usedFromHistory[n]&&(this.searchSuper.usedFromHistory[n]+=a.length,this.searchSuper.performSearchResult(a,s,!1))}}}}deleteDeletedMessages(e,t){if(!this.init&&this.historiesStorage[e]){for(const s of t)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=this.historiesStorage[e][i];if(!n)continue;const a=n.findIndex(e=>e.mid===s);if(-1!==a){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[data-mid="${s}"][data-peer-id="${e}"]`);t&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(t),t.remove()),this.searchSuper.usedFromHistory[i]>=a+1&&this.searchSuper.usedFromHistory[i]--}break}}this.scrollable.onScroll()}}cleanupHTML(){this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",this.searchSuper.canViewMembers()&&G.a.hasRights(this.peerId.toChatId(),"invite_users"))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t=0){var s;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,historyStorage:null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={}}),this.profile.setPeer(e,t),!0)}fillProfileElements(){this.peerChanged&&(this.peerChanged=!1,this.cleanupHTML(),this.profile.fillProfileElements(),this.toggleEditBtn())}toggleEditBtn(){let e;e=this.peerId.isUser()?this.peerId!==a.default.myId&&P.a.isContact(this.peerId.toUserId()):G.a.hasRights(this.peerId.toChatId(),"change_info"),this.editBtn.classList.toggle("hide",!e)}loadSidebarMedia(e,t=!1){this.searchSuper.load(e,t)}onOpenAfterTimeout(){this.scrollable.onScroll()}}const $t=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1,b.b.addEventListener("changeScreen",(e,t)=>{t===b.a.medium&&e!==b.a.mobile&&this.toggleSidebar(!1)}),b.b.addEventListener("resize",()=>{this.setColumnProportion()}),this.sharedMediaTab=new Qt(this)}onCloseTab(e,t,s){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,s)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const s=document.body.classList.contains("is-right-column-shown");let i;if(void 0!==e?e?s||(i=!0):s&&(i=!0):i=!0,!i)return Promise.resolve();s||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const n=fr.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};de.a.appSidebarRight=$t;var Yt=$t;class Xt extends z{init(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv)}open(e){const t=super.open(),s=Je.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);es(n);const a=document.createDocumentFragment();return s.results.results.forEach((t,i)=>{if(!t.voters)return;const o=document.createElement("hr"),r=s.poll.answers[i],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");c.innerHTML=J.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=qr.createChatList();h.classList.add("poll-results-voters"),qr.setListClickListener(h,()=>{Yt.onCloseBtnClick()},void 0,!0),h.style.minHeight=50*Math.min(t.voters,4)+"px",a.append(o,l,h);let p,u=4,m=!1,g=t.voters-4;const b=()=>{m||(m=!0,Je.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(g-=e.votes.length,v.lastElementChild.replaceWith(Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,u=20,g&&e.votes.length||v.remove()}).finally(()=>{m=!1}))};if(b(),g<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(se.ripple)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(x.i18n)("PollResults.LoadMore",[Math.min(20,g)])),a.append(v)}),this.resultsDiv.append(i,a),Yt.toggleSidebar(!0).then(()=>{}),t}}var Jt=s(65);let Zt=0;const es=e=>{const t=e.reduce((e,t)=>e+Math.round(t),0);if(t>100){const s=t-100,i=e.length;for(let t=0;t=.5&&is&&(s=i,t=n)}if(-1===t)return;e[t]+=1-s}}};a.default.addEventListener("poll_update",({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach(s=>{s.isClosed=!!e.pFlags.closed,s.performResults(t,e.chosenIndexes)})}),a.default.addEventListener("peer_changed",()=>{ss&&ts(ss,is,ns)}),b.b.addEventListener("resize",()=>{as.setMaxLength(),as.resizePolls()}),b.b.addEventListener("changeScreen",()=>{as.setMaxLength()});const ts=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),ss===e&&is===t&&ns===s&&(ss=is=null,ns=0)},200)};let ss,is,ns;class as extends HTMLElement{constructor(){super(),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=Ct.a.width<=360?Ct.a.width-120:b.b.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){if(!this.MAX_LENGTH)return;Array.from(document.querySelectorAll("poll-element.is-voted")).forEach(e=>{e.svgLines.forEach((t,s)=>{e.setLineProgress(s,1)})})}render(){Zt||(Zt=document.getElementById("poll-line").getTotalLength(),as.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Je.a.getPoll(e);let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),t.pFlags&&(this.isPublic=!!t.pFlags.public_voters,this.isQuiz=!!t.pFlags.quiz,this.isClosed=!!t.pFlags.closed,this.isMultiple=!!t.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const n=this.isMultiple?'':"",a=t.answers.map((e,t)=>`\n
\n
\n
\n \n \n \n ${n}\n
\n
\n
${J.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append(Object(x.i18n)(i)),this.isQuiz&&(this.classList.add("is-quiz"),t.close_period&&t.close_date)){const e=document.createElement("div");e.classList.add("poll-time"),this.descDiv.append(e);const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("poll-quiz-timer"),this.quizTimer=s;const i=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+i),s.append(o),this.descDiv.append(s);const r=1e3*t.close_period,l=1e3*(t.close_date-Ze.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=String(i).toHHMMSS(),i<=5&&(e.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+s*a,o.style.strokeDasharray=`${a} ${a}`,t>=l&&(clearInterval(this.quizInterval),e.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout(()=>{Je.a.getResults(this.message)},3e3))},1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append(Object(x.i18n)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",e=>{Object(c.a)(e),Yt.isTabExists(Xt)||new Xt(Yt).open(this.message)}),Object(se.ripple)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append(Object(x.i18n)("Chat.Poll.SubmitVote")),Object(se.ripple)(this.sendVoteBtn),t.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),Object(l.b)(this.sendVoteBtn,e=>{Object(c.a)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then(()=>{this.chosingIndexes.length=0,this.answerDivs.forEach(e=>{e.classList.remove("is-chosing")})})}),o.append(this.sendVoteBtn));const r=!(t.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(s,t.chosenIndexes,!1),r&&(this.setVotersCount(s),Object(l.b)(this,this.clickHandler))}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),Object(l.b)(t,s=>{Object(c.a)(s),t.classList.add("active"),((e,t,s)=>{ss&&ts(ss,is,ns);const i=document.createElement("div");i.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),i.append(n),a.innerHTML=J.a.wrapRichText(e,{entities:t}),fr.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),ss=i,is=s,ns=window.setTimeout(()=>{ts(i,s,ns)},ue.IS_TOUCH_SUPPORTED?5e3:7e3)})(e.solution,e.solution_entities,()=>{t.classList.remove("active")})}),this.sentVote){const s=e.results.find(e=>e.pFlags.correct);s&&!s.pFlags.chosen&&t.click()}}}clickHandler(e){const t=Object(Me.a)(e.target,"poll-answer");if(!t)return;Object(c.a)(e);const s=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(s);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(s)}else this.sendVotes([s])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter((t,s)=>e.includes(s));return t.forEach(e=>{e.classList.add("is-voting")}),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=Je.a.sendVote(this.message,e).then(()=>{t.forEach(e=>{e.classList.remove("is-voting")}),this.classList.remove("disable-hover")}).catch(()=>{this.sentVote=!1}).finally(()=>{this.sendVotePromise=null})}performResults(e,t,s=!0){var i,n;if(a.default.settings.animationsEnabled||(s=!1),this.isQuiz&&((null===(i=e.results)||void 0===i?void 0:i.length)||this.isClosed)){this.answerDivs.forEach((t,s)=>{t.classList.toggle("is-correct",!!e.results[s].pFlags.correct)}),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),Object(k.a)(this.typeDiv,Object(x.i18n)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?Object(l.b)(this,this.clickHandler):Object(l.c)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map(t=>e.total_voters?t.voters/e.total_voters*100:0);this.classList.toggle("no-transition",!s),s&&Object(Jt.a)(this,"",!this.isRetracted,340),Object(De.b)(()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,s),this.percents=t,this.isRetracted=!1})}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));let t="";(e.recent_voters||[]).forEach((e,s)=>{const i=0===s?"":`style="transform: translateX(-${3*s}px);"`;t+=``}),this.avatarsDiv.innerHTML=t}if(this.isMultiple){const t=!!this.chosenIndexes.length,s=this.isClosed||t,i=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",s),this.viewResults.classList.toggle("hide",i),this.votersCountDiv.classList.toggle("hide",!s||!i)}}setResults(e,t,s){this.svgLines.forEach(e=>e.style.display=""),this.answerDivs.forEach((e,s)=>{e.classList.toggle("is-chosen",t.includes(s))});const i=Math.max(...e);if(this.maxPercents=e.map(e=>e/i),this.isRetracted)this.svgLines.forEach((e,t)=>{this.setLineProgress(t,-1)});else{const e=()=>{this.svgLines.forEach((e,t)=>{this.setLineProgress(t,1)})};s?Object(De.b)(e):e()}let n;e=e.slice(),es(e);const a=t=>{e.forEach((e,s)=>{const i=n(e,t);this.numberDivs[s].innerText=i+"%"})};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),s)for(let e=9,t=0;e>=0;--e,++t)setTimeout(()=>{a(e)},34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),s)for(let e=0;e<10;++e)setTimeout(()=>{a(e)},34*e);else a(9);if(this.isRetracted){s&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach(e=>e.style.display="none")};s?setTimeout(()=>{this.classList.remove("is-retracting"),e()},340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let s,i=[t];s=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",Object(k.a)(this.votersCountDiv,Object(x.i18n)(s,i))}setLineProgress(e,t){const s=this.svgLines[e];-1===t?(s.style.strokeDasharray="",s.style.strokeDashoffset=""):(s.style.strokeDasharray=t*this.maxPercents[e]*as.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*as.MAX_OFFSET)}}as.MAX_OFFSET=-46.5,as.MAX_LENGTH=0,customElements.define("poll-element",as);var os=s(120),rs=s(106),ls=s(66),cs=s(67),ds=s(68),hs=s(134),ps=s(140),us=s(129),ms=s(91),gs=s(97),bs=s(158),vs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};let fs=0;function ys({doc:e,container:t,message:s,boxWidth:i,boxHeight:n,withTail:o,isOut:r,middleware:d,lazyLoadQueue:h,noInfo:p,group:u,onlyPreview:m,withoutPreloader:g,loadPromises:v,noPlayButton:f,noAutoDownload:y,size:w,searchContext:S}){var L,I;const M=!(i&&n),P=("video"!==e.type||e.size<=52428800&&!M)&&("gif"===e.type?a.default.settings.autoPlay.gifs:a.default.settings.autoPlay.videos);let T,k;if(!p){T=document.createElement("span"),T.classList.add("video-time"),t.append(T);let s=!1;"gif"!==e.type?(T.innerText=(e.duration+"").toHHMMSS(!1),f||"round"===e.type||(P&&!y?T.classList.add("tgico","can-autoplay"):s=!0)):(T.innerText="GIF",P||f||(s=!0,y=void 0)),s&&(k=document.createElement("span"),k.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(k))}let x,O={};if("image/gif"===e.mime_type){const a=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:g,loadPromises:v,noAutoDownload:y,size:w});return O.thumb=a,O.loadPromise=a.loadPromises.full,O}const A=document.createElement("video");if(A.classList.add("media-video"),A.setAttribute("playsinline","true"),A.muted=!0,"round"===e.type){const i=document.createElement("div");i.classList.add("media-round","z-depth-1"),i.dataset.mid=""+s.mid,i.dataset.peerId=""+s.peerId,i.message=s;const n=b.b.active.round,a=n.width/2,o=3.5,r=a-2*o;i.innerHTML=`\n \n `;const d=i.firstElementChild.firstElementChild;fs||(fs=2*Math.PI*r),d.style.strokeDasharray=fs+" "+fs,d.style.strokeDashoffset=""+fs,T.classList.add("tgico");s.pFlags.media_unread&&i.classList.add("is-unread");const h=document.createElement("canvas");h.width=h.height=e.w,i.prepend(h,T),i.append(A),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!y),s=()=>{(fr.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(ds.a)(t)||(t.removeEventListener("play",r),t.removeEventListener("timeupdate",o),t.removeEventListener("pause",u),t.removeEventListener("ended",m))})},n=()=>{p.drawImage(t,0,0);const e=fs-t.currentTime/t.duration*fs;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(ds.a)(t)?(t.paused&&n(),T.innerText=(t.duration-t.currentTime+"").toHHMMSS(!1)):s())},o=je(a),r=()=>{A.classList.add("hide"),i.classList.remove("is-paused"),Object(os.b)(n,h),x&&x.preloader&&x.preloader.classList.contains("manual")&&x.onClick()},u=()=>{Object(ds.a)(t)?i.classList.add("is-paused"):s()},m=()=>{A.classList.remove("hide"),i.classList.add("is-paused"),A.currentTime=0,T.innerText=(""+t.duration).toHHMMSS(!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",r),t.addEventListener("timeupdate",o),t.addEventListener("pause",u),t.addEventListener("ended",m),Object(l.b)(h,s=>{if(Object(c.a)(s),x&&!x.detached&&x.onClick(),t.paused){const s=!!S;if(fe.setSearchContext(S||{peerId:Be.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?He(i):[];fe.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()}),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(n(),a(),A.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else A.autoplay=!0;let F;if(s){if(F=Ss({photo:e,message:s,container:t,boxWidth:i,boxHeight:n,withTail:o,isOut:r,lazyLoadQueue:h,middleware:d,withoutPreloader:!0,loadPromises:v,noAutoDownload:y,size:w}),O.thumb=F,!P&&"gif"!==e.type||m)return O.loadPromise=F.loadPromises.full,O;if(o){const e=(F.images.thumb||F.images.full).parentElement;A.width=+e.getAttributeNS(null,"width"),A.height=+e.getAttributeNS(null,"height"),e.append(A)}}else{const t=C.a.getThumb(e,!1);t&&t.promise.then(()=>{A.poster=t.cacheContext.url})}!A.parentElement&&t&&((null==F?void 0:F.aspecter)||t).append(A);const _=he.a.getCacheContext(e),D=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.preloader);D?(x=s.media.preloader,x.attach(t,!1),y=void 0):_.downloaded||e.supportsStreaming?e.supportsStreaming&&(x=new ye.a({cancelable:!1,attachMethod:"prepend"})):x=new ye.a({attachMethod:"prepend"});const j=Object(ae.a)();A.addEventListener("error",e=>{4!==A.error.code&&console.error("Error "+A.error.code+"; details: "+A.error.message),x&&!D&&x.detach(),j.isFulfilled||j.resolve()},{once:!0}),Object(me.e)(A).then(()=>{u&&E.a.addAnimation(A,u),x&&!D&&x.detach(),j.resolve()}),"video"===e.type&&A.addEventListener("timeupdate",()=>{T.innerText=(A.duration-A.currentTime+"").toHHMMSS(!1)}),A.muted=!0,A.loop=!0,A.autoplay=!0;let B=y&&(null===(I=null==F?void 0:F.preloader)||void 0===I?void 0:I.loadFunc);const R=()=>{x&&y&&!g&&(x.construct(),x.setManual());let i=Promise.resolve();if(x&&!D)if(_.downloaded||e.supportsStreaming)e.supportsStreaming&&(y?i=Promise.reject():_.downloaded||(x.attach(t,!1,null),A.addEventListener(re.IS_SAFARI?"timeupdate":"canplay",()=>{x.detach()},{once:!0})));else{const s=i=C.a.downloadDoc(e,null==h?void 0:h.queueId,y);x.attach(t,!1,s)}return!y&&B&&(B(),B=null),y=void 0,i.then(()=>{!d||d()?("round"===e.type&&fe.resolveWaitingForLoadMedia(s.peerId,s.mid,s.pFlags.is_scheduled),Object(rs.a)(A,_.url)):j.resolve()},()=>{}),{download:i,render:j}};return x&&!D&&x.setDownloadFunction(R),"gif"!==e.type||P?O.loadPromise=h?(h.push({div:t,load:()=>R().render}),Promise.resolve()):R().render:Object(l.b)(t,e=>{Object(c.a)(e),k.remove(),R()},{capture:!0,once:!0}),O}function ws({message:e,withTime:t,fontWeight:s,voiceAsMusic:n,showSender:o,searchContext:c,loadPromises:d,noAutoDownload:h,lazyLoadQueue:p}){var u,g;s||(s=500);const b=e.media.document||e.media.webpage.document,v=e.pFlags.is_outgoing&&(null===(u=e.media)||void 0===u?void 0:u.preloader);if("audio"===b.type||"voice"===b.type||"round"===b.type){const i=new Ne;return i.withTime=t,i.message=e,i.noAutoDownload=h,i.lazyLoadQueue=p,i.loadPromises=d,n&&(i.voiceAsMusic=n),c&&(i.searchContext=c),o&&(i.showSender=o),v&&(i.preloader=e.media.preloader),i.dataset.fontWeight=""+s,i.render(),i}let f=b.file_name?b.file_name.split("."):"",y="";y=f.length>1&&Array.isArray(f)?Object(hs.a)(f.pop().split(" ",1)[0].toLowerCase()):"file";let w=document.createElement("div");w.classList.add("document","ext-"+y),w.dataset.docId=""+b.id;const S=document.createElement("div");S.classList.add("document-ico");const L=he.a.getCacheContext(b);if((null===(g=b.thumbs)||void 0===g?void 0:g.length)||e.pFlags.is_outgoing&&L.url&&"photo"===b.type){w.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing)S.innerHTML=``,t.push(S.firstElementChild);else{const e=Ss({photo:b,message:null,container:S,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(b,54,54,!0)});S.style.width=S.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach(e=>e.classList.add("document-thumb"))}else S.innerText=y;let E=b.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const M=[Object(I.b)(b.size)];t&&M.push(Object(oe.d)(e.date)),o&&M.push(i.a.wrapSenderToPeer(e)),w.innerHTML=`\n ${L.downloaded&&!v?"":'
'}\n
\n
\n `;const P=w.querySelector(".document-name"),T=new Ae.a;T.dataset.fontWeight=""+s,T.innerHTML=E,P.append(T),o&&P.append(i.a.wrapSentTime(e));if(w.querySelector(".document-size").append(...Object(x.joinElementsWith)(M," · ")),w.prepend(S),!v&&e.pFlags.is_outgoing)return w;let k,O=null;const A=()=>{if(k){k.classList.add("downloaded");const e=k;setTimeout(()=>{e.remove()},200),k=null}O&&(O=null)},F=e=>{var t;const s=!e||e.isTrusted,i=C.a.getDoc(w.dataset.docId);let n;const o=fr.chat.bubbles?fr.chat.bubbles.lazyLoadQueue.queueId:void 0;return s?"pdf"===i.type?(n=C.a.downloadDoc(i,o),n.then(()=>{setTimeout(()=>{const e=he.a.getCacheContext(i).url;window.open(e)},a.default.settings.animationsEnabled?250:0)})):n=m.has(i.mime_type)&&(null===(t=i.thumbs)||void 0===t?void 0:t.length)?C.a.downloadDoc(i,o):C.a.saveDocFile(i,o):n=C.a.downloadDoc(i,o),k&&(n.then(A),O.attach(k,!0,n)),{download:n}};return C.a.downloading.has(b.id)?(k=w.querySelector(".document-download"),O=new ye.a,O.attach(k,!1,C.a.downloading.get(b.id))):L.downloaded&&!v||(k=w.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(k),e.media.promise.then(A)):(O=new ye.a,O.construct(),O.setManual(),O.attach(k),O.setDownloadFunction(F))),Object(l.b)(w,e=>{O?O.onClick(e):F(e)}),w}function Ss({photo:e,message:t,container:s,boxWidth:i,boxHeight:n,withTail:o,isOut:l,lazyLoadQueue:c,middleware:d,size:h,withoutPreloader:p,loadPromises:u,noAutoDownload:m,noBlur:g,noThumb:v,noFadeIn:f,blurAfter:y}){var w;if(!e.sizes&&!e.thumbs)return i&&n&&!h&&"document"===e._&&r.a.setAttachmentSize(e,s,i,n,void 0,t),{loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null};h||(void 0===i&&(i=b.b.active.regular.width),void 0===n&&(n=b.b.active.regular.height)),s.classList.add("media-container");let S,L,E,I=s,M=!0,P=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(L=new Image,i&&n&&!h){const a=r.a.setAttachmentSize(e,s,i,n,void 0,t,void 0,T?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:"full"}:void 0);if(h=a.photoSize,M=a.isFit,E=he.a.getCacheContext(e,h.type),!M){I=document.createElement("div"),I.classList.add("media-container-aspecter"),I.style.width=a.size.width+"px",I.style.height=a.size.height+"px";const i=r.a.getStrippedThumbIfNeeded(e,E,!g,!0);if(i){P=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{Ss({container:s,message:t,photo:e,boxWidth:0,boxHeight:0,size:h,lazyLoadQueue:c,isOut:l,loadPromises:u,middleware:d,withoutPreloader:p,withTail:o,noAutoDownload:m,noBlur:g,noThumb:!0,blurAfter:!0}).images.full.classList.add("media-photo","thumbnail")}s.classList.add("media-container-fitted"),s.append(I)}}else h||(h=r.a.choosePhotoSize(e,i,n,!0)),E=he.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,E,!g);t&&(P=Promise.all([P,t.loadPromise]),S=t.image,S.classList.add("media-photo"),I.append(S))}L.classList.add("media-photo");const k=(S||!E.downloaded)&&a.default.settings.animationsEnabled&&!f;let x;(null===(w=null==t?void 0:t.media)||void 0===w?void 0:w.preloader)&&!p?(x=t.media.preloader,x.attach(s),m=void 0):E.downloaded||(x=new ye.a({attachMethod:"prepend"}));const O=e=>Ls(s,L,e,k,I,S),A=()=>d&&!d()?Promise.resolve():y?Object(ps.a)(E.url,12).then(e=>O(e)):O(E.url);let F;const _=h.w>=150&&h.h>=150||m,D=()=>{m&&!p&&x&&(x.construct(),x.setManual());const t=T&&!h?C.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,m);x&&!E.downloaded&&!p&&_&&x.attach(s,!1,t),m=void 0;const i=t.then(A);return i.catch(()=>{}),{download:t,render:i}};return x&&x.setDownloadFunction(D),E.downloaded?P=F=D().render:c?c.push({div:s,load:()=>D().download}):F=D().render,u&&P&&u.push(P),{loadPromises:{thumb:P,full:F||Promise.resolve()},images:{thumb:S,full:L},preloader:x,aspecter:I}}function Ls(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(rs.a)(t,s,()=>{ls.a.mutateElement(e,()=>{n.append(t),Object(De.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{ls.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Cs({doc:e,div:t,middleware:s,lazyLoadQueue:n,group:o,play:d,onlyThumb:h,emoji:p,width:u,height:m,withThumb:g,loop:b,loadPromises:f,needFadeIn:y,needUpscale:w}){var S;const L=e.sticker;if(u||(u=p?void 0:200),m||(m=p?void 0:200),2===L&&le.a.loadLottieWorkers(),!L)throw console.error("wrong doc for wrapSticker!",e),new Error("wrong doc for wrapSticker!");t.dataset.docId=""+e.id,t.classList.add("media-sticker-wrapper");const E=he.a.getCacheContext(e),I=p?Object(ie.d)(p):-1,M=E.downloaded&&!y;let P=Object(ae.a)(),T=!1;if(((null===(S=e.thumbs)||void 0===S?void 0:S.length)||e.stickerCachedThumbs)&&!t.firstElementChild&&(!M||2===L||h)&&!1!==g){let i,a=e.stickerCachedThumbs&&e.stickerCachedThumbs[I]||e.thumbs[0];const o=()=>{t.childElementCount||(i.classList.add("media-sticker","thumbnail"),ls.a.mutateElement(t,()=>{t.append(i),P.resolve()}))};if("url"in a)i=new Image,Object(rs.a)(i,a.url,o),T=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}else a=e.thumbs.find(e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length})||a;a&&"photoPathSize"!==a._&&I<=0&&(i=new Image,us.a||e.pFlags.stickerThumbConverted||E.url?(Object(rs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),T=!0):ce.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(rs.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o)}).catch(()=>{}))}else if(2===L&&(g||h)&&I<=0){i=new Image;const r=()=>{if(t.childElementCount||s&&!s())return;const n=()=>{t.childElementCount||s&&!s()||Object(rs.a)(i,E.url,o)};return E.url?(n(),Promise.resolve()):C.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(T=!0)}}if(f&&T&&f.push(P),h)return Promise.resolve();const k=()=>vs(this,void 0,void 0,(function*(){if(!s||s()){if(2===L)return yield C.a.downloadDoc(e,null==n?void 0:n.queueId).then(ne.c).then(n=>vs(this,void 0,void 0,(function*(){if(s&&!s())return;let r=yield le.a.loadAnimationWorker({container:t,loop:b&&!p,autoplay:d,animationData:n,width:u,height:m,name:"doc"+e.id,needUpscale:w},o,I);if(r.addEventListener("firstFrame",()=>{const s=t.firstElementChild;y=(y||!s||"svg"===s.tagName)&&a.default.settings.animationsEnabled;const i=()=>{s&&s!==r.canvas&&s.remove()};y?ls.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{ls.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&ls.a.mutate(i),C.a.saveLottiePreview(e,r.canvas,I)},{once:!0}),p){const e={a:[],v:1};let n;cs.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>vs(this,void 0,void 0,(function*(){Object(c.a)(a);const o=le.a.getAnimation(t);if(o.paused){const e=cs.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield C.a.downloadDoc(e);const t=he.a.getCacheContext(e);s.src=t.url,s.play(),yield Object(me.e)(s,void 0,!0),s.addEventListener("ended",()=>{s.src="",s.remove()},{once:!0})}catch(e){}}o.autoplay=!0,o.restart()}const r=cs.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=document.createElement("div");l.classList.add("emoji-animation");l.style.width="280px",l.style.height="280px",Cs({div:l,doc:r,middleware:s,withThumb:!1,needFadeIn:!1,loop:!1,width:280,height:280,play:!0,group:"none"}).then(e=>{Object(ms.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),l.remove(),fr.chat.bubbles.scrollable.container.removeEventListener("scroll",y))}),bs.a&&e.addEventListener("firstFrame",()=>{navigator.vibrate(100)},{once:!0})});const d=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},h=Object(Me.a)(t,"bubble"),u=h.classList.contains("is-out"),m=d(16),g=d(4),b=35*(u?1:-1),f=()=>{if(!Object(ds.a)(t))return;const e=t.getBoundingClientRect(),s=(u?e.right:e.left)+((u?-280:0)+b+m),i=e.top+(e.height-280)/2+g;l.style.top=i+"px",l.style.left=s+"px"},y=je(f);fr.chat.bubbles.scrollable.container.addEventListener("scroll",y),f(),h&&(u?l.classList.add("is-out"):l.classList.add("is-in")),fr.emojiAnimationContainer.append(l),n||(n=Object(gs.a)(()=>{if(!e.a.length)return;const s=e.a[0].t;e.a.forEach(e=>{e.t=(e.t-s)/1e3});const n=Object(Me.a)(t,"bubble");i.a.setTyping(fr.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:v.a.getServerMessageId(+n.dataset.mid),emoticon:p,interaction:{_:"dataJSON",data:JSON.stringify(e)}},!0),e.a.length=0},1e3,!1)),a.isTrusted&&(e.a.push({i:1,t:Date.now()}),n())})))}return r})));if(1===L){const i=new Image,o=t.firstElementChild!==i&&t.firstElementChild;return y=(y||!M||o)&&a.default.settings.animationsEnabled,i.classList.add("media-sticker"),y&&i.classList.add("fade-in"),new Promise((a,r)=>{const l=()=>{if(s&&!s())return a();Object(rs.a)(i,E.url,()=>{ls.a.mutateElement(t,()=>{t.append(i),o&&o.classList.add("fade-out"),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),o&&o.remove()},{once:!0})})})};E.url?l():C.a.downloadDoc(e,null==n?void 0:n.queueId).then(l,a)})}}})),x=!n||M&&2!==L?k():(n.push({div:t,load:k}),Promise.resolve());return M&&1===L&&(P=x,f&&f.push(P)),x}function Es({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return vs(this,void 0,void 0,(function*(){if(null===(r=e.thumbs)||void 0===r?void 0:r.length)return s.classList.add("media-sticker-wrapper"),void t.push({div:s,load:()=>{const t=cs.a.getStickerSetThumbDownloadOptions(e),r=he.a.download(t);if(e.pFlags.animated)return r.then(ne.c).then(t=>{le.a.loadAnimationWorker({container:s,loop:!0,autoplay:n,animationData:t,width:a,height:o,needUpscale:!0,name:"setThumb"+e.id},i)});{const e=new Image;return e.classList.add("media-sticker"),r.then(t=>{Object(rs.a)(e,URL.createObjectURL(t),()=>{s.append(e)})})}}});const l=cs.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Cs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Is(e,t,s){const i=new Ke("reply");return i.fill(e,t,s),i.container}function Ms(e){const t=new Ye(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&qe),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&Qe),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=i+"px",o.style.height=a+"px";const r=o.children;t.forEach(({geometry:t,sides:s},n)=>{let l;if(l=r[n],l||(l=document.createElement("div"),o.append(l)),l.classList.add("album-item","grouped-item"),l.style.width=t.width/i*100+"%",l.style.height=t.height/a*100+"%",l.style.top=t.y/a*100+"%",l.style.left=t.x/i*100+"%",s&$e&&s&We&&(l.style.borderTopLeftRadius="inherit"),s&$e&&s&Qe&&(l.style.borderBottomLeftRadius="inherit"),s&qe&&s&We&&(l.style.borderTopRightRadius="inherit"),s&qe&&s&Qe&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Ps({groupId:e,attachmentDiv:t,middleware:s,uploading:n,lazyLoadQueue:a,isOut:o,chat:l,loadPromises:c,noAutoDownload:d}){const h=[],p=i.a.getMidsByAlbum(e);for(const e of p){const t=l.getMessage(e),s=t.media.photo||t.media.document,i="photo"===s._?r.a.choosePhotoSize(s,480,480):{w:s.w,h:s.h};h.push({size:i,media:s,message:t})}Ms({container:t,items:h.map(e=>({w:e.size.w,h:e.size.h})),maxWidth:b.b.active.album.width,minWidth:100,spacing:2,forMedia:!0}),h.forEach((e,i)=>{const{size:n,media:r,message:l}=e,h=t.children[i];h.dataset.mid=""+l.mid,h.dataset.peerId=""+l.peerId;const p=h.firstElementChild;"photo"===r._?Ss({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,noAutoDownload:d}):ys({doc:l.media.document,container:p,message:l,boxWidth:0,boxHeight:0,withTail:!1,isOut:o,lazyLoadQueue:a,middleware:s,loadPromises:c,noAutoDownload:d})})}b.b.addEventListener("changeScreen",(e,t)=>{if(t===b.a.mobile||e===b.a.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=b.b.active.round.width,s=t/2,i=s-7;fs=2*Math.PI*i,e.forEach(e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+s),n.setAttributeNS(null,"cy",""+s),n.setAttributeNS(null,"r",""+i),n.style.strokeDasharray=fs+" "+fs,n.style.strokeDashoffset=""+fs})}}),a.default.addEventListener("download_start",e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach(e=>{e.querySelector(".preloader-container.manual")&&Object(l.d)(e)})});var Ts=s(77),ks=s(117),xs=s(89);function Os(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(xs.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}class As{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(ks.a)(),Object(w.g)(this,e),this.elements=new Map,this.sorted=[]}clear(){this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach(e=>{this.update(e.id,!0)}),this.onSort&&this.sorted.forEach((e,t)=>{this.onSort(e,t)})}updateList(e){const t=this.middleware.get();this.updateListWith(s=>{if(!t()||void 0!==s&&!s)return e(!1);this._updateList(),e(!0)})}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e,t=!1,s,i=t){let n=this.get(e);if(n)return n;const a={id:e,index:0};return n=this.onElementCreate(a,t),this.elements.set(e,n),this.update(e,i,n,s),n}delete(e,t){const s=this.elements.get(e);if(!s)return!1;this.elements.delete(e);const i=this.sorted.indexOf(s);if(-1!==i&&this.sorted.splice(i,1),this.onDelete)if(t)this.onDelete(s);else{const e=this.middleware.get();this.updateElementWith(()=>{e()&&this.onDelete(s)})}return!0}update(e,t=!1,s=this.get(e),i){if(!s)return;s.index=this.getIndex(s),this.onUpdate&&this.onUpdate(s);const n=Object(f.f)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Fs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class _s extends As{constructor(e={}){let t;super({getIndex:e.getIndex||(e=>P.a.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>{const t=P.a.getUserStatusString(e.id);Object(k.a)(e.dom.lastMessageSpan,t)}),onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Os(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=qr.addDialogNew({dialog:e.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});return e.dom=t,e},updateElementWith:De.b,updateListWith:e=>Fs(this,void 0,void 0,(function*(){return Object(ds.a)(this.list)?(yield Object(Ts.c)(),Object(ds.a)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize=48,this.rippleEnabled=!0,this.autonomous=!0,Object(w.g)(this,e),this.list=qr.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},_s.SORT_INTERVAL)};s()}}_s.SORT_INTERVAL=3e4;var Ds=s(82);function js(e){let t=!1;return new Vt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Me.a)(t.target,"progress-line")&&!Object(Ds.a)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(s,i,n)=>{if(!t&&Math.abs(i)>20)return!0;if(Math.abs(s)>Math.abs(i))Object(c.a)(n),t=!0;else if(!t&&Math.abs(i)>Math.abs(s))return!0;return e.onSwipe(s,i,n)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}function Bs(e){return js(Object.assign(Object.assign({},e),{onSwipe:(t,s,i)=>{if(Math.abs(t)>50)return e.onSwipe(t,s,i),Object(te.b)(),!0}}))}var Rs=s(85),Us=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Hs extends Pt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Us(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}fr.setInnerPeer({peerId:s}),fr.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class Ns{constructor(e,t,s,n){const r=new Lt.a({peerId:e}).element;t=t.slice();const l=(a,o)=>{n&&n(),"scheduled"===s?i.a.deleteScheduledMessages(e,t):i.a.deleteMessages(e,t,!!a.size||o)};let c,d,h,p,u,m=[];if(1===t.length?c="DeleteSingleMessagesTitle":(c="DeleteMessagesTitle",d=[Object(x.i18n)("messages",[t.length])]),h=o.a.isMegagroup(e)?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",u=[{langKey:"Delete",isDanger:!0,callback:l}],e===a.default.myId||"scheduled"===s);else if(e.isUser())m.push({text:"DeleteMessagesOptionAlso",textArgs:[r]});else{const s=G.a.getChat(e.toChatId()),n=G.a.hasRights(e.toChatId(),"delete_messages");if("chat"===s._){const s=n?t.slice():t.filter(t=>i.a.getMessageByPeer(e,t).fromId===a.default.myId);s.length&&(s.length===t.length?m.push({text:"DeleteForAll"}):(m.push({text:"DeleteMessagesOption"}),h="DeleteMessagesTextGroup",p=[Object(x.i18n)("messages",[s.length])]))}else u[0].callback=e=>l(e,!0)}Object(ut.a)(u);new gt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:m}).show()}}var zs=s(146);class Vs{constructor(e,t,s){let n,a,o=[];n=`Send Message${t.length>1?"s":""} Now`,a=t.length>1?"Send "+t.length+" messages now?":"Send message now?";o.push({langKey:"Send",callback:()=>{s&&s(),i.a.sendScheduledMessages(e,t)}});new gt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var Ks=s(8);function Gs(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var Ws=s(72);const qs=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class Qs{constructor(e){if(this.selectedMids=new Map,this.isSelecting=!1,this.cancelSelection=e=>{e&&(this.doNotAnimate=!0),this.onCancelSelection&&this.onCancelSelection(),this.selectedMids.clear(),this.toggleSelection(),Gs(),e&&(this.doNotAnimate=void 0)},Object(w.g)(this,e),this.navigationType="multiselect-"+Object(at.b)(),ue.IS_TOUCH_SUPPORTED)return this.listenerSetter.add(this.listenElement)("touchend",()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")}),void Object(te.a)(this.listenElement,e=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),this.listenElement.addEventListener("touchend",e=>{Object(c.a)(e),document.body.classList.remove("no-select")},{once:!0,capture:!0}),Gs();const t=this.getElementFromTarget(e.target);t&&this.toggleByElement(t)},this.listenerSetter);const t=(e,t)=>{if(e===t)return[];const s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),n=(s.top-i.top||s.left-i.left)<0,a=Object(Me.a)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),l=o.indexOf(t);n||([l,r]=[r,l]);return o.slice(r+1,l)};this.listenerSetter.add(this.listenElement)("mousedown",e=>{const s=Object(Me.a)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,s))return;const i=new Map;let n,a=s;const o=(e,s=!0)=>{const r=+e.dataset.mid;if(!r||!e.dataset.peerId)return;const l=e.dataset.peerId.toPeerId();Object(ds.a)(a)||(a=e);let c=i.get(l);if(c||i.set(l,c=new Set),!c.has(r)){const d=this.isMidSelected(l,r);if(void 0===n&&(n=!d),c.add(r),n&&!d||!n&&d){const n=qs(i);if(this.toggleByElement&&s){n<2&&Object(Ws.a)(e,a)&&(a=e);const s=t(a,e);s.length&&s.forEach(e=>{o(e,!1)})}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===n&&this.toggleByMid)for(const[e,t]of i)for(const s of t)this.toggleByMid(e,s)}}};let r=!1;const d=e=>{r||(Gs(),r=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,n)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",d),void this.listenerSetter.removeManual(document,"mouseup",h,p)):void o(t)},h=e=>{i.size&&Object(l.b)(window,c.a,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",d),Gs()},p={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",d),this.listenerSetter.add(document)("mouseup",h,p)})}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const s=!!this.getCheckboxInputFromElement(e);if(t){if(s)return!1;const t=new mt.a({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else s&&this.getCheckboxInputFromElement(e).parentElement.remove();return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){const t=this.selectedMids.size;if(!t&&!e)return;let s=!t,i=!t,n=!t;for(const[e,t]of this.selectedMids){const n=this.isScheduled?this.appMessagesManager.getScheduledMessagesStorage(e):this.appMessagesManager.getMessagesStorage(e);for(const e of t){const t=this.appMessagesManager.getMessageFromStorage(n,e);if(s||(s=!this.appMessagesManager.canForward(t)),i||(i=!this.appMessagesManager.canDeleteMessage(t)),s&&i)break}if(s&&i)break}this.onUpdateContainer&&this.onUpdateContainer(s,i,n)}toggleSelection(e=!0,t=!1){const s=this.isSelecting,i=this.selectedMids.size;if(this.isSelecting=!!i||t,s===this.isSelecting)return!1;ue.IS_TOUCH_SUPPORTED||(this.listenElement.classList.toggle("no-select",this.isSelecting),s&&Gs()),Object(Ks.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),re.IS_MOBILE_SAFARI||(n?j.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):j.a.removeByType(this.navigationType)),t&&this.updateContainer(t),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0);this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),Object(Jt.a)(e,"is-selected",t,200)}isMidSelected(e,t){const s=this.selectedMids.get(e);return null==s?void 0:s.has(t)}length(){return qs(this.selectedMids)}toggleMid(e,t,s){let i=this.selectedMids.get(e);if(s||void 0===s&&(null==i?void 0:i.has(t)))i&&(i.delete(t),i.size||this.selectedMids.delete(e));else{if(a.default.config.forwarded_count_max-this.length()-1<0)return lt(x.default.format("Chat.Selection.LimitToast",!0)),!1;i||(i=new Set,this.selectedMids.set(e,i)),i.add(t)}return!0}deleteSelectedMids(e,t){const s=this.selectedMids.get(e);s&&(t.forEach(e=>{s.delete(e)}),s.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class $s extends Qs{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Me.a)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,s=e.dataset.peerId.toPeerId();this.toggleMid(s,t)&&this.updateElementSelection(e,this.isMidSelected(s,t))},this.toggleByMid=(e,t)=>{const s=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(s)},this.onUpdateContainer=(e,t,s)=>{const i=this.length();Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[i])),this.selectionGotoBtn.classList.toggle("hide",1!==i),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if(Object(Jt.a)(this.searchSuper.navScrollableContainer,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}),Object(Jt.a)(this.searchSuper.container,"is-selecting",e,200),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=H(`close ${e}-cancel`,{noRipple:!0});this.listenerSetter.add(t)("click",()=>this.cancelSelection(),{once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=H(`message ${e}-goto`);const s={listenerSetter:this.listenerSetter};Object(l.b)(this.selectionGotoBtn,()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),a.default.dispatchEvent("history_focus",{peerId:e,mid:t})},s),this.selectionForwardBtn=H(`forward ${e}-forward`),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Hs(e,()=>{this.cancelSelection()})},s),this.isPrivate&&(this.selectionDeleteBtn=H(`delete danger ${e}-delete`),Object(l.b)(this.selectionDeleteBtn,()=>{const e=[...this.selectedMids.keys()][0];new Ns(e,[...this.selectedMids.get(e)],"chat",()=>{this.cancelSelection()})},s)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const i=this.selectionContainer;i.style.opacity="0",this.searchSuper.navScrollableContainer.append(i),i.offsetLeft,i.style.opacity=""}},this.isPrivate=!e.showSender}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e){Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach(e=>{this.toggleElementCheckbox(e,this.isSelecting)})}return s}}class Ys extends Qs{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Me.a)(e,"grouped-item")||Object(Me.a)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,s)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===s&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=s,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const e=this.selectedMids.get(this.bubbles.peerId);if(e){this.chat.getMidsByMid(t).forEach(t=>e.delete(t))}}return void this.bubbles.getBubbleGroupedItems(e).forEach(this.toggleByElement)}if(!this.toggleMid(this.bubbles.peerId,t))return;if(e.classList.contains("grouped-item")){const s=Object(Me.a)(e,"bubble"),i=this.isGroupedBubbleSelected(s),n=this.isGroupedMidsSelected(t);(n||i)&&this.updateElementSelection(s,n)}this.updateElementSelection(e,this.isMidSelected(this.bubbles.peerId,t))},this.toggleByMid=(e,t)=>{const s=this.bubbles.getMountedBubble(t);s&&this.toggleByElement(s.bubble)},this.onToggleSelection=(e,t)=>{const{needTranslateX:s,widthFrom:i,widthTo:n}=this.chat.input.center(t);Object(Jt.a)(this.listenElement,"is-selecting",e,t?200:0,()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)});const a=ithis.cancelSelection(),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=Object(U.a)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append(Object(x.i18n)("MessageScheduleSend")),Object(l.b)(this.selectionSendNowBtn,()=>{new Vs(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],()=>{this.cancelSelection()})},e)):(this.selectionForwardBtn=Object(U.a)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append(Object(x.i18n)("Forward")),Object(l.b)(this.selectionForwardBtn,()=>{const e={};for(const[t,s]of this.selectedMids)e[t]=Array.from(s).sort((e,t)=>e-t);new Hs(e,()=>{this.cancelSelection()})},e)),this.selectionDeleteBtn=Object(U.a)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append(Object(x.i18n)("Delete")),Object(l.b)(this.selectionDeleteBtn,()=>{new Ns(this.bubbles.peerId,[...this.selectedMids.get(this.bubbles.peerId)],this.chat.type,()=>{this.cancelSelection()})},e);const s=this.selectionLeft=document.createElement("div");s.classList.add("selection-container-left"),s.append(t,this.selectionCountEl);const i=this.selectionRight=document.createElement("div");i.classList.add("selection-container-right"),i.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==a&&(s.style.transform=`translateX(${-a}px)`,i.style.transform=`translateX(${a}px)`),this.selectionContainer.append(s,i),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",s.style.transform="",i.style.transform=""}}else this.selectionLeft&&void 0!==a&&(this.selectionLeft.style.transform=`translateX(-${a}px)`,this.selectionRight.style.transform=`translateX(${a}px)`)},this.onUpdateContainer=(e,t,s)=>{Object(k.a)(this.selectionCountEl,Object(x.i18n)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",s),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>{for(const[e,t]of this.selectedMids)for(const e of t){const t=this.bubbles.getMountedBubble(e);t&&this.toggleByElement(t.bubble)}}}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const s=super.toggleSelection(e,t);if(s&&e)for(const e in this.bubbles.bubbles){const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return s}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const s=super.toggleElementCheckbox(e,t);if(s){e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach(e=>this.toggleElementCheckbox(e,t))}return s}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(+e.dataset.mid))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}isGroupedMidsSelected(e){const t=this.chat.getMidsByMid(e),s=t.filter(e=>this.isMidSelected(this.bubbles.peerId,e));return t.length===s.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-sending")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}var Xs=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Js{constructor(e,t){this.attachTo=e,this.searchSuper=t,this.onGotoClick=()=>{a.default.dispatchEvent("history_focus",{peerId:this.peerId,mid:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionForwardBtn):new Hs({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?Object(l.d)(this.searchSuper.selection.selectionDeleteBtn):new Ns(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Me.a)(e.target,"search-super-item")}catch(e){}if(s){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.target=s,this.peerId=s.dataset.peerId.toPeerId(),this.mid=+s.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),this.buttons.forEach(e=>{let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||e.verify()),e.element.classList.toggle("hide",!t)}),s.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{s.classList.remove("menu-open")})}};ue.IS_TOUCH_SUPPORTED||Object(te.a)(e,s)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>i.a.canForward(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>i.a.canDeleteMessage(i.a.getMessageByPeer(this.peerId,this.mid))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=Ce(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class Zs{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new ee.d,this.middleware=Object(ks.a)(),this.historyStorage={},this.usedFromHistory={},this.urlsToRevoke=[],this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=Object(X.b)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.searchContextMenu=new Js(this.container,this),this.selection=new $s(this,i.a);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const s=this.navScrollable=new T.a(t);s.container.classList.add("search-super-nav-scrollable");const n=this.nav=document.createElement("nav");n.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=n,s.container.append(n);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("i");s.append(Object(x.i18n)(e.name)),s.append(i),t.append(s),Object(se.ripple)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),ue.IS_TOUCH_SUPPORTED&&Bs({element:this.tabsContainer,onSwipe:(e,t,s)=>{const i=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=i+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{Object(c.a)(e)};let s=2;const i=()=>{--s||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",i,{once:!0}),i}(this.tabsContainer),this.selectTab(o))}});for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const s=document.createElement("div");s.classList.add("search-super-content-"+e.type),t.append(s),this.tabsContainer.append(t),this.tabs[e.inputFilter]=s,e.contentTab=s}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new O(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.mediaTab.contentTab.childElementCount&&this.load(!0)},this.selectTab=Object(Z.a)(this.tabsMenu,this.tabsContainer,(e,t,s)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start"});const i=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(i);const n=this.mediaTab;if(this.mediaTab=i,-1!==this.prevTabId&&s&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(i.scroll={scrollTop:n,scrollHeight:0})}if(i.scroll){const e=n.scroll.scrollTop-i.scroll.scrollTop;e&&(i.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||i.contentTab.childElementCount||this.load(!0),this.prevTabId=e},()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()},void 0,s),Object(l.b)(this.tabsContainer,e=>{this.selection.isSelecting&&(Object(c.a)(e),this.selection.toggleByElement(Object(Me.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Me.a)(n.target,e);if(!a)return;const o=+a.dataset.mid;if(!o)return void this.log.warn("no messageId by click on target:",a);const r=a.dataset.peerId.toPeerId(),l=Array.from(this.tabs[s].querySelectorAll("."+t)).map(t=>{const s=Object(Me.a)(t,e);return{element:t,mid:+s.dataset.mid,peerId:s.dataset.peerId.toPeerId()}}),c=l.findIndex(e=>e.mid===o&&e.peerId===r),d=i.a.getMessageByPeer(r,o);(new Lr).setSearchContext(this.copySearchContext(s)).openMedia(d,l[c].element,0,!1,l.slice(0,c),l.slice(c+1))};Object(l.b)(this.tabs.inputMessagesFilterPhotoVideo,o.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo")),Object(l.b)(this.tabs.inputMessagesFilterDocument,o.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument")),this.mediaTab=this.mediaTabs[0],Object(Ts.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=qr.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});qr.setLastMessage(s,e,i,this.searchContext.query)}processPhotoVideoFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){const a=i.a.getMediaFromMessage(e),o=document.createElement("div");let l;o.classList.add("grid-item");const c=r.a.choosePhotoSize(a,200,200);l="photo"!==a._?ys({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:Ss({photo:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,withoutPreloader:!0,noBlur:!0,size:c}),[l.images.thumb,l.images.full].filter(Boolean).forEach(e=>{e.classList.add("grid-item-media")}),t.push(l.loadPromises.thumb),n.push({element:o,message:e})}processDocumentFilter({message:e,elemsToAppend:t,inputFilter:s}){const n=i.a.getMediaFromMessage(e),a=this.showSender||["voice","round"].includes(n.type),o=ws({message:e,withTime:!a,fontWeight:400,voiceAsMusic:!0,showSender:a,searchContext:this.copySearchContext(s),lazyLoadQueue:this.lazyLoadQueue,noAutoDownload:!0});["audio","voice","round"].includes(n.type)&&o.classList.add("audio-48"),t.push({element:o,message:e})}processUrlFilter({message:e,promises:t,middleware:s,elemsToAppend:n}){var a;let o=null===(a=e.media)||void 0===a?void 0:a.webpage;if(!o){const t=e.totalEntities?e.totalEntities.find(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._):null;let s,i,n;if(t)n=e.message.slice(t.offset,t.offset+t.length);else{const t=J.b.matchUrl(e.message);if(!t)return;s=t[0]}s="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:s||n,i=s;const a=e.message===s;s.match(/^(ftp|http|https):\/\//)||(i="https://"+s,s=s.includes("@")?s:"https://"+s),i=new URL(i).hostname,o={_:"webPage",url:s,display_url:i,id:"",hash:0},a||(o.description=e.message,o.rDescription=J.b.wrapRichText(Object(Y.f)(e.message,150,180)))}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){Ss({container:l,message:null,photo:o.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,size:r.a.choosePhotoSize(o.photo,60,60,!1),loadPromises:t,noBlur:!0})}else l.classList.add("empty"),l.innerHTML=J.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0);let c=o.rTitle||"",d=o.rDescription||"";const h=Object(zs.a)(d),p=Object(zs.a)(J.b.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(e)),c||(c=J.b.wrapPlainText(o.display_url.split("/",1)[0]));const u=new st({title:c,titleRight:i.a.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.container,message:e})}performSearchResult(e,t,s=!0){return Xs(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield Object(Ts.c)(),"inputMessagesFilterPhotoVideo"===l&&this.searchContext.query.trim()?(l="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===l&&(r=this.searchGroups.messages);const c={elemsToAppend:i,inputFilter:l,message:void 0,middleware:o,promises:a,searchGroup:r};let d;switch(l){case"inputMessagesFilterEmpty":d=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":d=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":d=this.processDocumentFilter;break;case"inputMessagesFilterUrl":d=this.processUrlFilter}if(d){d=d.bind(this);for(const t of e)try{c.message=t,d(c)}catch(e){this.log.error("error rendering filter",l,c,t,e)}}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(i.length){const e=s?"append":"prepend";i.forEach(t=>{const{element:s,message:i}=t,n=this.getMonthContainerByTimestamp(this.groupByMonth?i.date:0,l);s.classList.add("search-super-item"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,n.items[e](s),this.selection.isSelecting&&this.selection.toggleElementCheckbox(s,!0)})}this.afterPerforming("inputMessagesFilterEmpty"===l?1:e.length,n)}}))}afterPerforming(e,t){if(t){const s=t.parentElement;if(Array.from(s.children).slice(1).forEach(e=>{e.remove()}),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),s.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(let e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const s=this.searchContext.query;if(s){const r=(t,i,r=!1)=>{t.forEach(t=>{if(e.has(t))return;e.add(t);const l=o.a.getPeer(t),{dom:c}=qr.addDialogNew({dialog:t,container:i.list,drawStatus:!1,avatarSize:48,autonomous:i.autonomous});if(r&&(l.participants_count||l.participants)){const e=new RegExp(`(${Object(Y.e)(s)}|${Object(Y.e)(Object(hs.b)(s))})`,"gi");c.titleSpan.innerHTML=c.titleSpan.innerHTML.replace(e,"$1"),c.lastMessageSpan.append(n.default.getChatMembersString(t.toChatId()))}else if(t===a.default.myId)c.lastMessageSpan.append(Object(x.i18n)("Presence.YourChat"));else{let e=o.a.getPeerUsername(t);if(e)e="@"+e;else{const s=P.a.getUser(t);s&&s.phone&&(e="+"+Object(Rs.a)(s.phone).formatted)}c.lastMessageSpan.innerHTML=""+e+""}}),i.toggle()},l=e=>{if(t())return e};return Promise.all([P.a.getContactsPeerIds(s,!0).then(l).then(e=>{e&&r(e,this.searchGroups.contacts,!0)}),P.a.searchContacts(s,20).then(l).then(e=>{if(e&&(r(e.my_results,this.searchGroups.contacts,!0),r(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new x.default.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),e.addEventListener("click",()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()})}}),i.a.getConversations(s,0,20,0).promise.then(l).then(e=>{e&&r(e.dialogs.map(e=>e.peerId),this.searchGroups.contacts,!0)})])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>M.default.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=qr.addDialogNew({dialog:e,container:this.searchGroups.recent.list,drawStatus:!1,meAsSaved:!0,avatarSize:48,autonomous:!0});s.lastMessageSpan.append(e.isUser()?P.a.getUserStatusString(e):n.default.getChatMembersString(e.toChatId()))}),s.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())});return Promise.all([P.a.getTopPeers("correspondents").then(e=>{if(!t())return;const s=e.findIndex(e=>e.id===a.default.myId);-1!==s&&(e=e.slice()).splice(s,1),e.length&&e.forEach(e=>{qr.addDialogNew({dialog:e.id,container:this.searchGroups.people.list,drawStatus:!1,onlyFirstName:!0,avatarSize:54,autonomous:!1})}),this.searchGroups.people.setActive()}),e()])}}loadMembers(e){const t=this.searchContext.peerId.toChatId(),s=this.middleware.get();let i;const a=t=>Xs(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new _s({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),this.membersList.list.addEventListener("click",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=Yt.toggleSidebar(!1)),i.then(()=>{fr.setInnerPeer({peerId:s})})}),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab)),t.forEach(e=>{const t=G.a.getParticipantPeerId(e);if(t.isAnyChat())return;P.a.getUser(t).pFlags.deleted||this.membersList.add(t)}))}));if(G.a.isChannel(t)){const o=this.membersList?200:50;i=n.default.getChannelParticipants(t,void 0,o,this.nextRates[e.inputFilter]).then(t=>{if(!s())return;let i=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(i?i.childElementCount:0)+t.participants.length,t.participants.length{if(!s())return;this.loaded[e.inputFilter]=!0;const i=t.participants;return"chatParticipantsForbidden"!==i._?a(i.participants):void 0});return this.loadPromises[e.inputFilter]=i.finally(()=>{s()&&(this.loadPromises[e.inputFilter]=null)})}loadType(e,t,s,n){var a,o;const r=e.inputFilter;if(this.loadPromises[r])return this.loadPromises[r];if("members"===e.type)return this.loadMembers(e);const l=null!==(a=this.historyStorage[r])&&void 0!==a?a:this.historyStorage[r]=[];if(!("inputMessagesFilterEmpty"!==r||l.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[r]=!0,Promise.resolve();const c="load ["+r+"]: ";if(l.length&&this.usedFromHistory[r]i.a.getMessageByPeer(e.peerId,e.mid)),r))}while(a{setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}let d=l.length?l[l.length-1].mid:0;return this.loadPromises[r]=i.a.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:r},maxId:d,limit:s,nextRate:null!==(o=this.nextRates[r])&&void 0!==o?o:this.nextRates[r]=0})).then(i=>{if(l.push(...i.history.map(e=>({mid:e.mid,peerId:e.peerId}))),this.log(c+"search house of glass",r,i),n())return(i.history.length{setTimeout(()=>{if(n()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then(()=>{n()&&setTimeout(()=>{this.scrollable.checkForTriggers()},0)})}},0)}),this.performSearchResult(this.filterMessagesByType(i.history,r),e))}).catch(e=>{this.log.error("load error:",e)}).finally(()=>{this.loadPromises[r]=null})}load(e=!1,t=!1){return Xs(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(this.hideEmptyTabs){const e=this.mediaTabs.filter(e=>"inputMessagesFilterEmpty"!==e.inputFilter),t=e.map(e=>({_:e.inputFilter})),a=yield i.a.getSearchCounters(s,t);if(!n())return;if(this.loadMutex&&(yield this.loadMutex,!n()))return;let o,r=0;e.forEach(e=>{const t=a.find(t=>t.filter._===e.inputFilter);e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&void 0===o&&(o=e),t.count&&++r});const l=this.mediaTabsMap.get("members"),c=this.canViewMembers();l.menuTab.classList.toggle("hide",!c),c&&(o=l),this.container.classList.toggle("hide",!o),this.container.parentElement.classList.toggle("search-empty",!o),o&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(o),!1),o.menuTab.classList.add("active"),this.navScrollableContainer.classList.toggle("hide",r<=1))}this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter(e=>e!==this.mediaTab);if(a=a.filter(e=>{const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"members"===e.type),!a.length)return;const o=t?50:Math.round(3*(Ct.a.height/130|0)*1.25),r=a.map(e=>this.loadType(e,t,o,n));return Promise.all(r).catch(e=>{this.log.error("Load error all promises:",e)})}))}getMonthContainerByTimestamp(e,t){var s;const i=new Date(1e3*e);i.setHours(0,0,0),i.setDate(1);const n=i.getTime(),a=null!==(s=this.monthContainers[t])&&void 0!==s?s:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const s=document.createElement("div");s.classList.add("search-super-month-name");const o={month:"long"};i.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new x.default.IntlDateElement({date:i,options:o}).element;s.append(r),e.append(s);const l=document.createElement("div");l.classList.add("search-super-month-items"),e.append(s,l);const c=Object(w.e)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},Os(e,this.tabs[t],d)}return a[n]}canViewMembers(){return this.searchContext.peerId.isAnyChat()&&!G.a.isBroadcast(this.searchContext.peerId.toChatId())&&G.a.hasRights(this.searchContext.peerId.toChatId(),"view_participants")}cleanup(){this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.lazyLoadQueue.clear(),this.mediaTabs.forEach(e=>{this.usedFromHistory[e.inputFilter]=-1}),this.selection.isSelecting&&this.selection.cancelSelection(),this.middleware.clean(),this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach(e=>{e.scroll=void 0})}cleanupHTML(e=!1){this.urlsToRevoke.length&&(this.urlsToRevoke.forEach(e=>{URL.revokeObjectURL(e)}),this.urlsToRevoke.length=0),this.mediaTabs.forEach(e=>{if(e.contentTab.innerHTML="",this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||Object(te.f)(t,!0);const s=t.querySelector(".content-empty");s&&s.remove()}}),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=Object(w.a)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:s,historyStorage:i,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:s,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=i?i:{},this.cleanup()}}var ei,ti=s(75);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(ei||(ei={}));const si=new class{constructor(){this.privacy={},a.default.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,a.default.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return ht.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(P.a.saveApiUsers(s.users),G.a.saveApiChats(s.chats),ti.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(Y.b)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(Y.b)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(Y.b)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ht.a.invokeApi("account.getPrivacy",{key:{_:e}}).then(e=>(P.a.saveApiUsers(e.users),G.a.saveApiChats(e.chats),this.privacy[t]=e.rules))}getPrivacyRulesDetails(e){const t=[];let s={users:[],chats:[]},i={users:[],chats:[]};return e.forEach(e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueAllowUsers":s.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueDisallowUsers":i.users.push(...e.users)}}),{type:t[0],disallowPeers:i,allowPeers:s}}};de.a.appPrivacyManager=si;var ii=si;class ni{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],s=this.radioSection.caption;t?Object(x._i18n)(s,t):s.innerHTML="",s.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===ei.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===ei.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new pn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:ei.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:ei.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:ei.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(at.b)();t.forEach(({type:e,langKey:t})=>{const i=new st({radioField:new ot({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=it([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=un(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach(s=>{s.row=new st(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Bt(e.tab.slider).open({type:"privacy",skippable:!0,title:s.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),s.row.subtitle.innerHTML="",s.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})})}),t.append(s.row.container)})}const n=ii.getPrivacy(e.inputKey).then(t=>{const s=ii.getPrivacyRulesDetails(t);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach(e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map(e=>e.toPeerId())),t.push(...i.chats.map(e=>e.toPeerId(!0))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))})),e.tab.eventListener.addEventListener("destroy",()=>{const t=[];switch(this.type){case ei.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case ei.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case ei.Nobody:t.push({_:"inputPrivacyValueDisallowAll"})}this.exceptions&&[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]].forEach(([e,s,i],n)=>{if(this.exceptions.get(e).row.container.classList.contains("hide"))return;const a=this.peerIds[e];if(a){const e=this.splitPeersByType(a);e.chats.length&&t.push({_:s,chats:e.chats}),e.users.length&&t.push({_:i,users:e.users.map(e=>P.a.getUserInput(e))})}}),ii.setPrivacy(e.inputKey,t)},{once:!0})})}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach(e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)}),t}generateStr(e){return e.users.length||e.chats.length?Object(x.join)([e.users.length?Object(x.i18n)("Users",[e.users.length]):null,e.chats.length?Object(x.i18n)("Chats",[e.chats.length]):null].filter(Boolean),!1):[Object(x.i18n)("PrivacySettingsController.AddUsers")]}}class ai extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=new ni({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:["PrivacyPhoneInfo","PrivacyPhoneInfo",""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{t.setRadio(ei.Everybody),t.radioSection.container.classList.toggle("hide",e!==ei.Nobody)}}),t=new ni({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[ei.Nobody]});this.scrollable.container.insertBefore(t.radioSection.container,e.radioSection.container.nextSibling)}}var oi=s(86);class ri extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new pn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!0,play:!0,width:160,height:160}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});Object(l.b)(a,e=>{this.close()}),this.slider.sliceTabsUntilTab(tn,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var li=s(122);function ci(e){return!re.IS_MOBILE_SAFARI||!e}class di extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new pn({caption:!0,noDelimiter:!0});Object(x._i18n)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=cs.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"📬"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.codeInputField=new li.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),oi.a.confirmPasswordEmail(""+e).then(e=>{c()}).catch(e=>{switch(e.type){case"CODE_INVALID":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":a.input.classList.add("error"),Object(k.a)(a.label,Object(x.i18n)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)})}}),o=Object(U.a)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),c=()=>{new ri(this.slider).open()},d=e=>{Object(bt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),oi.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(hi,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(te.f)(r);oi.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ci(this.isFirst)&&this.codeInputField.input.focus()}}class hi extends z{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new pn({caption:!0,noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💌"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement(),n=document.createElement("div");n.classList.add("input-wrapper");const a=this.inputField=new F.b({name:"recovery-email",label:"RecoveryEmail",plainText:!0});a.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),h()}),a.input.addEventListener("input",e=>{a.input.classList.remove("error")});const o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=()=>{new ri(this.slider).open()},h=()=>{const e=a.value.trim(),t=J.b.matchEmail(e);if(!t||t[0].length!==e.length)return void a.input.classList.add("error");p(!0);const s=Object(te.f)(o);oi.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then(e=>{d()},t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const s=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],i=new di(this.slider);i.state=this.state,i.email=e,i.length=s,i.open()}else console.log("password set error",t);p(!1),s.remove()})};Object(l.b)(o,h);const p=e=>{e?(o.setAttribute("disabled","true"),r.setAttribute("disabled","true")):(o.removeAttribute("disabled"),r.removeAttribute("disabled"))};Object(l.b)(r,e=>{new gt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(te.f)(r),oi.a.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then(()=>{d()},e=>{p(!1)})},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){ci(this.isFirst)&&this.inputField.input.focus()}}var pi=s(110),ui=s(103),mi=s(121);class gi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new pn({noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:160,height:160,emoji:"💡"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=document.createElement("div");i.classList.add("input-wrapper");const n=this.inputField=new F.b({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});n.input.addEventListener("keypress",e=>{if("Enter"===e.key)return Object(c.a)(e),n.value?d():h()});const a=(e,t)=>{e&&Object(c.a)(e);const s=t?n.value:void 0;if(s&&this.newPassword===s)return void lt(x.default.format("PasswordAsHintError",!0));const i=new hi(this.slider);i.state=this.state,i.plainPassword=this.plainPassword,i.newPassword=this.newPassword,i.hint=s,i.open()},o=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"}),r=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),d=e=>a(e,!0),h=e=>a(e,!1);Object(l.b)(o,d),Object(l.b)(r,h),i.append(n.container,o,r),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class bi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new pn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new ui.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new mi.a(s,157),n=Object(U.a)("btn-primary btn-color-primary",{text:"Continue"});t.append(s.container,n),e.content.append(i.container,t),this.scrollable.container.append(e.container),s.input.addEventListener("keypress",e=>{if(s.input.classList.contains("error")&&s.setState(F.a.Neutral),"Enter"===e.key)return o()});const a=()=>this.newPassword===s.value||(s.setError(),!1),o=e=>{if(e&&Object(c.a)(e),!a())return;const t=new gi(this.slider);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return Object(l.b)(n,o),i.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class vi extends z{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new pn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new ui.a({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?J.b.wrapEmojiText(this.state.hint):void 0}),n=new pi.a(i,157),a=Object(U.a)("btn-primary btn-color-primary"),o=new x.default.IntlElement({key:"Continue"});a.append(o.element),s.append(i.container,a),t.content.append(n.container,s),this.scrollable.container.append(t.container),i.input.addEventListener("keypress",e=>{if(i.input.classList.contains("error")&&(i.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()});const r=()=>!!i.value.length||(i.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&Object(c.a)(e),!r())return;const t=new bi(this.slider);t.state=this.state,t.newPassword=i.value,t.plainPassword=this.plainPassword,t.open()};else{let e,t=()=>(e||(e=window.setInterval(t,1e4)),oi.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=J.b.wrapEmojiText(this.state.hint):Object(k.a)(i.label,Object(x.i18n)("LoginPassword"))}));d=s=>{if(!r())return void Object(c.a)(s);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const l=Object(te.f)(a),d=i.value;oi.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new fi(this.slider);t.state=this.state,t.plainPassword=d,t.open(),this.slider.removeTabFromHistory(this)}},e=>{a.removeAttribute("disabled"),i.input.classList.add("error"),e.type,o.key="TwoStepAuth.InvalidPassword",o.update(),l.remove(),i.select(),t()})},t()}return Object(l.b)(a,d),n.load()}onOpenAfterTimeout(){ci(this.isFirst)&&this.passwordInputField.input.focus()}}class fi extends z{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new pn({caption:!0,noDelimiter:!0}),t=cs.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Cs({doc:t,div:s,loop:!1,play:!0,width:168,height:168,emoji:"🔐"}).then(()=>{}):s.classList.add("media-sticker-wrapper"),e.content.append(s);const i=e.generateContentElement();if(this.state.pFlags.has_password){Object(x._i18n)(e.caption,"TwoStepAuth.GenericHelp");const t=Object(U.a)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=Object(U.a)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});Object(l.b)(t,()=>{const e=new vi(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new gt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{oi.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(tn,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new hi(this.slider);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()}),i.append(t,s,n)}else{Object(x._i18n)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=Object(U.a)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),Object(l.b)(s,e=>{const t=new vi(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class yi extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new ni({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class wi extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new ni({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[ei.Nobody]})}}class Si extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new ni({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class Li extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new ni({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[ei.Nobody]})}}class Ci extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new ni({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new ni({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ei extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new st({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:Object(oe.c)(new Date(1e3*Math.max(e.date_active,e.date_created)))});t.container.dataset.hash=""+e.hash;const s=document.createElement("div");return s.classList.add("row-midtitle"),s.innerHTML=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t.subtitle.parentElement.insertBefore(s,t.subtitle),t},t=this.authorizations.slice();{const n=new pn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=t.findAndSplice(e=>e.pFlags.current),o=e(a);if(n.content.append(o.container),t.length){const e=Object(U.a)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});Object(l.b)(e,t=>{new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(bt.a)([e],!0);ht.a.invokeApi("auth.resetAuthorizations").then(t=>{e.remove(),s.container.remove(),this.privacyTab.updateActiveSessions()},i).finally(()=>{t()})}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const s=new pn({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach(t=>{s.content.append(e(t).container)}),this.scrollable.append(s.container);const i=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&<(x.default.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ht.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&(n.remove(),this.privacyTab.updateActiveSessions())},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ce([{icon:"stop",text:"Terminate",onClick:a}]);o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),Object(te.a)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,o),Object(te.d)(o))}),Object(l.b)(this.scrollable.container,e=>{n=Object(Me.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Ii extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");{const e=new pn({caption:"BlockedUsersInfo"});this.scrollable.append(e.container)}const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,e=>{new Pt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{P.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const t=qr.createChatList();this.scrollable.container.classList.add("chatlist-container"),this.scrollable.append(t);const s=(e,s)=>{const{dom:i}=qr.addDialogNew({dialog:e,container:t,drawStatus:!1,rippleEnabled:!0,avatarSize:48,append:s}),n=P.a.getUser(e);n.pFlags.bot?i.lastMessageSpan.append("@"+n.username):n.phone?i.lastMessageSpan.innerHTML=P.a.formatUserPhone(n.phone):i.lastMessageSpan.append(n.username?"@"+n.username:P.a.getUserStatusString(e))};for(const e of this.peerIds)s(e,!0);let i;const n=this.menuElement=Ce([{icon:"lockoff",text:"Unblock",onClick:()=>{const e=i.dataset.peerId.toPeerId();P.a.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]);n.id="blocked-users-contextmenu",n.classList.add("contextmenu"),document.getElementById("page-chats").append(n),Object(te.a)(this.scrollable.container,e=>{i=Object(ft.a)(e.target,"LI"),i&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),Object(te.e)(e,n),Object(te.d)(n))},this.listenerSetter),this.listenerSetter.add(a.default)("peer_block",e=>{const{peerId:i,blocked:n}=e,a=t.querySelector(`[data-peer-id="${i}"]`);n?a||s(i,!1):a&&a.remove()});let o=!1;this.scrollable.onScrolledBottom=()=>{o||(o=!0,P.a.getBlocked(t.childElementCount,50).then(e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||t.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()}).finally(()=>{o=!1}))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Mi=s(125);class Pi extends V{init(){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new pn({noDelimiter:!0});let t;const s=new st({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Ii(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new st({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new vi(this.slider):i.email_unconfirmed_pattern?(t=new di(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,oi.a.resendPasswordEmail()):t=new fi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new st({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ei(this.slider);e.privacyTab=this,e.authorizations=this.authorizations,e.open()}});o.freezed=!0,e.content.append(s.container,n.container,o.container),this.scrollable.append(e.container);const r=e=>{e?Object(k.a)(s.subtitle,Object(x.i18n)("PrivacySettingsController.UserCount",[e])):Object(k.a)(s.subtitle,Object(x.i18n)("BlockedEmpty",[e]))};this.listenerSetter.add(a.default)("peer_block",()=>{l()});const l=()=>{P.a.getBlocked().then(e=>{s.freezed=!1,r(e.count),t=e.peerIds})};l(),oi.a.getState().then(e=>{i=e,Object(k.a)(n.subtitle,Object(x.i18n)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),n.freezed=!1}),this.updateActiveSessions()}{const e=new pn({name:"PrivacyTitle"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new st({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new ai(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new st({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new yi(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new st({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new wi(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new st({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ci(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new st({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Si(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new st({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new Li(this.slider).open()}}),c=e=>{const s=t[e];s&&ii.getPrivacy(e).then(e=>{const t=ii.getPrivacyRulesDetails(e),i=t.type===ei.Everybody?"PrivacySettingsController.Everbody":t.type===ei.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=t.disallowPeers.users.length+t.disallowPeers.chats.length,a=t.allowPeers.users.length+t.allowPeers.chats.length;s.subtitle.innerHTML="";const o=Object(x.i18n)(i);s.subtitle.append(o),(n||a)&&s.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)})};e.content.append(s.container,i.container,n.container,o.container,r.container,l.container),this.scrollable.append(e.container);for(const e in t)c(e);a.default.addEventListener("privacy_update",e=>{c(Object(Y.c)(e.key._))})}const e=[];{const t=new pn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ht.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new st({checkboxField:new mt.a({text:"PrivacyAndSecurity.SensitiveText",checked:s}),subtitleLangKey:"PrivacyAndSecurity.SensitiveDesc",noCheckboxSubtitle:!0});t.content.append(i.container),t.container.classList.remove("hide"),this.eventListener.addEventListener("destroy",()=>{const e=i.checkboxField.checked;e!==s&&ht.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new pn({name:"FilterChats"}),t=()=>{new gt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(bt.a)([s],!0);Mi.a.clearAllDrafts().then(()=>{e()})},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},s=Object(U.a)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(s)("click",t),e.content.append(s),this.scrollable.append(e.container)}return Promise.all(e)}updateActiveSessions(){ht.a.invokeApi("account.getAuthorizations").then(e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,Object(x._i18n)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])})}}function Ti(e,t,s,i=1){e/=255,t/=255,s/=255;const n=Math.max(e,t,s),a=Math.min(e,t,s);let o,r,l=(n+a)/2;if(n===a)o=r=0;else{let i=n-a;switch(r=l>.5?i/(2-n-a):i/(n+a),n){case e:o=(t-s)/i+(t1&&(s-=1),s<1/6?e+6*(t-e)*s:s<.5?t:s<2/3?e+(t-e)*(2/3-s)*6:e},r=s<.5?s*(1+t):s+t-s*t,l=2*s-r;n=i(l,r,e+1/3),a=i(l,r,e),o=i(l,r,e-1/3)}return[Math.round(255*n),Math.round(255*a),Math.round(255*o),Math.round(255*i)]}function xi(e){const t=[];if(4===e.length)for(let s=1;s("0"+e.toString(16)).slice(-2)).join("")}function Ai(e){return Oi(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return ki(i[0],i[1],i[2],s)}(e))}function Fi(e){let{h:t,s:s,l:i}=Ti(e[0],e[1],e[2]);s>0&&(s=Math.min(100,s+5+.1*(100-s))),i=Math.max(0,.65*i);return`hsla(${t}, ${s}%, ${i}%, .4)`}class _i{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(_i.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new F.b({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new F.b({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=_i.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),s=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(s?F.a.Neutral:F.a.Error),e="#"+e,this.hexInputField.setValueSilently(e),s&&this.setColor(e,!1,!0)});const s=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",()=>{const e=this.rgbInputField.value.match(s);this.rgbInputField.setState(e?F.a.Neutral:F.a.Error),e&&this.setColor(Ti(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(this.elements.hue,()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()},e=>{this.hueHandler(e.x)},()=>{this.onGrabEnd()})}setColor(e,t=!0,s=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=function(e){const t=xi(e);return Ti(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=Ti(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const i=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+i,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,s)}getCurrentColor(){const e=ki(this.hue,this.saturation,this.lightness,this.alpha),t=Oi(e),s=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:s,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const s=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",s.hex),e&&(this.hexInputField.setValueSilently(s.hex),this.hexInputField.setState(F.a.Neutral)),t&&(this.rgbInputField.setValueSilently(s.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(F.a.Neutral)),this.onChange&&this.onChange(s)}hueHandler(e,t=!0){const s=Object(I.a)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*s);const i=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*s+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",i),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",i),t&&this.updatePicker()}saturationHandler(e,t,s=!0){const i=this.boxRect.width,n=this.boxRect.height,a=Object(I.a)(e-this.boxRect.left,0,i)/i*100,o=Object(I.a)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const l=Object(I.a)(a,0,100),c=100-l/2,d=100-Object(I.a)(o,0,100),h=Object(I.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}_i.BASE_CLASS="color-picker";class Di extends z{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=xi(e),s=this.theme.background,i=Fi(t);s.color=e.toLowerCase(),s.type="color",s.highlightningColor=i,M.default.pushToState("settings",a.default.settings),fr.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=a.default.getTheme();const e=new pn({});this.colorPicker=new _i,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new pn({}),s=this.grid=document.createElement("div");s.classList.add("grid");["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach(e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const i=document.createElement("div");i.classList.add("grid-item-media"),i.style.backgroundColor=e,t.append(i),s.append(t)}),Object(l.b)(s,e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const s=t.dataset.color;s&&this.applyColor(s)},{listenerSetter:this.listenerSetter}),t.content.append(s),this.scrollable.append(t.container),this.applyColor=Object(gs.a)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,s="color"===t.type?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}onOpen(){setTimeout(()=>{const e=this.theme.background;"color"===e.type&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(e.color||"#cccccc"),"color"!==e.type&&(this.colorPicker.onChange=this.onColorChange)},0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}let ji=0;class Bi extends z{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.onUploadClick=()=>{Object(me.f)("image/x-png,image/png,image/jpeg").then(e=>{const t="wallpaper-upload-"+ ++ji,s={_:"photoSize",h:0,w:0,location:{},size:e.size,type:"full"};let i={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[s],file_name:e.name};i=C.a.saveDoc(i);const n=he.a.getCacheContext(i);n.downloaded=e.size,n.url=URL.createObjectURL(e);let a={_:"wallPaper",access_hash:"",document:i,id:t,slug:t,pFlags:{}};const o=he.a.upload(e,e.name),r=Object(ae.a)();r.addNotifyListener=o.addNotifyListener,r.cancel=o.cancel,o.then(t=>{ht.a.invokeApi("account.uploadWallPaper",{file:t,mime_type:e.type,settings:{_:"wallPaperSettings"}}).then(e=>{const t=e.document,s=he.a.getCacheContext(t);Object.assign(s,n),a=e,a.document=C.a.saveDoc(a.document),c.dataset.docId=""+a.document.id,c.dataset.slug=a.slug,this.setBackgroundDocument(a.slug,a.document).then(r.resolve,r.reject)},r.reject)},r.reject),r.then(()=>{this.clicked.delete(a.document.id)},e=>{c.remove()});const l=new ye.a({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),c=this.addWallPaper(a,!1);this.clicked.add(a.document.id),l.attach(c,!1,r)})},this.onResetClick=()=>{const e=M.STATE_INIT.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(w.a)(e.background),M.default.pushToState("settings",a.default.settings),fr.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Me.a)(e.target,"grid-item");if(!t)return;const{docId:s,slug:i}=t.dataset;if(this.clicked.has(s))return;this.clicked.add(s);const n=new ye.a({cancelable:!0,tryAgainOnFail:!1}),a=C.a.getDoc(s),o=()=>{const e=this.setBackgroundDocument(i,a);he.a.getCacheContext(a).url&&!this.theme.background.blur||n.attach(t,!0,e)};n.construct(),Object(l.b)(t,e=>{n.preloader.parentElement?(n.onClick(e),n.detach()):o()},{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then(t=>{he.a.cacheStorage.save("backgrounds/"+e,t)})},this.setBackgroundDocument=(e,t)=>{let s=++this.tempId;const i=()=>s===this.tempId,n=C.a.downloadDoc(t,fr.chat.bubbles?fr.chat.bubbles.lazyLoadQueue.queueId:0),o=Object(ae.a)();return o.addNotifyListener=n.addNotifyListener,o.cancel=n.cancel,n.then(()=>{if(!i())return void o.resolve();const s=this.theme.background,n=t=>{(e=>{const t=document.createElement("img");return new Promise(s=>{Object(rs.a)(t,e,()=>{const e=document.createElement("canvas"),i=t.naturalWidth/t.naturalHeight;1===i?(e.width=50,e.height=e.width/i):i>1?(e.height=50,e.width=e.height/i):e.width=e.height=50;const n=e.getContext("2d");n.drawImage(t,0,0,t.naturalWidth,t.naturalHeight,0,0,e.width,e.height);const a=new Array(4).fill(0),o=n.getImageData(0,0,e.width,e.height).data;for(let e=0;e{if(!i())return void o.resolve();const r=Fi(Array.from(n));s.slug=e,s.type="image",s.highlightningColor=r,M.default.pushToState("settings",a.default.settings),this.saveToCache(e,t),fr.applyCurrentTheme(e,t).then(o.resolve)})},r=he.a.getCacheContext(t);s.blur?setTimeout(()=>{Object(ps.a)(r.url,12,4).then(e=>{i()?n(e):o.resolve()})},200):n(r.url)}),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.theme.background,s="image"===t.type?this.grid.querySelector(`.grid-item[data-slug="${t.slug}"]`):null;e!==s&&(e&&e.classList.remove("active"),s&&s.classList.add("active"))}}init(){this.header.classList.add("with-border"),this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground"),this.theme=a.default.getTheme();{const e=un(this.scrollable),s=Object(U.a)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=Object(U.a)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),n=Object(U.a)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});Object(l.b)(s,this.onUploadClick,{listenerSetter:this.listenerSetter}),Object(l.b)(i,()=>{new Di(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new mt.a({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur,withRipple:!0});this.listenerSetter.add(o.input)("change",()=>{this.theme.background.blur=o.input.checked,M.default.pushToState("settings",a.default.settings);const e=t.querySelector(".active");e&&setTimeout(()=>{this.setBackgroundDocument(e.dataset.slug,C.a.getDoc(e.dataset.docId))},100)}),e.append(s,i,n,o.label)}a.default.addEventListener("background_change",this.setActive),ht.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=un(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),Object(l.b)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}addWallPaper(e,t=!0){if(e.pFlags.pattern||!e.document||0===e.document.mime_type.indexOf("application/"))return;e.document=C.a.saveDoc(e.document);const s=document.createElement("div");s.classList.add("grid-item");const i=document.createElement("div");i.classList.add("grid-item-media");const n=Ss({photo:e.document,message:null,container:i,withoutPreloader:!0,size:r.a.choosePhotoSize(e.document,200,200)});return s.dataset.docId=""+e.document.id,s.dataset.slug=e.slug,"image"===this.theme.background.type&&this.theme.background.slug===e.slug&&s.classList.add("active"),(n.loadPromises.thumb||n.loadPromises.full).then(()=>{ls.a.mutate(()=>{s.append(i)})}),this.grid[t?"append":"prepend"](s),s}}class Ri extends ut.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;fr.chat.input.sendMessageWithDocument(s)?this.hide():console.warn("got no doc by id:",s)},this.h6=document.createElement("h6"),this.h6.append(Object(x.i18n)("Loading")),this.header.append(this.h6),this.addEventListener("close",()=>{E.a.setOnlyOnePlayableGroup("")});const t=document.createElement("div");t.classList.add("sticker-set"),this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("sticker-set-stickers","is-loading"),Object(l.b)(this.stickersDiv,this.onStickersClick,{listenerSetter:this.listenerSetter}),Object(te.f)(this.stickersDiv,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer"),t.append(this.stickersDiv);const s=Object(U.a)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(s),this.body.append(t);new T.b(this.body);this.body.append(this.stickersFooter),this.loadStickerSet()}loadStickerSet(){return cs.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return ct({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,E.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=J.a.wrapEmojiText(e.set.title),this.stickersFooter.classList.toggle("add",!e.set.installed_date),e.set.installed_date?(t=Object(U.a)("btn-primary btn-primary-transparent danger",{noRipple:!0}),t.append(Object(x.i18n)("RemoveStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))):(t=Object(U.a)("btn-primary btn-color-primary",{noRipple:!0}),t.append(Object(x.i18n)("AddStickersCount",[Object(x.i18n)("Stickers",[e.set.count])]))),this.stickersFooter.textContent="",this.stickersFooter.append(t),Object(l.b)(t,()=>{const e=Object(bt.a)([t],!0);cs.a.toggleStickerSet(this.set).then(()=>{this.hide()}).catch(()=>{e()})});const s=new ee.d;this.stickersDiv.classList.remove("is-loading"),this.stickersDiv.innerHTML="";for(let t of e.documents){if("documentEmpty"===t._)continue;const e=document.createElement("div");e.classList.add("sticker-set-sticker");const i=b.b.active.esgSticker.width;Cs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var Ui,Hi=s(2);function Ni(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=Fe.a),function s(){e(),n=Hi.a.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,()=>1e3*(60-(new Date).getSeconds()),t)}var zi=!!(null===(Ui=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===Ui?void 0:Ui.getCurrentPosition)&&!1;class Vi{constructor(e,t,s,i,n){const a="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(a);const o=document.createElement("div");o.classList.add(a+"-details");const r=document.createElement("div");r.classList.add(a+"-name"),Object(x._i18n)(r,e);const l=document.createElement("div");l.classList.add(a+"-value"),l.innerHTML=""+s,o.append(r,l),this.range=new Se({step:t,min:i,max:n},s),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),l.innerText=""+e}}),this.container.append(o,this.range.container)}}class Ki extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=un.bind(null,this.scrollable);{const t=e("Settings"),s=new Vi("TextSize",1,a.default.settings.messagesTextSize,12,20);s.onChange=e=>{M.default.setByKey("settings.messagesTextSize",e)};const i=Object(U.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new Bi(this.slider).open()});const n=new mt.a({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",withRipple:!0});t.append(s.container,i,n.label)}{const t=e("General.Keyboard"),s=document.createElement("form"),i="send-shortcut",n="settings.sendShortcut",a=new st({radioField:new ot({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new st({radioField:new ot({name:i,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});Object(x._i18n)(o.radioField.main,"General.SendShortcut.CtrlEnter",[re.IS_APPLE?"⌘":"Ctrl"]),s.append(a.container,o.container),t.append(s)}if(zi){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new st({radioField:new ot({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new st({radioField:new ot({langKey:"DistanceUnitsMiles",name:i,value:"miles",stateKey:n})});s.append(a.container,o.container),t.append(s)}{const t=e("General.TimeFormat"),s=document.createElement("form"),i="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map(([e,t])=>new st({radioField:new ot({langKey:t,name:i,value:e,stateKey:n})})),r=Ni(()=>{const e=new Date;a.forEach(([t],s)=>{const i=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[s].subtitle.textContent=i})});this.eventListener.addEventListener("destroy",r),s.append(...o.map(e=>e.container)),t.append(s)}{const t=e("AutoDownloadMedia"),s=new mt.a({text:"AutodownloadContacts",name:"contacts",stateKey:"settings.autoDownload.contacts",withRipple:!0}),i=new mt.a({text:"AutodownloadPrivateChats",name:"private",stateKey:"settings.autoDownload.private",withRipple:!0}),n=new mt.a({text:"AutodownloadGroupChats",name:"groups",stateKey:"settings.autoDownload.groups",withRipple:!0}),a=new mt.a({text:"AutodownloadChannels",name:"channels",stateKey:"settings.autoDownload.channels",withRipple:!0});t.append(s.label,i.label,n.label,a.label)}{const t=e("General.AutoplayMedia"),s=new mt.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),i=new mt.a({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",withRipple:!0});t.append(s.label,i.label)}{const t=e("Emoji"),s=new mt.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new mt.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const t=e("Telegram.InstalledStickerPacksController"),s=new mt.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),i=new mt.a({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",withRipple:!0}),n={},o=new ee.d,r=(e,s="append")=>{const i=new st({title:J.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new Ri({id:e.id,access_hash:e.access_hash}).show()}});n[e.id]=i;const a=document.createElement("div");a.classList.add("row-media"),Es({set:e,container:a,group:"GENERAL-SETTINGS",lazyLoadQueue:o,width:48,height:48,autoplay:!0}),i.container.append(a),t[s](i.container)};cs.a.getAllStickers().then(e=>{Object(ms.a)(e);for(const t of e.sets)r(t)}),this.listenerSetter.add(a.default)("stickers_installed",e=>{const t=e;n[t.id]||r(t,"prepend")}),this.listenerSetter.add(a.default)("stickers_deleted",e=>{const t=e;n[t.id]&&(n[t.id].container.remove(),delete n[t.id])}),t.append(s.label,i.label)}}onOpen(){this.init&&(this.init(),this.init=null)}}var Gi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Wi extends z{init(){return Gi(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=un(this.scrollable,void 0,"Bio.Description"),s=document.createElement("div");s.classList.add("input-wrapper"),this.firstNameInputField=new F.b({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new F.b({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new F.b({label:"EditProfile.BioLabel",name:"bio",maxLength:70}),s.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const i=document.createElement("div");i.classList.add("caption"),Object(x.i18n_)({element:i,key:"Bio.Description"}),e.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new et({peerId:a.default.myId,inputFields:e,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),t.append(this.editPeer.avatarEdit.container,s)}{const t=new pn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new pt({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange(),this.setProfileUrl()},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"}),s.append(this.usernameInputField.container);const i=t.caption;i.append(Object(x.i18n)("UsernameSettings.ChangeDescription")),i.append(document.createElement("br"),document.createElement("br"));const n=this.profileUrlContainer=document.createElement("div");n.classList.add("profile-url-container");const a=this.profileUrlAnchor=document.createElement("a");a.classList.add("profile-url"),a.href="#",a.target="_blank",n.append(Object(x.i18n)("UsernameHelpLink",[a])),i.append(n),e.push(this.usernameInputField),t.content.append(s),this.scrollable.append(t.container)}Object(l.b)(this.editPeer.nextBtn,()=>{this.editPeer.nextBtn.disabled=!0;let e=[];e.push(n.default.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value).then(()=>{this.close()},e=>{console.error("updateProfile error:",e)})),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then(e=>n.default.uploadProfilePhoto(e))),this.usernameInputField.isValidToChange()&&e.push(P.a.updateUsername(this.usernameInputField.value)),Promise.race(e).finally(()=>{this.editPeer.nextBtn.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter});const t=P.a.getSelf(),s=yield n.default.getProfile(t.id,!0);this.firstNameInputField.setOriginalValue(t.first_name,!0),this.lastNameInputField.setOriginalValue(t.last_name,!0),this.bioInputField.setOriginalValue(s.about,!0),this.usernameInputField.setOriginalValue(t.username,!0),this.setProfileUrl(),this.editPeer.handleChange()}))}setProfileUrl(){if(this.usernameInputField.input.classList.contains("error")||!this.usernameInputField.value.length)this.profileUrlContainer.style.display="none";else{this.profileUrlContainer.style.display="";let e="https://t.me/"+this.usernameInputField.value;this.profileUrlAnchor.innerText=e,this.profileUrlAnchor.href=e}}}var qi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qi extends z{constructor(){super(...arguments),this.renderResults=e=>qi(this,void 0,void 0,(function*(){yield P.a.getContacts(),e.forEach(e=>{const{dom:t}=qr.addDialogNew({dialog:e,container:this.selector.scrollable,drawStatus:!1,rippleEnabled:!0,avatarSize:46}),s=this.selector.selected.has(e);t.containerEl.append(this.checkbox(s));const i=[];this.dialogsByFilters.forEach((t,s)=>{if(t.has(e)){const e=document.createElement("span");e.innerHTML=J.b.wrapEmojiText(s.title),i.push(e)}});Object(x.join)(i,!1).forEach(e=>{t.lastMessageSpan.append(e)})})})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(){return this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=H("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),this.confirmBtn.addEventListener("click",()=>{const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const s of e)s.isPeerId()?t.push(s.toPeerId()):this.filter.pFlags[s]=!0;let s;s="included"===this.type?e=>t.includes(e):e=>!t.includes(e),Object(f.d)(this.filter.pinnedPeerIds,(e,t)=>{s(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))});const i="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";Object(f.d)(this.filter[i],(e,s)=>{t.includes(e)&&(this.filter[i].splice(s,1),this.filter[n].splice(s,1))}),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=t.map(e=>o.a.getInputPeerById(e)),this.editFolderTab.setFilter(this.filter,!1),this.close()}),this.dialogsByFilters=new Map,i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.dialogsByFilters.set(t,new Set(i.a.dialogsStorage.getFolderDialogs(t.id).map(e=>e.peerId)))})}checkbox(e){const t=new mt.a({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.init&&(this.init(),this.init=null),this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new pn({noDelimiter:!0,name:"FilterChatTypes"});let s;t.container.classList.add("folder-categories"),s="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const i=document.createDocumentFragment();for(const e in s){const t=Object(U.a)("btn-primary btn-transparent folder-category-button",{icon:s[e].ico,text:s[e].text});t.dataset.peerId=e,t.append(this.checkbox()),i.append(t)}t.content.append(i);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new It({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats"}),this.selector.selected=new Set(n);let a=!1;const o=this.selector.add.bind(this.selector);this.selector.add=(e,t,i)=>{if(this.selector.selected.size>=100&&a&&!s[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout(()=>{t.checked=!1},0);return void lt(x.default.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0))}const n=o(e,s[e]?Object(x.i18n)(s[e].text):void 0,i);return s[e]&&n.querySelector("avatar-element").classList.add("tgico-"+s[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const i in e.pFlags)s.hasOwnProperty(i)&&e.pFlags[i]&&t.content.querySelector(`[data-peer-id="${i}"]`).click()}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}open(e,t,s){return this.originalFilter=e,this.filter=Object(w.a)(this.originalFilter),this.type=t,this.editFolderTab=s,super.open()}}class $i extends z{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append(Object(x.i18n)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=H("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new gt("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),i.a.filtersStorage.updateDialogFilter(this.filter,!0).then(e=>{e&&this.close()}).finally(()=>{e.element.removeAttribute("disabled")})},isDanger:!0}]}).show()}};this.menuBtn=Ie({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new pn({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new F.b({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),t.content.append(s);const n=(e,t,s,i)=>{const n=new pn({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),s.forEach(e=>{const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(i[e.name]=t),a.append(t)}),n};this.includePeerIds=n("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=n("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),o=this.excludePeerIds.container.querySelector(".folder-categories");a.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"included",this)}),o.querySelector(".btn").addEventListener("click",()=>{new Qi(this.slider).open(this.filter,"excluded",this)}),this.confirmBtn.addEventListener("click",()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce((e,t)=>e+ +!t.style.display,0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?i.a.filtersStorage.updateDialogFilter(this.filter):i.a.filtersStorage.createDialogFilter(this.filter),e.then(e=>{e&&this.close()}).catch(e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?lt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):lt("Please choose at least one chat for this folder.")}),this.nameInputField.input.addEventListener("input",()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()});const r="edit"===this.type?[i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),i.a.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then(e=>(this.animation=e,le.a.waitForFirstFrame(e))),...r])}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=J.b.wrapDraftText(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach(t=>{const s=this[t],i=qr.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(x.i18n)("FilterShowMoreChats",[n.length])),e.append(o)}a(4)})}editCheckForChange(){if("edit"===this.type){const e=!Object(w.b)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach(e=>e.remove()),t?(this.originalFilter=e,this.filter=Object(w.a)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then(()=>{"edit"===this.type?this.onEditOpen():this.onCreateOpen()})}}var Yi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Xi extends z{constructor(){super(...arguments),this.filtersRendered={}}renderFolder(e,t,s){let n,a,r="",c=[];if("dialogFilterSuggested"===e._)n=e.filter,r=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&c.push(Object(x.i18n)(t))}if(!c.length){const e=i.a.dialogsStorage.getFolderDialogs(n.id);let t=0,s=0,a=0;for(const i of e)o.a.isAnyGroup(i.peerId)?a++:o.a.isBroadcast(i.peerId)?s++:t++;t&&c.push(Object(x.i18n)("Chats",[t])),s&&c.push(Object(x.i18n)("Channels",[s])),a&&c.push(Object(x.i18n)("Groups",[a]))}}if(s)s.subtitle.textContent="",Object(x.join)(c).forEach(e=>{s.subtitle.append(e)});else if(s=new st({title:J.a.wrapEmojiText(n.title),subtitle:r,clickable:!0}),c.length&&Object(x.join)(c).forEach(e=>{s.subtitle.append(e)}),"dialogFilter"===e._){const e=n.id;this.filtersRendered.hasOwnProperty(n.id)||Object(l.b)(s.container,()=>{new $i(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Os(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return Yi(this,void 0,void 0,(function*(){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const e=document.createElement("div");e.classList.add("caption"),Object(x.i18n_)({element:e,key:"ChatList.Filter.Header"}),this.createFolderBtn=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new pn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new pn({name:"FilterRecommended"}),this.suggestedSection.container.style.display="none",this.scrollable.append(this.stickerContainer,e,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),Object(l.b)(this.createFolderBtn,()=>{Object.keys(this.filtersRendered).length>=10?lt("Sorry, you can't create more folders."):new $i(this.slider).open()},{listenerSetter:this.listenerSetter});const t=()=>{this.foldersSection.container.style.display=Object.keys(this.filtersRendered).length?"":"none"};return i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.renderFolder(t,this.foldersSection.content);t()}),this.listenerSetter.add(a.default)("filter_update",e=>{this.filtersRendered.hasOwnProperty(e.id)?this.renderFolder(e,null,this.filtersRendered[e.id]):this.renderFolder(e,this.foldersSection.content),t(),this.getSuggestedFilters()}),this.listenerSetter.add(a.default)("filter_delete",e=>{this.filtersRendered.hasOwnProperty(e.id)&&(this.getSuggestedFilters(),this.filtersRendered[e.id].container.remove(),delete this.filtersRendered[e.id]),t()}),this.listenerSetter.add(a.default)("filter_order",e=>{e.forEach((e,t)=>{const s=this.filtersRendered[e].container;Os(s,s.parentElement,t+1)})}),this.loadAnimationPromise=le.a.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_1").then(e=>(this.animation=e,le.a.waitForFirstFrame(e))),this.getSuggestedFilters(),this.loadAnimationPromise}))}onOpenAfterTimeout(){this.loadAnimationPromise.then(()=>{this.animation.autoplay=!0,this.animation.play()})}getSuggestedFilters(){return ht.a.invokeApi("messages.getSuggestedDialogFilters").then(e=>{this.suggestedSection.container.style.display=e.length?"":"none",Array.from(this.suggestedSection.content.children).slice(1).forEach(e=>e.remove()),e.forEach(e=>{const t=this.renderFolder(e),s=Object(U.a)("btn-primary btn-color-primary",{text:"Add"});t.append(s),this.suggestedSection.content.append(t),Object(l.b)(s,n=>{if(Object(c.a)(n),Object.keys(this.filtersRendered).length>=10)return void lt("Sorry, you can't create more folders.");s.setAttribute("disabled","true");const a=e.filter;a.includePeerIds=[],a.excludePeerIds=[],a.pinnedPeerIds=[],i.a.filtersStorage.createDialogFilter(a,!0).then(e=>{e&&t.remove()}).finally(()=>{s.removeAttribute("disabled")})},{listenerSetter:this.listenerSetter})})})}}class Ji extends V{init(){this.header.classList.add("with-border"),this.container.classList.add("notifications-container","with-border"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new pn({name:e.name}),s=new st({checkboxField:new mt.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new st({checkboxField:new mt.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Dt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Dt.a.isMuted(t);return s.checkboxField.checked=!e,i.checkboxField.checked=t.show_previews,e};o(),this.eventListener.addEventListener("destroy",()=>{const e=!s.checkboxField.checked,a=i.checkboxField.checked;if(e===Dt.a.isMuted(t)&&a===t.show_previews)return;const o=Object(w.a)(t);o._="inputPeerNotifySettings",o.mute_until=e?2147483647:0,o.show_previews=a,Dt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.default)("notify_settings",s=>{const i=Object(Y.c)(s.peer._);e.inputKey===i&&(t=s.notify_settings,o())})})};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new pn({name:"NotificationsOther"}),t=new st({checkboxField:new mt.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new st({checkboxField:new mt.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});M.default.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Dt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Dt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var Zi=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class en extends z{init(){return Zi(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const e=new pn({}),t=new Map,s=ht.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(at.b)();s.forEach(e=>{const s=new st({radioField:new ot({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=it([...t.values()],e=>{x.default.getLangPack(e)});x.default.getCacheLangPack().then(e=>{const s=t.get(e.lang_code);s?s.radioField.setValueSilently(!0):console.error("no row",s,e)}),e.content.append(n)});return this.scrollable.append(e.container),s}))}}class tn extends z{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ie({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new gt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ht.a.logOut()},isDanger:!0}]}).show()}}]);this.header.append(e),this.avatarElem=new Or,this.avatarElem.setAttribute("clickable",""),this.avatarElem.classList.add("profile-avatar","avatar-120"),this.nameDiv=document.createElement("div"),this.nameDiv.classList.add("profile-name"),this.phoneDiv=document.createElement("div"),this.phoneDiv.classList.add("profile-subtitle");const t=document.createElement("div");t.classList.add("profile-buttons");const s="profile-button btn-primary btn-transparent";t.append(this.buttons.edit=Object(U.a)(s,{icon:"edit",text:"EditAccount.Title"})),t.append(this.buttons.folders=Object(U.a)(s,{icon:"folder",text:"AccountSettings.Filters"})),t.append(this.buttons.general=Object(U.a)(s,{icon:"settings",text:"Telegram.GeneralSettingsViewController"})),t.append(this.buttons.notifications=Object(U.a)(s,{icon:"unmute",text:"AccountSettings.Notifications"})),t.append(this.buttons.privacy=Object(U.a)(s,{icon:"lock",text:"AccountSettings.PrivacyAndSecurity"})),t.append(this.buttons.language=Object(U.a)(s,{icon:"language",text:"AccountSettings.Language"})),this.scrollable.append(this.avatarElem,this.nameDiv,this.phoneDiv,t),this.scrollable.container.classList.add("profile-content-wrapper"),this.buttons.edit.addEventListener("click",()=>{new Wi(this.slider).open()}),this.buttons.folders.addEventListener("click",()=>{new Xi(this.slider).open()}),this.buttons.general.addEventListener("click",()=>{new Ki(this.slider).open()}),this.buttons.notifications.addEventListener("click",()=>{new Ji(this.slider).open()}),this.buttons.privacy.addEventListener("click",()=>{new Pi(this.slider).open()}),this.buttons.language.addEventListener("click",()=>{new en(this.slider).open()}),le.a.loadLottieWorkers(),this.fillElements()}fillElements(){const e=P.a.getSelf(),t=e.id.toPeerId(!1);this.avatarElem.setAttribute("peer",""+t),this.nameDiv.append(new Lt.a({peerId:t}).element),this.phoneDiv.innerHTML=e.phone?P.a.formatUserPhone(e.phone):""}}class sn extends z{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new q(e=>{this.uploadAvatar=e});const e=new pn({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new F.b({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new F.b({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const s=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",s),this.channelDescriptionInputField.input.addEventListener("input",s),this.nextBtn=Q({icon:"arrow_next"}),this.nextBtn.addEventListener("click",()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,G.a.createChannel({title:e,about:t,broadcast:!0}).then(e=>{this.uploadAvatar&&this.uploadAvatar().then(t=>{G.a.editPhoto(e,t)}),vn.removeTabFromHistory(this),new Bt(this.slider).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>G.a.inviteToChannel(e,t)})})}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var nn=s(109);class an extends ut.b{constructor(){super("popup-create-contact popup-send-photo popup-new-media",null,{closable:!0,withConfirm:"Add"}),Object(x._i18n)(this.title,"AddContactTitle"),Object(l.b)(this.btnConfirm,()=>{const e=P.a.importContact(s.value,i.value,n.value);e.then(()=>{this.hide()},e=>{"NO_USER"===e.type&&(ct({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),c.disabled=!1)}),c.lockWithPromise(e)},{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const s=new F.b({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),i=new F.b({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new nn.a({required:!0});e.push(s,i,n);const a=()=>{const e=s.value+" "+i.value;c.avatarElem.setAttribute("peer-title",e),c.avatarElem.update()};this.listenerSetter.add(s.input)("input",a),this.listenerSetter.add(i.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=P.a.getSelf(),r=Object(Rs.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new et({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(s.container,i.container,c.avatarElem),this.container.append(t,n.container),this.show()}}class on extends z{init(){this.container.id="contacts-container";const e=Q({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new an},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("Search",e=>{this.openContacts(e)}),this.listenerSetter.add(a.default)("contacts_update",e=>{const t=P.a.isContact(e),s=e.toPeerId();t?this.sortedUserList.add(s):this.sortedUserList.delete(s)}),this.title.replaceWith(this.inputSearch.container),this.middleware=Object(ks.a)()}createList(){const e=new _s,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),qr.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!re.IS_MOBILE&&ci(!0)&&this.inputSearch.input.focus()}openContacts(e){this.init&&(this.init(),this.init=null),this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",P.a.getContactsPeerIds(e,void 0,"online").then(e=>{if(!t())return;const s=this.sortedUserList=this.createList();let i=()=>{const t=Ct.a.height/72*1.25|0;e.splice(0,t).forEach(e=>{s.add(e)}),e.length||(i=void 0,this.scrollable.onScrolledBottom=null)};i(),this.scrollable.onScrolledBottom=()=>{i?i():this.scrollable.onScrolledBottom=null},Object(k.a)(this.scrollable.container,s.list)})}open(){return this.openContacts(),super.open()}}class rn extends z{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!qr.sortedLists[rn.filterId]){const e=qr.createChatList();qr.generateScrollable(e,rn.filterId).container.append(e),qr.setListClickListener(e,null,!0)}const e=qr.scrollables[rn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=qr.filterId,qr.setFilterId(rn.filterId),qr.onTabChange()}onOpenAfterTimeout(){qr.sortedLists[this.wasFilterId].clear()}onClose(){qr.setFilterId(this.wasFilterId),qr.onTabChange()}onCloseAfterTimeout(){return qr.sortedLists[rn.filterId].clear(),super.onCloseAfterTimeout()}}function ln(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(ut.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new gt("popup-confirmation",e).show()})}rn.filterId=1;class cn extends z{constructor(){super(...arguments),this.isLocationWatched=!1}init(){this.container.classList.add("people-nearby-container"),this.setTitle("PeopleNearby"),this.errorCategory=document.createElement("div"),this.errorCategory.classList.add("text","hide","nearby-error"),this.retryBtn=Q({icon:"check"});const e=cs.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?Cs({doc:e,div:t,loop:!1,play:!0,width:86,height:86,emoji:"🧭",needUpscale:!0}).then(()=>{}):t.classList.add("media-sticker-wrapper");const s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PeopleNearbyInfo2"),this.locatedPeers=new Map;const i=()=>{const e=new _s({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onUpdate:e=>{const t=this.locatedPeers.get(e.id),s=[this.parseDistance(t.distance)];e.id.isUser()||s.push(n.default.getChatMembersString(e.id.toChatId())),e.dom.lastMessageSpan.textContent="",e.dom.lastMessageSpan.append(...Object(x.join)(s,!1))},getIndex:e=>2147483647-this.locatedPeers.get(e.id).distance});return qr.setListClickListener(e.list,void 0,void 0,!1),e},a=this.peopleSection=new gn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new gn({name:"ChatsNearbyHeader",sortedList:i()}),r=a.makeButton({text:"MakeMyselfVisible",icon:"location"}),c=a.makeButton({text:"StopShowingMe",icon:"location"}),d=o.makeButton({text:"NearbyCreateGroup",icon:"newgroup"});Object(l.b)(r,()=>{ln({titleLangKey:"MakeMyselfVisibleTitle",descriptionLangKey:"MakeMyselfVisibleInfo",button:{langKey:"OK"}}).then(()=>{this.startWatching()})},{listenerSetter:this.listenerSetter}),Object(l.b)(c,()=>{this.stopWatching()},{listenerSetter:this.listenerSetter}),Object(l.b)(d,()=>{new $(this.slider).open([],!0)},{listenerSetter:this.listenerSetter}),r.classList.add("primary"),c.classList.add("danger"),d.classList.add("primary"),this.content.append(this.retryBtn),this.scrollable.append(t,s,a.container,o.container,this.errorCategory)}parseDistance(e){return"miles"===a.default.settings.distanceUnit?e>1609.34?Object(x.i18n)("MilesAway",[Math.round(e/1609)]):Object(x.i18n)("FootsAway",[Math.round(3.281*e)]):e>=1e3?Object(x.i18n)("KMetersAway2",[e/1e3]):Object(x.i18n)("MetersAway2",[e])}open(){const e=super.open();return e.then(()=>{this.retryBtn.classList.remove("is-visible"),navigator.geolocation.getCurrentPosition(e=>{this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy},console.log(this.latestLocationSaved),P.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy).then(e=>{const t=e.updates[0].peers,s=t.sort((e,t)=>e.distance-t.distance),i=t.filter(e=>"peerChannel"==e.peer._).length,n=t.filter(e=>"peerChannel"!=e.peer._).length;null==s||s.forEach(e=>{const t=o.a.getPeerId(e.peer),s=t.isUser()?this.peopleSection:this.chatsSection;this.locatedPeers.set(t,e),s.sortedList.add(t)}),this.errorCategory.classList.toggle("hide",!(!n&&!i)),this.errorCategory.innerHTML="No groups or channels found around you."})},e=>{this.errorCategory.classList.remove("hide"),this.retryBtn.classList.add("is-visible"),this.retryBtn.addEventListener("click",this.open),e instanceof GeolocationPositionError?this.errorCategory.innerHTML="Location permission denied. Click below to retry.":this.errorCategory.innerHTML="An error has occurred. Please retry later clicking the button below."})}),e}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,lt("Your position is now being shared. Do not close the page or it will be suspended."),P.a.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition(e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,s=e.coords.latitude!==this.latestLocationSaved.latitude,i=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(s||t)&&i&&(P.a.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})}))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,lt("The sharing of your position has been stopped. You will no longer be visible to other users."),P.a.getLocated(0,0,0,!1,0))}calculateDistance(e,t,s,i){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((s-e)*n)+Math.cos(e*n)*Math.cos(s*n)*(1-Math.cos((i-t)*n)/2)))}}var dn=s(7),hn=s(62);class pn{constructor(e={}){const t=this.container=document.createElement("div");t.classList.add("sidebar-left-section-container");const s=this.innerContainer=document.createElement("div");if(s.classList.add("sidebar-left-section"),e.noShadow&&s.classList.add("no-shadow"),e.fakeGradientDelimiter)s.append(mn()),s.classList.add("with-fake-delimiter");else if(e.noDelimiter)s.classList.add("no-delimiter");else{const e=document.createElement("hr");s.append(e)}const i=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2","sidebar-left-section-name"),Object(x.i18n_)({element:t,key:e.name,args:e.nameArgs}),i.append(t)}if(t.append(s),e.caption){const s=this.caption=this.generateContentElement();s.classList.add("sidebar-left-section-caption"),t.append(s),!0!==e.caption&&Object(x.i18n_)({element:s,key:e.caption})}}generateContentElement(){const e=document.createElement("div");return e.classList.add("sidebar-left-section-content"),this.innerContainer.append(e),e}}const un=(e,t,s)=>{const i=new pn({name:t,caption:s});return e.append(i.container),i.content},mn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class gn extends pn{constructor(e){super(e),this.sortedList=e.sortedList,this.content.append(this.sortedList.list)}makeButton(e){const t=Object(U.a)("folder-category-button btn btn-primary btn-transparent",e);return this.title?this.content.insertBefore(t,this.title.nextSibling):this.content.prepend(t),t}}const bn=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new on(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new rn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new mt.a({toggle:!0,checked:"night"===a.default.getTheme().name});n.input.addEventListener("change",()=>{a.default.settings.theme=n.input.checked?"night":"day",M.default.pushToState("settings",a.default.settings),a.default.dispatchEvent("theme_change")}),a.default.addEventListener("theme_change",()=>{n.setValueSilently("night"===a.default.getTheme().name)});const o=[{icon:"saved",text:"SavedMessages",onClick:()=>{setTimeout(()=>{fr.setPeer({peerId:fr.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},zi?{icon:"group",text:"PeopleNearby",onClick:()=>{new cn(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new tn(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new mt.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{fr.openUsername({userName:"TelegramTips"})}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout(()=>{e.remove()},0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([hn.a.set({kz_version:"Z"}),hn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>dn.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{hn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>dn.a.isMainDomain}].filter(Boolean);this.toolsBtn=Ie({},"bottom-right",o,e=>{o.forEach(e=>{e.verify&&e.element.classList.toggle("hide",!e.verify())})}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn);const r=this.toolsBtn.querySelector(".btn-menu"),c=document.createElement("a");c.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",c.target="_blank",c.rel="noopener noreferrer",c.classList.add("btn-menu-footer"),c.addEventListener(l.a,e=>{e.stopPropagation(),Object(te.c)()});const d=document.createElement("span");d.classList.add("btn-menu-footer-text"),d.innerHTML="Telegram Web"+dn.a.suffix+" alpha "+dn.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Ie({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new sn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Bt(this).open({type:"chat",skippable:!1,takeOut:e=>{new $(this).open(e)},title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:t}]),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",e.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",Object(se.ripple)(this.updateBtn),this.updateBtn.append(Object(x.i18n)("Update")),Object(l.b)(this.updateBtn,()=>{location.reload()}),e.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",()=>this.initSearch(),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",s.element.append(this.archivedCount),a.default.addEventListener("folder_unread",e=>{if(1===e.id){const t=e.unreadDialogsCount;this.archivedCount.innerText=""+Object(I.c)(t,1),this.archivedCount.classList.toggle("hide",!t)}}),P.a.getTopPeers("correspondents"),M.default.getState().then(e=>{const t=e.recentSearch||[];for(let e=0,s=t.length;e{fetch("version").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e!==dn.a.versionFull&&(this.hasUpdate=!0,clearInterval(s),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))}).catch(Fe.a)},18e5)})}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new T.b(e),s=()=>{this.backBtn.click()};this.searchGroups={contacts:new O("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,s),globalContacts:new O("GlobalSearch","contacts",void 0,void 0,void 0,void 0,s),messages:new O("SearchMessages","messages"),people:new O(!1,"contacts",!0,"search-group-people",!0,!1,s),recent:new O("Recent","contacts",!0,"search-group-recent",!0,!0,s)};const n=this.searchSuper=new Zs({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0});e.prepend(n.nav.parentElement.parentElement),t.container.append(n.container);n.setQuery({peerId:"".toPeerId(),folderId:0}),n.selectTab(0),n.load(!0);let a=[],o="".toPeerId(),r=0,l=0;const c=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===a.length),this.inputSearch.container.classList.toggle("is-picked",!!a.length),a.length?this.inputSearch.input.style.setProperty("--paddingLeft",a[a.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},d=document.createElement("div");d.classList.add("search-helper"),d.addEventListener("click",e=>{const t=Object(Me.a)(e.target,"selector-user");if(!t)return;const s=t.dataset.key;if(0===s.indexOf("date_")){const[e,t,i]=s.split("_");r=+t,l=+i}else o=s.toPeerId();t.addEventListener("click",()=>{p(t)}),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),a.push(t),c()}),n.nav.parentElement.append(d);const h=(e,t)=>{const s=document.createElement("div");s.classList.add("selector-user");const i=document.createElement("avatar-element");return i.classList.add("selector-user-avatar","tgico"),i.setAttribute("dialog","1"),i.classList.add("avatar-30"),s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Lt.a({peerId:e.toPeerId()}).element),i.setAttribute("peer",""+e)):i.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?s.innerHTML=t:(Object(k.a)(s,t),s.append(t))),s.insertAdjacentElement("afterbegin",i),s},p=e=>{0===e.dataset.key.indexOf("date_")?r=l=0:o="".toPeerId(),e.remove(),Object(f.e)(a,e),setTimeout(()=>{c(),this.inputSearch.onChange(this.inputSearch.value)},0)};this.inputSearch.onClear=()=>{a.forEach(e=>{p(e)})},this.inputSearch.onChange=e=>{if(n.cleanupHTML(),n.setQuery({peerId:o,folderId:o?void 0:0,query:e,minDate:r,maxDate:l}),n.load(!0),d.innerHTML="",n.nav.classList.remove("hide"),!o&&e.trim()){const t=n.middleware.get();Promise.all([i.a.getConversations(e).promise.then(({dialogs:e})=>e.map(e=>e.peerId)),P.a.getContactsPeerIds(e,!0)]).then(e=>{if(!t())return;new Set(e[0].concat(e[1])).forEach(e=>{d.append(h(e))}),n.nav.classList.toggle("hide",!!d.innerHTML)})}if(!r&&e.trim()){const t=[];Object(oe.b)(e,t),t.forEach(e=>{d.append(h("date_"+e.minDate+"_"+e.maxDate,e.title))}),n.nav.classList.toggle("hide",!!d.innerHTML)}},n.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",e=>{const t=Object(ft.a)(e.target,"LI");if(!t)return;const s=Object(Me.a)(t,"search-group");if(!s||s.classList.contains("search-group-recent")||s.classList.contains("search-group-people"))return;const i=t.getAttribute("data-peer-id").toPeerId();M.default.getState().then(e=>{const t=e.recentSearch||[];if(t[0]!==i){Object(f.e)(t,i),t.unshift(i),t.length>20&&(t.length=20),M.default.pushToState("recentSearch",t);for(const e of t)M.default.requestPeer(e,"recentSearch")}})},{capture:!0});let u=document.createElement("div");u.classList.add("search-group-scrollable"),u.append(this.searchGroups.people.list),this.searchGroups.people.container.append(u);new T.a(u);let m,g=!0;const b=Object(D.a)(e.parentElement,"zoom-fade",150,e=>{m&&clearTimeout(m),0!==e||g||(n.selectTab(0,!1),this.inputSearch.onClearClick(),m=window.setTimeout(()=>{m=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")},150)),g=!1});b(0);const v=()=>{this.toolsBtn.classList.remove("is-visible"),this.backBtn.classList.add("is-visible"),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0),re.IS_MOBILE_SAFARI||j.a.findItemByType("global-search")||j.a.pushItem({onPop:()=>{s()},type:"global-search"}),b(1)};this.inputSearch.input.addEventListener("focus",v),v(),this.backBtn.addEventListener("click",e=>{this.toolsBtn.classList.add("is-visible"),this.backBtn.classList.remove("is-visible"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),j.a.removeByType("global-search"),b(0)});const y=H("close");this.searchGroups.recent.nameEl.append(y),y.addEventListener("click",()=>{ln({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then(()=>{M.default.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)M.default.releaseSinglePeer(e,"recentSearch");t.length=0,M.default.pushToState("recentSearch",t)})})})}};de.a.appSidebarLeft=bn;var vn=bn;class fn{constructor(e){this.chat=e,this.bubbles=[],this.detailsMap=new Map,this.groups=[],this.newGroupDiff=121}removeBubble(e){const t=this.detailsMap.get(e);t&&(t.group.length&&(t.group.findAndSplice(t=>t.bubble===e),t.group.length?this.updateGroup(t.group):Object(f.e)(this.groups,t.group)),this.detailsMap.delete(e))}changeBubbleMid(e,t){const s=this.detailsMap.get(e);s&&(s.mid=t)}addBubble(e,t,s){const i=t.date,n=t.mid;let o,r=t.viaBotId||t.fromId;r===a.default.myId&&t.peerId===a.default.myId&&t.fwdFromId===r&&(r=r.toPeerId(!0)),this.removeBubble(e);const l={bubble:e,mid:n,timestamp:i};if(this.bubbles.length){let e,t=-1;for(let e=0;es.mid)break}if(-1!==t&&(e=this.bubbles[t]),e){o=e.group;let t=0,s=0;for(;tt.mid===e);t&&this.updateGroup(t.group)}cleanup(){this.bubbles=[],this.groups=[],this.detailsMap.clear()}}class yn extends ut.b{constructor(e,t,s={}){if(super("popup-date-picker",s.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],Object.assign({body:!0,overlayClosable:!0},s)),this.onPick=t,this.options=s,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const s=+t.dataset.timestamp;this.selectedDate=new Date(s),this.setTitle(),this.setTimeTitle()},this.minDate=s.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&i&&i(+o[1]),o="0"+o[0]),t.setValueSilently(o),s(o.length)})};this.hoursInputField=new F.b({plainText:!0}),this.minutesInputField=new F.b({plainText:!0}),s(23,this.hoursInputField,e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()},e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)}),s(59,this.minutesInputField,e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()}),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),Object(l.b)(this.btnConfirm,()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()},{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const i=document.createElement("div");i.classList.add("popup-centerer"),i.append(this.container),this.element.append(i),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=s.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),s.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e,t=[];const s=new Date;s.setHours(0,0,0,0);const i={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===s.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const i={month:"short",day:"numeric"};n.getFullYear()!==s.getFullYear()&&(i.year="numeric"),t.push(new x.default.IntlDateElement({date:n,options:i}).element)}t.push(new x.default.IntlDateElement({date:n,options:i}).element),this.btnConfirm.firstChild.replaceWith(Object(x.i18n)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new x.default.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const s=document.createElement("button");return s.classList.add("btn-icon","date-picker-month-date"),e&&s.setAttribute("disabled","true"),t&&s.append(t),s}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&b.b.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new x.default.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const s=new Date,i=s.getDay();1!==i&&s.setHours(-24*(i-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new x.default.IntlDateElement({date:s,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),s.setDate(s.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{for(const t of e){const e=t.boundingClientRect,s=t.target.parentElement,i=t.rootBounds;e.bottom=i.top&&e.bottom{let t=e.filter(e=>e.boundingClientRect.top<0).sort((e,t)=>e.boundingClientRect.top-t.boundingClientRect.top)[0];if(!t)return;let s=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,s)},{root:this.container})}addSentinel(e,t){const s=document.createElement("div");return s.classList.add("sticky_sentinel",t),e.appendChild(s)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}a.default.addEventListener("replies_updated",e=>{const t=e;Array.from(document.querySelectorAll(`replies-element[data-post-key="${t.peerId}_${t.mid}"]`)).forEach(e=>{e.message=t,e.render()})});class Sn extends HTMLElement{constructor(){super(),this.updated=!1}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t,s;if(this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),t||(t=document.createElement("div"),t.classList.add("replies-footer-avatars")),e.recent_repliers.slice().reverse().forEach((e,s)=>{let i=t.children[s];i||(i=new Or,i.setAttribute("dialog","0"),i.classList.add("avatar-30"),i.lazyLoadQueue=this.lazyLoadQueue,this.loadPromises&&(i.loadPromises=this.loadPromises)),i.setAttribute("peer",""+o.a.getPeerId(e)),i.parentNode||t.append(i)}),Array.from(t.children).slice(e.recent_repliers.length).forEach(e=>e.remove())):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.append(t),s=e?e.replies?Object(x.i18n)("Comments",[e.replies]):Object(x.i18n)("LeaveAComment"):Object(x.i18n)("ViewInChat"),e){const t=i.a.getHistoryStorage(e.channel_id.toPeerId(!0));let s=!1;e.replies&&(s=void 0!==e.read_max_id&&void 0!==e.max_id?e.read_max_id${(null==e?void 0:e.replies)?Object(I.c)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(i.a.subscribeRepliesThread(this.message.peerId,this.message.mid),i.a.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define("replies-element",Sn);const Ln=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(x._i18n)(e,"EditedMessage"),e},Cn=()=>Object(x.i18n)("SponsoredMessage");var En,In;(In=En||(En={})).setTime=(e,t,s,i,n)=>{var a;const o=new Date(1e3*t.date),r=[];let l,c;const d=!!t.pFlags.sponsored,h=!("action"in t)&&!d;let p=d?void 0:Object(oe.f)(o);if(h){if(t.views){const e=t.post_author||(null===(a=t.fwd_from)||void 0===a?void 0:a.post_author);s.classList.add("channel-post");const i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=Object(I.c)(t.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),r.push(i,n),e){const t=document.createElement("span");t.innerHTML=J.b.wrapEmojiText(e)+", ",r.push(t)}}if(t.edit_date&&"scheduled"!==e.type&&!t.pFlags.edit_hide&&(s.classList.add("is-edited"),r.unshift(l=Ln())),"pinned"!==e.type&&t.pFlags.pinned){s.classList.add("is-pinned");const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),r.unshift(e)}}else d&&r.push(c=Cn());p&&r.push(p);let u=d?void 0:Object(oe.g)(o);h&&(u+=(t.edit_date?"\nEdited: "+Object(oe.g)(new Date(1e3*t.edit_date)):"")+(t.fwd_from?"\nOriginal: "+Object(oe.g)(new Date(1e3*t.fwd_from.date)):""));const m=document.createElement("span");m.classList.add("time","tgico"),u&&(m.title=u),m.append(...r);const g=document.createElement("div");g.classList.add("inner","tgico"),u&&(g.title=u);let b=r;return l&&(b[b.indexOf(l)]=Ln()),c&&(b[b.indexOf(c)]=Cn()),b=b.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")?e.cloneNode(!0):e),p&&(b[b.length-1]=Object(oe.f)(o)),g.append(...b),m.append(g),n.append(m),m},In.renderReplies=({bubble:e,bubbleContainer:t,message:s,messageDiv:i,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new Sn;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},In.setReply=({chat:e,bubble:t,bubbleContainer:s,message:i})=>{const n=!s;n&&(s=t.querySelector(".bubble-content"));const a=n?s.querySelector(".reply"):null;if(!i.reply_to_mid)return a&&a.remove(),void t.classList.remove("is-reply");const o=i.reply_to.reply_to_peer_id?e.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):e.peerId;let r,l=e.appMessagesManager.getMessageByPeer(o,i.reply_to_mid);"messageEmpty"===l._?(e.appMessagesManager.wrapSingleMessage(o,i.reply_to_mid),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:i.reply_to_mid,mid:i.mid}),r=Object(x.i18n)("Loading")):r=new Lt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Is(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var Mn=s(135);function Pn(e,t,s){const i=e.getBoundingClientRect(),n="center"===s?Math.ceil(i.left+(i.right-i.left)/2+1):Math.ceil(i.left+1),a="bottom"===t?Math.floor(i.top+i.height-1):Math.ceil(i.top+1);return document.elementFromPoint(n,a)}function Tn(e){e.style.display="none",e.offsetLeft,e.style.display=""}de.a.getElementByPoint=Pn;var kn=s(81),xn=s(95),On=s(123),An=s(87);const Fn={keywords:{},version:0,langCode:dn.a.langPackCode};class _n{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=dn.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=An.a.get(s).then(t=>(Object(xn.b)(t)||(t={}),Object(w.k)(Fn,t),t.langCode=e,this.keywordLangPacks[e]=t,ht.a.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then(e=>{t.version=e.version;const i=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return x.default.lastRequestedLangCode!==dn.a.langPackCode&&e.push(this.getEmojiKeywords(x.default.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new On.a(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const s=t[e];this.index.indexObject(s,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const s=this.index.search(e);t=Array.from(s).reduce((e,t)=>e.concat(t),[])}else t=this.recent.concat(_n.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=M.default.getState().then(e=>this.recent=Array.isArray(e.recentEmoji)?e.recentEmoji:[])}pushRecentEmoji(e){e=J.b.fixEmoji(e),this.getRecentEmojis().then(t=>{Object(f.e)(t,e),t.unshift(e),t.length>36&&(t.length=36),M.default.pushToState("recentEmoji",t),a.default.dispatchEvent("emoji_recent",e)})}}_n.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const Dn=new _n;de.a&&(de.a.appEmojiManager=Dn);var jn=Dn,Bn=s(143),Rn=s(10);const Un=new Set;function Hn(e,t,s=!1,i=!1){const n=document.createElement("span");let o;if(n.classList.add("super-emoji"),i&&!Rn.a?o=J.a.wrapSingleEmoji(e):(e=J.a.fixEmoji(e),o=J.a.wrapEmojiText(e)),n.innerHTML=o,n.children.length>1){const e=n.firstElementChild;n.innerHTML="",n.append(e)}if(n.firstElementChild&&!Rn.a){const e=n.firstElementChild,t=e.src;if(!Un.has(t)){e.setAttribute("loading","lazy");const s=document.createElement("span");s.classList.add("emoji-placeholder"),a.default.settings.animationsEnabled&&(e.style.opacity="0",s.style.opacity="1"),e.addEventListener("load",()=>{Object(De.b)(()=>{a.default.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),n.classList.remove("empty"),Un.add(t)})},{once:!0}),n.append(s)}}s?t.prepend(n):t.appendChild(n)}function Nn(e){return Object(Me.a)(e,"super-emoji")?3===e.nodeType?e.nodeValue:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),e.getAttribute("alt")||e.innerText):""}class zn{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=Nn(e.target);t&&(fr.chat.input.onEmojiSelected(t,!1),ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)())}}init(){this.content=document.getElementById("content-emoji");const e=["Emoji.SmilesAndPeople","Emoji.AnimalsAndNature","Emoji.FoodAndDrink","Emoji.TravelAndPlaces","Emoji.ActivityAndSport","Emoji.Objects","Emoji.Flags","Skin Tones"],t={},s=new Map([["Emoji.Recent",[]]]);for(const t in Bn.a.Emoji){const i=""+Bn.a.Emoji[t],n=e[+i[0]-1];if(!n)continue;let a=s.get(n);a||(a=[],s.set(n,a)),a[+i.slice(1)||0]=t}s.delete(e.pop()),s.forEach((e,s)=>{const i=document.createElement("div");i.classList.add("emoji-category");const n=document.createElement("div");n.classList.add("category-title"),n.append(Object(x.i18n)(s));const a=document.createElement("div");a.classList.add("super-emojis"),i.append(n,a),e.forEach(e=>{Hn(Object(ie.a)(e),a,!1)}),t[s]=i});const i=this.menu=this.content.previousElementSibling,n=this.scroll=new T.b(this.content,"EMOJI"),o=Object(te.f)(this.content,!0);Promise.all([Object(kn.a)(200),jn.getRecentEmojis().then(e=>{const t=!!e.length,s=t?0:1;this.menu.children[0].classList.toggle("hide",!t),this.menu.children[s].classList.add("active");const a=oa.menuOnClick(i,n,void 0,s);return this.stickyIntersector=a.stickyIntersector,this.setMenuActive=a.setActive,e})]).then(([s,i])=>{o.remove(),this.recentItemsDiv=t["Emoji.Recent"].querySelector(".super-emojis");for(const e of i)Hn(e,this.recentItemsDiv);this.recentItemsDiv.parentElement.classList.toggle("hide",!this.recentItemsDiv.childElementCount),e.unshift("Emoji.Recent"),e.map(e=>{const s=t[e];return s||console.error("no div by category:",e),n.container.append(s),this.stickyIntersector.observeStickyHeaderChanges(s),s})}),this.content.addEventListener("click",this.onContentClick),this.init=null,a.default.addEventListener("emoji_recent",e=>{const t=Array.from(this.recentItemsDiv.children);for(let s=0,i=t.length;s{this.closeScrollTop=this.scroll.scrollTop})}onClose(){}}var Vn=s(130),Kn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Gn{constructor(e,t,s,i=!0){this.element=e,this.group=t,this.scrollable=s,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=Object(ae.a)(),this.timeout=window.setTimeout(()=>{this.timeout=0,this.scrollPromise.resolve()},150)},this.processInvisibleDiv=e=>this.scrollPromise.then(()=>Kn(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),s=e.querySelector("img");if(s&&(s&&s.classList.remove("hide"),yield Object(De.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();E.a.getAnimations(t).forEach(e=>{E.a.checkAnimation(e,!0,!0)})}}))),this.lazyLoadQueue=new ee.c(void 0,(e,t)=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)}),i&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){if(e.querySelector("video"))return;this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId,s=C.a.getDoc(t);return this.scrollPromise.then(()=>{const t=ys({doc:s,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0}).loadPromise;return t.finally(()=>{const t=e.querySelector("video");e.style.opacity="";const s=e.querySelector("img");s&&s.classList.add("hide"),t&&!t.parentElement&&setTimeout(()=>{t.src="",t.load();E.a.getAnimations(t).forEach(e=>{E.a.checkAnimation(e,!0,!0)})},0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)}),t})}})}add(e,t=this.element){var s;let i=e.w,n=e.h;n<100&&(i*=100/n,n=100);const a=Math.min(300,400,i),o=Object(Vn.a)(i,n,a,100),r=document.createElement("div");r.classList.add("gif","fade-in-transition"),r.style.width=o.width+"px",r.style.opacity="0",r.dataset.docId=""+e.id,t.append(r),this.lazyLoadQueue.observe(r);const l=C.a.getThumb(e,!1);let c;!!l&&(c=new Image,c.classList.add("media-poster"),l.cacheContext.url||l.promise.then(()=>{c.src=l.cacheContext.url}));const d=()=>{c&&(r.append(c),r.style.opacity="")};(null===(s=null==l?void 0:l.cacheContext)||void 0===s?void 0:s.url)?Object(rs.a)(c,l.cacheContext.url,d):d()}}class Wn{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",oa.onMediaClick);const t=new T.b(this.content,"GIFS"),s=new Gn(e,aa,t),i=Object(te.f)(this.content,!0);ht.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=C.a.saveDoc(t),s.add(t)}),i.remove()}),la.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var qn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Qn{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{E.a.getAnimations(e).forEach(e=>{t?E.a.checkAnimation(e,!1):E.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t),i=b.b.active.esgSticker.width,n=Cs({doc:s,div:e,width:i,height:i,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0});return n.then(()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))}),n},this.processInvisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t);this.checkAnimationContainer(e,!1),e.innerHTML="",this.renderSticker(s,e)},this.lazyLoadQueue=new ee.b(void 0,(e,t)=>{t||this.processInvisibleDiv(e)})}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,s){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),2===e.sticker&&this.observeAnimatedDiv(t)),Cs({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:2===e.sticker,loadPromises:s}),t}observeAnimatedDiv(e){this.animatedDivs.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisibleDiv})}}class $n{constructor(){this.stickerSets={},this.recentStickers=[],this.mounted=!1,this.queueCategoryPush=[]}categoryPush(e,t="",s,i){const n=document.createElement("div");n.classList.add("category-items","super-stickers");const a=document.createElement("div");return a.classList.add("category-title"),t&&(a.innerHTML=t),e.append(a,n),this.stickyIntersector.observeStickyHeaderChanges(e),this.queueCategoryPush.push({element:e,prepend:i}),s.then(e=>{e.forEach(e=>{n.append(this.superStickerRenderer.renderSticker(e))}),this.queueCategoryPush.length&&(this.queueCategoryPush.forEach(({element:e,prepend:t})=>{t?this.recentDiv.parentElement?(this.stickersDiv.prepend(e),this.stickersDiv.prepend(this.recentDiv)):this.stickersDiv.prepend(e):this.stickersDiv.append(e)}),this.queueCategoryPush.length=0)}),{titleDiv:a}}renderStickerSet(e,t=!1){return qn(this,void 0,void 0,(function*(){const s=document.createElement("div");s.classList.add("sticker-category"),s.dataset.id=""+e.id,s.dataset.access_hash=""+e.access_hash;const i=document.createElement("button");i.classList.add("btn-icon","menu-horizontal-div-item"),this.stickerSets[e.id]={stickers:s,tab:i},t?this.menu.insertBefore(i,this.menu.firstElementChild.nextSibling):this.menu.append(i);const n=cs.a.getStickerSet(e);this.categoryPush(s,J.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Es({set:e,container:i,group:aa,lazyLoadQueue:oa.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){this.content=document.getElementById("content-stickers"),this.recentDiv=document.createElement("div"),this.recentDiv.classList.add("sticker-category","stickers-recent");let e=this.content.previousElementSibling;this.menu=e.firstElementChild;let t=new T.a(e);this.stickersDiv=document.createElement("div"),this.stickersDiv.classList.add("stickers-categories"),this.content.append(this.stickersDiv),a.default.addEventListener("stickers_installed",e=>{const t=e;!this.stickerSets[t.id]&&this.mounted&&this.renderStickerSet(t,!0)}),a.default.addEventListener("stickers_deleted",e=>{const t=e;if(this.stickerSets[t.id]&&this.mounted){const e=this.stickerSets[t.id];e.stickers.remove(),e.tab.remove(),delete this.stickerSets[t.id]}}),this.stickersDiv.addEventListener("click",e=>{const t=e.target;if(Object(Me.a)(t,"category-title")){const e=Object(St.a)(t,"data-id");new Ri({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else oa.onMediaClick(e)});const s=(e=!1)=>{a.default.dispatchEvent("choosing_sticker",!e)};this.scroll=new T.b(this.content,"STICKERS"),this.scroll.setVirtualContainer(this.stickersDiv),this.scroll.onAdditionalScroll=()=>{s()},la.addEventListener("closed",()=>{s(!0)}),la.addEventListener("opened",()=>{s()}),this.stickyIntersector=oa.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(te.f)(this.content,!0);Promise.all([cs.a.getRecentStickers().then(e=>{this.recentStickers=e.stickers.slice(0,20),this.stickerSets.recent={stickers:this.recentDiv,tab:this.menu.firstElementChild},i.remove();const{titleDiv:t}=this.categoryPush(this.recentDiv,"",Promise.resolve(this.recentStickers),!0);t.append(Object(x.i18n)("Stickers.Recent"))}),cs.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new Qn(oa.lazyLoadQueue,aa),la.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(cs.a.pushRecentSticker(e),!(null===(t=this.recentDiv)||void 0===t?void 0:t.parentElement))return;let s=this.recentDiv.querySelector(`[data-doc-id="${e.id}"]`);s||(s=this.superStickerRenderer.renderSticker(e));const i=this.recentDiv.querySelector(".category-items");i.prepend(s),i.childElementCount>20&&Array.from(i.children).slice(20).forEach(e=>e.remove())}onClose(){}}var Yn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Xn=new class{constructor(){this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,s="",i="",n){return ht.a.invokeApi("messages.getInlineBotResults",{bot:P.a.getUserInput(t),peer:o.a.getInputPeerById(e),query:s,geo_point:n?this.getGeoInput(n):void 0,offset:i},{stopTime:-1,noErrorBox:!0}).then(e=>{const t=e.query_id;return e.results.forEach(e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=C.a.saveDoc(e.document)),e.photo&&(e.photo=r.a.savePhoto(e.photo))),this.inlineResults[this.generateQId(t,e.id)]=e}),e})}generateQId(e,t){return e+"_"+t}pushPopularBot(e){P.a.getTopPeers("bots_inline").then(t=>{const s=e.toPeerId(),i=t.findIndex(e=>e.id===s);let n;n=-1!==i?t[i]:{id:s,rating:0},++n.rating,Object(f.f)(t,n,"rating"),M.default.setKeyValueToStorage("topPeersCache")})}switchToPM(e,t,s){return this.setHash[t]={peerId:e,time:Date.now()},a.default.dispatchEvent("history_focus",{peerId:t.toPeerId()}),i.a.startBot(t,void 0,s)}checkSwitchReturn(e){return Yn(this,void 0,void 0,(function*(){const t=P.a.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const s=this.setHash[e];return s&&(delete this.setHash[e],Date.now()-s.time<36e5)?s.peerId:void 0}))}switchInlineQuery(e,t,s,i){a.default.dispatchEvent("history_focus",{peerId:e,threadId:t}),Mi.a.setDraft(e,t,"@"+P.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ht.a.invokeApi("messages.getBotCallbackAnswer",{peer:o.a.getInputPeerById(e),msg_id:v.a.getServerMessageId(t),data:s.data},{stopTime:-1,noErrorBox:!0}).then(e=>{"string"==typeof e.message&&e.message.length&<(J.a.wrapRichText(e.message,{noLinks:!0,noLinebreaks:!0}))})}sendInlineResult(e,t,s,n={}){var a;const o=this.inlineResults[s];if(!o)return;this.pushPopularBot(t);const l=s.split("_"),c=l.shift(),d=l.join("_");if(n.viaBotId=t,n.queryId=c,n.resultId=d,o.send_message.reply_markup&&(n.replyMarkup=o.send_message.reply_markup),"botInlineMessageText"===o.send_message._)n.entities=o.send_message.entities,i.a.sendText(e,o.send_message.message,n);else{let t,s="";const l=o.send_message;switch(l._){case"botInlineMessageMediaAuto":if(s=l.message,"botInlineMediaResult"===o._){const{document:e,photo:s}=o;t=e?C.a.getMediaInput(e):r.a.getMediaInput(s)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(l.geo)},n.geoPoint=l.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(l.geo),title:l.title,address:l.address,provider:l.provider,venue_id:l.venue_id,venue_type:l.venue_type},n.geoPoint=l.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:l.phone_number,first_name:l.first_name,last_name:l.last_name,vcard:l.vcard}}t||(t={_:"messageMediaPending",type:o.type,file_name:o.title||(null===(a=o.content)||void 0===a?void 0:a.url)||o.url,size:0,progress:{percent:30,total:0}}),i.a.sendOther(e,t,n)}}};de.a&&(de.a.appInlineBotsManager=Xn);var Jn=Xn,Zn=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ea extends z{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Me.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;fr.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&Yt.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("SearchGifsTitle",e=>{this.reset(),this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),Object(l.b)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new Gn(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",E.a.checkAnimations(void 0,"GIFS-SEARCH"),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}open(){const e=super.open();return Yt.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return Zn(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield P.a.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=Jn.getInlineResults(Be.c,this.gifBotPeerId,e,this.nextOffset);const{results:s,next_offset:i}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=i,t&&(this.gifsDiv.innerHTML=""),s.length?s.forEach(e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)}):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}class ta extends z{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new ee.d,this.inputSearch=new _("StickersTab.SearchPlaceholder",e=>{this.search(e)}),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),Object(l.b)(this.setsDiv,e=>{const t=Object(Me.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void fr.chat.input.sendMessageWithDocument(e)}const s=Object(Me.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Me.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{cs.a.toggleStickerSet(e.set).then(t=>{t&&(a.textContent="",a.append(Object(x.i18n)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),a.classList.toggle("gray",!!e.set.installed_date))}).finally(()=>{a.removeAttribute("disabled")})})):cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{new Ri(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",E.a.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const s=document.createElement("div");s.classList.add("sticker-set-header");const i=document.createElement("div");i.classList.add("sticker-set-details"),i.innerHTML=`\n
${J.a.wrapEmojiText(e.title)}
\n `;const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append(Object(x.i18n)("Stickers",[e.count])),i.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append(Object(x.i18n)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),s.append(i,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.renderFeatured()}),e}renderFeatured(){return cs.a.getFeaturedStickers().then(e=>{this.inputSearch.value||(e=this.filterRendered("",e)).forEach(e=>{this.renderSet(e.set)})})}filterRendered(e,t){t=t.slice();const s=Array.from(this.setsDiv.children);return Object(f.d)(s,s=>{const i=s.dataset.stickerSet,n=t.findIndex(e=>e.set.id===i);-1!==n?t.splice(n,1):e&&s.dataset.title.toLowerCase().includes(e.toLowerCase())||s.remove()}),E.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?cs.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var sa=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ia extends B.a{constructor(e){super(!1),this.forceClose=!1,this.inited=!1,this.onMouseOut=e=>{if(clearTimeout(this.displayTimeout),!this.isActive())return;const t=e.toElement;t&&Object(Ws.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>sa(this,void 0,void 0,(function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t!==this.isActive())if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.forceClose=!1,this.dispatchEvent("opened")},ue.IS_TOUCH_SUPPORTED?0:200)}else this.dispatchEvent("close"),this.element.classList.remove("active"),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")},ue.IS_TOUCH_SUPPORTED?0:200)})),Object(w.g)(this,e)}attachButtonListener(e,t){let s=!0;ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,()=>{s?(s=!1,this.toggle(!0)):this.toggle()},{listenerSetter:t}):t.add(e)("mouseover",i=>{s&&(t.add(e)("mouseout",this.onMouseOut),s=!1),clearTimeout(this.displayTimeout),this.displayTimeout=window.setTimeout(()=>{this.toggle(!0)},200)})}init(){ue.IS_TOUCH_SUPPORTED||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||clearTimeout(this.displayTimeout)})}isActive(){return this.element.classList.contains("active")}}var na=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const aa="emoticons-dropdown";class oa extends ia{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(E.a.checkAnimations(!0,aa),this.tabId=e,this.searchButton.classList.toggle("hide",0===this.tabId),this.deleteBtn.classList.toggle("hide",0!==this.tabId))},this.checkRights=()=>{const{peerId:e,threadId:t}=fr.chat,s=this.tabsEl.children,n=Array.from(s),a=i.a.canSendToPeer(e,t,"send_stickers");n[2].toggleAttribute("disabled",!a);const o=i.a.canSendToPeer(e,t,"send_gifs");n[3].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||1===Object(xs.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>na(this,void 0,void 0,(function*(){ue.IS_TOUCH_SUPPORTED&&Object(Ks.a)()&&(yield Object(kn.a)(100)),this.element.parentElement!==fr.chat.input.chatInput&&fr.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),oa.lazyLoadQueue.lock(),E.a.lockIntersectionGroup(aa)}))),this.addEventListener("opened",()=>{E.a.unlockIntersectionGroup(aa),oa.lazyLoadQueue.unlock(),oa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{oa.lazyLoadQueue.lock(),E.a.lockIntersectionGroup(aa),E.a.checkAnimations(!0,aa)}),this.addEventListener("closed",()=>{E.a.unlockIntersectionGroup(aa),oa.lazyLoadQueue.unlock(),oa.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new zn,this.stickersTab=new $n,this.gifsTab=new Wn,this.tabs={0:this.emojiTab,1:this.stickersTab,2:this.gifsTab},this.container=this.element.querySelector(".emoji-container .tabs-container"),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=Object(Z.a)(this.tabsEl,this.container,this.onSelectTabClick,()=>{const e=this.tabs[this.tabId];e.init&&e.init(),e.onCloseAfterTimeout&&e.onCloseAfterTimeout(),E.a.checkAnimations(!1,aa)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?Yt.isTabExists(ta)||new ta(Yt).open():Yt.isTabExists(ea)||new ea(Yt).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=fr.chat.input.messageInput;(null===(t=s.lastChild)||void 0===t?void 0:t.tagName)?s.lastElementChild.remove():s.lastChild&&(s.lastChild.textContent.length?s.lastChild.textContent=s.lastChild.textContent.slice(0,-1):s.lastChild.remove());const i=new Event("input",{bubbles:!0,cancelable:!0});fr.chat.input.messageInput.dispatchEvent(i),Object(c.a)(e)});const e=re.IS_APPLE_MOBILE,t=e?1:0;return e&&this.tabsEl.children[1].classList.add("hide"),this.tabsEl.children[t+1].click(),this.tabs[t].init&&this.tabs[t].init(),a.default.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",()=>{e.lock()}),this.addEventListener("closed",()=>{const s=e.intersector.getVisible();for(const e of s)t(e);e.intersector.clearVisible()}),this.addEventListener("opened",()=>{e.unlockAndRefresh()})}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===fr.chat.input.messageInput)return e.getRangeAt(0)}}oa.lazyLoadQueue=new ee.d,oa.menuOnClick=(e,t,s,i=0)=>{let n=-1;const a=t=>t!==i&&(e.children[i].classList.remove("active"),e.children[t].classList.add("active"),i=t,!0),o=new wn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(xs.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Me.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(xs.a)(s);if(!a(i))return;const o=(t.splitUp||t.container).children[i].offsetTop+1;t.container.scrollTop=n=o}),{stickyIntersector:o,setActive:a}},oa.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(ft.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(fr.chat.input.sendMessageWithDocument(i,void 0,t)?(ra.container&&(ra.forceClose=!0,ra.container.classList.add("disable-hover"),ra.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const ra=new oa;de.a.emoticonsDropdown=ra;var la=ra;var ca=s(168);var da=!("undefined"==typeof RTCPeerConnection||re.IS_FIREFOX);var ha,pa=da&&!1;function ua(e,t,s){const i=e.getBoundingClientRect(),n=t.getBoundingClientRect();let{top:a,bottom:o}=n;if(s){const e=t.querySelector(".sticky");if(e){a=e.getBoundingClientRect().bottom}}if(i.top>=o||i.bottom<=a||i.right<=n.left||i.left>=n.right)return null;const r={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},l="visualViewport"in window?window.visualViewport:window,c=(l.width||l.innerWidth,l.height||l.innerHeight);return{rect:{top:i.topo&&o!==c?(r.bottom=!0,++r.vertical,o):i.bottom,left:0},overflow:r}}window.getVisibleRect=ua;class ma extends ut.b{constructor(e,t){super("popup-join-chat-invite",Object(ut.a)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{ht.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{ti.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.default.dispatchEvent("history_focus",{peerId:t})},e=>{"INVITE_REQUEST_SENT"===e.type&&ct({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new Or;s.setAttribute("dialog","0"),s.classList.add("avatar-100"),"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),Ss({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Be.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=J.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(x.i18n)(n?"Subscribers":"Members",[Object(I.d)(t.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,i,o),t.pFlags.request_needed){const e=document.createElement("div");Object(x._i18n)(e,n?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT"}(ha||(ha={}));var ga=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const ba=new Set(["messageActionHistoryClear","messageActionChatCreate"]),va=new Set;pa&&va.add("messageActionPhoneCall");let fa=void 0,ya=0;class wa{constructor(e,t,s,i,n,o,r,l,d,h,p){if(this.chat=e,this.appMessagesManager=t,this.appStickersManager=s,this.appUsersManager=i,this.appInlineBotsManager=n,this.appPhotosManager=o,this.appPeersManager=r,this.appProfileManager=l,this.appDraftsManager=d,this.appMessagesIdsManager=h,this.appChatsManager=p,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.loadedTopTimes=0,this.loadedBottomTimes=0,this.messagesQueuePromise=null,this.messagesQueue=[],this.messagesQueueOnRender=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middleware=Object(ks.a)(),this.replyFollowHistory=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.onBubblesClick=e=>{var t;let s=e.target,i=null;try{i=Object(Me.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Me.a)(s,"bubble-content")){if(i.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages){if(this.dateMessages[e].div===i){new yn(new Date(+e),this.onDatePick).show();break}}return}if(!ue.IS_TOUCH_SUPPORTED&&Object(Me.a)(s,"time"))return void this.chat.selection.toggleByElement(i);if(this.chat.selection.isSelecting&&e.isTrusted){if(i.classList.contains("service")&&void 0===i.dataset.mid)return;return Object(c.a)(e),ue.IS_TOUCH_SUPPORTED&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement(Object(Me.a)(s,"grouped-item")||i)}const n=Object(Me.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Me.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Me.a)(s,"spoiler");if(o){const t=Object(Me.a)(o,"message"),s="is-spoiler-visible",i=t.classList.contains(s);i||Object(c.a)(e);const n=200,a=5e3,r=i?0:2;r&&t.classList.add("will-change");const l=t.dataset.spoilerTimeout;return null!==l&&(clearTimeout(+l),delete t.dataset.spoilerTimeout),void Object(Jt.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(Jt.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}if(Object(Me.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Be.d){const t=this.chat.getMessage(e),s=this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id),i=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread(s,n,i)}else{const t=this.appMessagesManager.filterMessages(this.chat.getMessage(e),e=>!!e.replies)[0],s=t.replies;s&&this.appMessagesManager.getDiscussionMessage(this.peerId,t.mid).then(e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})})}return}const r=Object(Me.a)(s,"is-via");if(r){const t=r.querySelector(".peer-title");if(s===t||Object(Ws.a)(s,t)){const s=t.innerText+" ";return this.appDraftsManager.setDraft(this.peerId,this.chat.threadId,s),void Object(c.a)(e)}}const l=Object(Me.a)(s,"peer-title")||Object(ft.a)(s,"AVATAR-ELEMENT")||Object(St.a)(s,"data-saved-from");if(l&&l!==i){s=l||s;const e=s.dataset.peerId||s.getAttribute("peer"),t=s.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,s]=t.split("_");this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+s})}else{const t=e.toPeerId();t!==Be.c?this.chat.appImManager.setInnerPeer({peerId:t}):lt(x.default.format("HidAccount",!0))}return}if(i.classList.contains("sticker")&&s.parentElement.classList.contains("attachment")){const e=+i.dataset.mid,s=null===(t=this.chat.getMessage(e).media)||void 0===t?void 0:t.document;return void((null==s?void 0:s.stickerSetInput)&&new Ri(s.stickerSetInput).show())}const d=Object(Me.a)(s,"document-with-thumb");if("IMG"===s.tagName&&!s.classList.contains("emoji")&&!s.classList.contains("document-thumb")||s.classList.contains("album-item")||"VIDEO"===s.tagName&&!i.classList.contains("round")||d&&!d.querySelector(".preloader-container")){const t=+(Object(Me.a)(s,"album-item")||Object(Me.a)(s,"document-container")||i).dataset.mid,n=this.chat.getMessage(t);if(!n)return void this.log.warn("no message by messageId:",t);const a="webpage",o=i.classList.contains(a),r=d?e=>Lr.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),l=[],h=o?[t]:Object.keys(this.bubbles).map(e=>+e).filter(e=>{const t=this.chat.getMessage(e),s=this.appMessagesManager.getMediaFromMessage(t);return s&&r(s)}).sort((e,t)=>e-t);h.forEach(e=>{let t;if(d)t=".document-container";else{t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img"}const s=Array.from(this.bubbles[e].querySelectorAll(t)),i=new Set;if(d)s.forEach(e=>{l.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})});else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");s.forEach(s=>{if(t&&!Object(Me.a)(s,"media-container-aspecter"))return;let n=Object(Me.a)(s,"album-item");const a=n||s.parentElement;i.has(a)||(i.add(a),l.push({element:s,mid:n?+n.dataset.mid:e,peerId:this.peerId}))})}}),l.sort((e,t)=>e.mid-t.mid);let p=l.findIndex(e=>e.mid===t);return de.b&&this.log("open mediaViewer single with ids:",h,p,l),l[p]?((new Lr).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:d?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!o,isScheduled:"scheduled"===this.chat.type}).openMedia(n,l[p].element,0,!0,l.slice(0,p),l.slice(p+1)),void Object(c.a)(e)):void this.log("no target for media viewer!",s)}if(-1===["IMG","DIV","SPAN"].indexOf(s.tagName)&&(s=Object(ft.a)(s,"DIV")),-1!==["DIV","SPAN"].indexOf(s.tagName)){if(s.classList.contains("goto-original")){const e=i.dataset.savedFrom,[t,s]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+s})}if(s.classList.contains("forward")){const e=+i.dataset.mid,t=this.appMessagesManager.getMessageByPeer(this.peerId,e);return void new Hs({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Me.a)(e.target,"reply")}catch(e){}if(t&&i.classList.contains("is-reply")){const e=+i.dataset.mid;this.replyFollowHistory.push(e);const t=this.chat.getMessage(e),s=t.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:s,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}},this.onScroll=()=>{if(this.isHeavyAnimationInProgress&&this.scrolledDown)return;const e=this.scrollable.getDistanceToEnd();!ue.IS_TOUCH_SUPPORTED&&0!==this.scrollable.lastScrollDirection&&e>0&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350)),e<300&&(this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.bubblesContainer.classList.add("scrolled-down"),this.scrolledDown=!0):this.bubblesContainer.classList.contains("scrolled-down")&&(this.bubblesContainer.classList.remove("scrolled-down"),this.scrolledDown=!1),this.chat.topbar.pinnedMessage&&this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection),this.setStickyDateManually()},this.onDatePick=e=>{const t=this.peerId;this.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then(e=>{var s;(null===(s=null==e?void 0:e.messages)||void 0===s?void 0:s.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")})},this.listenerSetter=new R.a,this.bubblesContainer=document.createElement("div"),this.bubblesContainer.classList.add("bubbles","scrolled-down"),this.chatInner=document.createElement("div"),this.chatInner.classList.add("bubbles-inner"),this.setScroll(),this.bubblesContainer.append(this.scrollable.container),this.log=this.chat.log,this.bubbleGroups=new fn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new ee.d,this.lazyLoadQueue.queueId=++ya,this.listenerSetter.add(a.default)("history_update",({storage:e,peerId:t,mid:s})=>{if(this.chat.getMessagesStorage()===e){const e=this.bubbles[s];if(!e)return;const t=this.chat.getMessage(s);if(+e.dataset.timestamp>=t.date+Ze.a.serverTimeOffset-1)return void this.bubbleGroups.changeBubbleMid(e,s);this.setBubblePosition(e,t,!1),this.scrollingToBubble&&this.scrollToEnd()}}),this.listenerSetter.add(a.default)("dialog_flush",({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map(e=>+e))}),this.listenerSetter.add(a.default)("message_sent",e=>{var t,s,i,n,o,r,l,c;const{storage:d,tempId:h,tempMessage:p,mid:u}=e;if(this.chat.getMessagesStorage()!==d)return;const m=this.getMountedBubble(h,p)||this.getMountedBubble(u);if(m){const e=this.chat.getMessage(u),a=m.bubble;if(e.replies){const t=a.querySelector("replies-element");t&&(t.message=e,t.init())}if(null===(t=e.media)||void 0===t?void 0:t.document){const t=a.querySelector(`.document-container[data-mid="${h}"] .document`);if(t){const a=Object(Me.a)(t,"document-container");!(null===(n=null===(i=null===(s=p.media)||void 0===s?void 0:s.document)||void 0===i?void 0:i.thumbs)||void 0===n?void 0:n.length)&&(null===(o=e.media.document.thumbs)||void 0===o?void 0:o.length)&&t.replaceWith(ws({message:e})),a&&(a.dataset.mid=""+u)}}if(e.grouped_id){const e=a.querySelector(`.grouped-item[data-mid="${h}"]`)||a;e&&(e.dataset.mid=""+u)}if(null===(r=e.media)||void 0===r?void 0:r.poll){const t=a.querySelector("poll-element");if(t){const s=e.media.poll;t.message=e,t.setAttribute("poll-id",s.id),t.setAttribute("message-id",""+u)}}if(null===(l=e.media)||void 0===l?void 0:l.document){const t=a.querySelector(`audio-element[data-mid="${h}"], .document[data-doc-id="${h}"], .media-round[data-mid="${h}"]`);t&&(t instanceof Ne||t.classList.contains("media-round")?(t.dataset.mid=""+e.mid,delete t.dataset.isOutgoing,t.message=e,t.onLoad(!0)):t.dataset.docId=e.media.document.id)}(null===(c=e.media)||void 0===c?void 0:c.webpage)&&!a.querySelector(".web")&&Object(Ts.c)().then(()=>{this.safeRenderMessage(e,!0,!1,a,!1),this.scrollToBubbleIfLast(a)})}else this.log.warn("message_sent there is no bubble",e);const g=this.bubbles;if(g[h]){const e=g[h];g[u]=e,delete g[h],Object(De.b)(()=>{e.classList.contains("is-sending")&&(e.classList.remove("is-sending"),e.classList.add(this.peerId===a.default.myId&&"scheduled"!==this.chat.type?"is-read":"is-sent"))}),e.dataset.mid=""+u}if(this.unreadOut.has(h)&&(this.unreadOut.delete(h),this.unreadOut.add(u)),"scheduled"===this.chat.type){(Date.now()/1e3|0)>=p.date-10&&this.deleteMessagesByIds([u])}}),this.listenerSetter.add(a.default)("message_edit",({storage:e,peerId:t,mid:s})=>{if(e!==this.chat.getMessagesStorage())return;const i=this.chat.getMessage(s),n=i.grouped_id?this.getGroupedBubble(i.grouped_id):this.getMountedBubble(s);if(!n)return;const a="scheduled"===this.chat.type,o=this.scrolledDown;this.safeRenderMessage(n.message,!0,!1,n.bubble,a),o&&this.scrollToBubbleIfLast(n.bubble),a&&(this.messagesQueuePromise||Promise.resolve()).then(()=>{this.deleteEmptyDateGroups()})}),this.listenerSetter.add(a.default)("album_edit",({peerId:e,groupId:t,deletedMids:s})=>{if(e!==this.peerId)return;const i=this.appMessagesManager.getMidsByAlbum(t).concat(s).find(e=>this.bubbles[e]);if(!i)return;const n=Object(w.e)(this.appMessagesManager.groupedMessagesStorage[t],"asc").pop();this.safeRenderMessage(this.chat.getMessage(n),!0,!1,this.bubbles[i],!1)}),this.listenerSetter.add(a.default)("messages_downloaded",({peerId:e,mids:t})=>{const s=this.getMiddleware();Object(Ts.c)().then(()=>{s()&&t.forEach(t=>{Object(f.d)(this.needUpdate,(s,i)=>{if(s.replyMid===t&&s.replyToPeerId===e){const{mid:e,replyMid:t}=this.needUpdate.splice(i,1)[0],n=this.bubbles[e];if(!n)return;const a=this.chat.getMessage(e);this.appMessagesManager.getMessageByPeer(s.replyToPeerId,t).deleted&&delete a.reply_to_mid,En.setReply({chat:this.chat,bubble:n,message:a})}})})})}),this.listenerSetter.add(this.bubblesContainer)("click",this.onBubblesClick),ue.IS_TOUCH_SUPPORTED){const e="is-gesturing-reply",t=64,s=.75*t;let i,n,a=!1;js({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Me.a)(t.target,"bubble"),i&&(Object(Jt.a)(i,e,!0,250),i.offsetLeft,n?(n.classList.remove("is-visible"),n.style.opacity=""):(n=document.createElement("span"),n.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),i.append(n)),!!i),onSwipe:(e,o)=>{a=e>=s,a&&!n.classList.contains("is-visible")&&n.classList.add("is-visible"),n.style.opacity=""+Math.min(1,e/s);const r=-Math.max(0,Math.min(t,e));i.style.transform=`translateX(${r}px)`,Object(te.b)()},onReset:()=>{const t=i;Object(Jt.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(De.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let u;de.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Me.a)(e.target,"grouped-item")||Object(Me.a)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",this.chat.getMessage(e)),this.highlightBubble(t)}}),re.IS_MOBILE||"pinned"===this.chat.type||this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{if(this.chat.selection.isSelecting||!this.chat.canSend())return;const t=e.target,s=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(s&&!s.classList.contains("bubble-first")){const e=+s.dataset.mid;if(this.chat.getMessage(e).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}),Object(Ts.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),u=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,u&&u()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),u=null},this.listenerSetter)}constructPeerHelpers(){if(this.listenerSetter.add(a.default)("history_append",({storage:e,mid:t})=>{e===this.chat.getMessagesStorage()&&(this.scrollable.loadedAll.bottom?this.renderNewMessagesByIds([t],!0):this.chat.setMessageId())}),this.listenerSetter.add(a.default)("history_multiappend",e=>{if(!(this.peerId in e))return;const t=Array.from(e[this.peerId]).slice().sort((e,t)=>t-e);this.renderNewMessagesByIds(t)}),this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{e===this.peerId&&this.deleteMessagesByIds(Array.from(t))}),this.listenerSetter.add(a.default)("dialog_unread",({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),this.updateUnreadByDialog())}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.peerId]&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{this.peerId===e.peerId&&this.chat.input.setUnreadCount()}),this.listenerSetter.add(a.default)("chat_update",e=>{if(this.peerId===e.toPeerId(!0)){this.chatInner.classList.contains("has-rights")!==this.chat.canSend()&&(this.finishPeerChange(),this.chat.input.finishPeerChange())}}),this.listenerSetter.add(a.default)("settings_updated",e=>{if("settings.emoji.big"===e.key){const e=this.scrollable.isScrolledDown;e||this.setMessagesQueuePromise();Object(w.e)(this.bubbles,"desc").forEach(e=>{const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji")){const s=this.chat.getMessage(e);this.safeRenderMessage(s,void 0,!1,t)}}),e?this.scrollable.scrollTop=99999:this.performHistoryResult([],!0,!1,void 0)}}),this.listenerSetter.add(a.default)("message_views",({peerId:e,views:t,mid:s})=>{this.peerId===e&&Object(De.b)(()=>{const e=this.bubbles[s];if(!e)return;const i=Array.from(e.querySelectorAll(".post-views"));if(i.length){const e=Object(I.c)(t,1);let s=!1;i.forEach(t=>{(s||t.innerHTML!==e)&&(s=!0,t.innerHTML=e)})}})}),this.unreadedObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=e.target,s=this.unreaded.get(t);this.onUnreadedInViewport(t,s)}})}),this.viewsObserver=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.viewsObserver.unobserve(e.target),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this;e&&e.random_id&&(delete e.random_id,this.chat.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId()),random_id:e.random_id}))}}})}),this.sendViewCountersDebounced=dt(()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.appMessagesManager.incrementMessageViews(this.peerId,e)},1e3,!1,!0),"ResizeObserver"in window){let e=this.scrollable.container.offsetHeight,t=!1,s=!1,i=0,n=0,a=0;const o=()=>{const o=this.scrollable.container.offsetHeight,r=this.scrollable.isScrolledDown;o===e||s&&r||(n+=e-o),n&&(this.scrollable.scrollTop+=Math.round(n)),e=o,i=0,a=0,n=0,t=!1,s=!1},r=e=>{a&&window.cancelAnimationFrame(a),a=window.requestAnimationFrame(e?o:()=>{a=window.requestAnimationFrame(o)})};new ResizeObserver(a=>{if(s)return void r(!1);const o=a[0].contentRect.height;if(!e)return void(e=o);const l=e-o;let c=l+n;const d=c%1;if(c-=d,!t&&(t=!0,l<0&&this.scrollable.isScrolledDown))return n=-l,s=!0,void r(!1);if(i+=c,c){const e=this.scrollable.scrollTop+c;this.scrollable.scrollTop=e}r(!1),n=d,e=o}).observe(this.bubblesContainer)}}setStickyDateManually(){const e=Object.keys(this.dateMessages).map(e=>+e).sort((e,t)=>t-e);let t;const{scrollTop:s}=this.scrollable.container;if(s>0)for(const s of e){const e=this.dateMessages[s],i=ua(e.container,this.scrollable.container);if(i&&i.overflow.top)t=e.div;else if(t)break}if(t!==this.previousStickyDate){if(t){const e=!this.previousStickyDate;e&&t.classList.add("no-transition"),t.classList.add("is-sticky"),e&&(t.offsetLeft,t.classList.remove("no-transition"))}this.previousStickyDate&&this.previousStickyDate!==t&&this.previousStickyDate.classList.remove("is-sticky"),this.previousStickyDate=t}}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.unreadedObserver.unobserve(e),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=a.default.idle.focusPromise.then(()=>{if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map(e=>+e));t>=e&&(t=Math.max(this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).maxId||0,t))}this.unreaded.forEach((e,s)=>{e<=t&&this.onUnreadedInViewport(s,e)});const s=[];for(const e of this.unreadedSeen){const t=this.chat.getMessage(e);this.appMessagesManager.isMentionUnread(t)&&s.push(e)}return this.appMessagesManager.readMessages(this.peerId,s),this.unreadedSeen.clear(),de.b&&this.log("will readHistory by maxId:",t),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch(e=>{this.log.error("readHistory err:",e),this.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)}).finally(()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())})})}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",e=>{const{peerId:t,mids:s,pinned:i}=e;t===this.peerId&&s&&(i||this.deleteMessagesByIds(s))})}constructScheduledHelpers(){const e=()=>{this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size)};this.listenerSetter.add(a.default)("scheduled_new",({peerId:t,mid:s})=>{t===this.peerId&&(this.renderNewMessagesByIds([s]),e())}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:t,mids:s})=>{t===this.peerId&&(this.deleteMessagesByIds(s),e())})}onGoDownClick(){if(this.replyFollowHistory.length){Object(f.d)(this.replyFollowHistory,(e,t)=>{const s=this.bubbles[e];let i=!0;if(s){const e=s.getBoundingClientRect();i=Ct.a.height/2>e.top}else{this.chat.getMessage(e).deleted||(i=!1)}i&&this.replyFollowHistory.splice(t,1)}),this.replyFollowHistory.sort((e,t)=>t-e);const e=this.replyFollowHistory.pop();this.chat.setMessageId(e)}else this.chat.setMessageId()}getBubbleByPoint(e){let t=Pn(this.scrollable.container,e,"center");return t&&(t=Object(Me.a)(t,"bubble")),t}getGroupedBubble(e){const t=this.appMessagesManager.groupedMessagesStorage[e];for(const[e]of t)if(this.bubbles[e]){const s=Math.max(...t.keys());return{bubble:this.bubbles[e],mid:+e,message:this.chat.getMessage(s)}}return null}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t=this.chat.getMessage(e)){if(t.grouped_id&&this.appMessagesManager.getMidsByAlbum(t.grouped_id).length>1){const s=this.getGroupedBubble(t.grouped_id);if(s)return s.bubble=s.bubble.querySelector(`.document-container[data-mid="${e}"]`)||s.bubble,s}const s=this.bubbles[e];if(s)return{bubble:s,mid:e,message:t}}findNextMountedBubbleByMsgId(e){return this.bubbles[Object(w.e)(this.bubbles).find(t=>{var s;return!(t+e).sort((e,t)=>e-t);if(s.length)if(e)de.b&&this.log("Will load more (up) history by id:",s[0],"maxId:",s[s.length-1],t),this.getHistory(s[0],!0,void 0,void 0,t);else{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);if(-1!==s.indexOf(e.maxId))return void this.setLoaded("bottom",!0);de.b&&this.log("Will load more (down) history by id:",s[s.length-1],t),this.getHistory(s[s.length-1],!1,!0,void 0,t)}}setScroll(){this.scrollable=new T.b(null,"IM",300),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),ue.IS_TOUCH_SUPPORTED&&(this.scrollable.container.addEventListener("touchmove",()=>{this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling")},{passive:!0}),this.scrollable.container.addEventListener("touchend",()=>{this.chatInner.classList.contains("is-scrolling")&&(this.isScrollingTimeout&&clearTimeout(this.isScrollingTimeout),this.isScrollingTimeout=window.setTimeout(()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0},1350))},{passive:!0}))}updateUnreadByDialog(){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),t=this.peerId===a.default.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(t.classList.contains("is-sending"))continue;t.classList.remove("is-sent","is-sending"),t.classList.add("is-read")}this.unreadOut.delete(e)}}deleteMessagesByIds(e,t=!0){let s=!1;e.forEach(e=>{if(!(e in this.bubbles))return;s=!0;const t=this.bubbles[e];delete this.bubbles[e],this.skippedMids.delete(e),this.firstUnreadBubble===t&&(this.firstUnreadBubble=null),this.bubbleGroups.removeBubble(t),this.unreadedObserver&&(this.unreadedObserver.unobserve(t),this.unreaded.delete(t)),this.viewsObserver&&(this.viewsObserver.unobserve(t),this.viewsMids.delete(e)),t.remove(),this.emptyPlaceholderMid===e&&(this.emptyPlaceholderMid=void 0)}),s&&(t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),E.a.checkAnimations(!1,gr),this.deleteEmptyDateGroups(),this.onScroll())}renderNewMessagesByIds(e,t){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const s=this.getMiddleware();t.then(()=>{s()&&this.renderNewMessagesByIds(e)})}return}this.chat.threadId&&(e=e.filter(e=>{const t=this.chat.getMessage(e).reply_to;return t&&(t.reply_to_top_id||t.reply_to_msg_id)===this.chat.threadId})),e=e.filter(e=>!this.bubbles[e]),t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const s=this.getMiddleware();let i,n=!1;if(!this.isTopPaddingSet){const{clientHeight:e,scrollHeight:t}=this.scrollable.container;n=e===t,n&&(i=this.chatInner,i.style.paddingTop=e+"px",this.scrollable.scrollTop=t,this.isTopPaddingSet=!0)}const a=this.performHistoryResult(e,!1,!0);t&&a.then(()=>{if(!s())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[Math.max(...e)]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();n&&a.then(()=>{s()&&n&&(i.style.paddingTop="",this.isTopPaddingSet=!1)})})}getLastBubble(){const e=this.getLastDateGroup();if(e)return e.lastElementChild}scrollToBubble(e,t,s,i){const n=Object(Me.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(xs.a)(n)===(this.stickyIntersector?2:1)){a=n.parentElement}const o=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper");return this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:s,forceDuration:i,axis:"y",getNormalSize:o?({rect:e})=>{let t=Ct.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||Ct.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a})}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return ga(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}getLastDateGroup(){let e,t=0;for(const s in this.dateMessages){const i=this.dateMessages[s];i.firstTimestamp>t&&(e=i.container,t=i.firstTimestamp)}return e}scrollToBubbleIfLast(e){return ga(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout(()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]},2e3)}getDateContainerByMessage(e,t){const s=new Date(1e3*e.date);s.setHours(0,0,0);const i=s.getTime();if(!this.dateMessages[i]){let t;const n=new Date;n.setHours(0,0,0,0);const a="scheduled"===this.chat.type;if(n.getTime()===s.getTime())t=Object(x.i18n)(a?"Chat.Date.ScheduledForToday":"Date.Today");else if(a&&2147483646===e.date)t=Object(x.i18n)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};s.getFullYear()!==n.getFullYear()&&(e.year="numeric"),t=new x.default.IntlDateElement({date:s,options:e}).element,a&&(t=Object(x.i18n)("Chat.Date.ScheduledFor",[t]))}const o=document.createElement("div");o.className="bubble service is-date";const r=document.createElement("div");r.classList.add("bubble-content");const l=document.createElement("div");l.classList.add("service-msg"),l.append(t),r.append(l),o.append(r);const c=document.createElement("section");c.className="bubbles-date-group",c.append(o),this.dateMessages[i]={div:o,container:c,firstTimestamp:s.getTime()};const d=Object(w.e)(this.dateMessages,"asc");let h,p=0,u=d.length;for(;p+e)))}else this.isFirstLoad=!0;const m=this.chatInner;this.cleanup();const g=this.chatInner=document.createElement("div");let b;n?(g.className=m.className,g.classList.remove("disable-hover","is-scrolling")):g.classList.add("bubbles-inner"),this.lazyLoadQueue.lock(),b=l?{promise:Object(Ts.c)().then(()=>this.performHistoryResult(l.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,d,p);const{promise:v,cached:f}=b;f||n||(h.container.textContent="",this.chat.finishPeerChange(r,d,t,s),this.preloader.attach(this.bubblesContainer)),E.a.lockGroup(gr);const y=v.then(()=>{if(f?n||this.chat.finishPeerChange(r,d,t,s):this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),h.lastScrollDirection=0,h.lastScrollTop=0,Object(k.a)(h.container,g),E.a.unlockGroup(gr),E.a.checkAnimations(!1,gr),this.lazyLoadQueue.unlock(),l)h.scrollTop=l.top;else if(o&&d||r){const e=u>0&&(u{h.checkForTriggers()}),this.chat.dispatchEvent("setPeer",t,!d);const m=this.appMessagesManager.isFetchIntervalNeeded(e);if(l||m?p.then(()=>{if(i()&&(h.checkForTriggers(),m)){const t=()=>{this.fetchNewPromise=new Promise(s=>{i()&&this.appMessagesManager.isFetchIntervalNeeded(e)?this.appMessagesManager.getNewHistory(e,this.chat.threadId).then(e=>{if(!i()||!e)return void s();const n=e.history.slice.isEnd(Mn.a.Bottom);h.loadedAll.bottom&&h.loadedAll.bottom!==n&&(this.setLoaded("bottom",n),this.onScroll()),setTimeout(t,3e4),s()}):s()}).finally(()=>{this.fetchNewPromise=void 0})};n?setTimeout(t,3e4):t()}}):t&&!this.bubbles[o]&&t!==o||this.setLoaded("bottom",!0),this.log("scrolledAllDown:",h.loadedAll.bottom),h.loadedAll.bottom&&o&&!this.unreaded.size&&this.onScrolledAllDown(),"chat"===a){const t=this.appMessagesManager.getDialogOnly(e);(null==t?void 0:t.pFlags.unread_mark)&&this.appMessagesManager.markDialogUnread(e,!0)}}).catch(e=>{throw this.log.error("getHistory promise error:",e),this.preloader.detach(),e});return{cached:f,promise:y}}onScrolledAllDown(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);this.appMessagesManager.readHistory(this.peerId,e.maxId,this.chat.threadId,!0)}}finishPeerChange(){const e=this.appPeersManager.isChannel(this.peerId),t=this.chat.canSend();this.chatInner.classList.toggle("has-rights",t),this.bubblesContainer.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",this.chat.isAnyGroup()),this.chatInner.classList.toggle("is-channel",e)}renderMessagesQueue(e,t,s,i){return this.messagesQueue.push({message:e,bubble:t,reverse:s,promises:i}),this.setMessagesQueuePromise()}setMessagesQueuePromise(){return this.messagesQueuePromise||!this.messagesQueue.length?Promise.resolve():this.messagesQueuePromise=new Promise((e,t)=>{setTimeout(()=>{const s=this.messagesQueue.slice();this.messagesQueue.length=0;const i=s.reduce((e,{promises:t})=>(e.push(...t),e),[]);this.log("promises to call",i,s,this.isHeavyAnimationInProgress);const n=this.getMiddleware();Promise.all(i).then(()=>{if(!n())throw"setMessagesQueuePromise: peer changed!";this.messagesQueueOnRender&&this.messagesQueueOnRender(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional(),s.forEach(({message:e,bubble:t,reverse:s})=>{this.setBubblePosition(t,e,s)}),e(),this.messagesQueuePromise=null,this.messagesQueue.length&&this.setMessagesQueuePromise(),this.setUnreadDelimiter()}).catch(t)},0)})}setBubblePosition(e,t,s){if(t.pFlags.local)return void this.chatInner[t.pFlags.sponsored?"append":"prepend"](e);const i=this.getDateContainerByMessage(t,s);if("scheduled"===this.chat.type||"pinned"===this.chat.type){const s=this.stickyIntersector?2:1;let n=Array.from(i.container.children).slice(s),a=0,o=0;for(;as.includes(e)));i.className=n.join(" "),S=i.lastElementChild,S.classList.contains("bubble-content-wrapper")||(S=i.querySelector(".bubble-content-wrapper")),w=S.firstElementChild,w.innerHTML="",w.style.cssText="",S.innerHTML="",S.appendChild(w);const a=S.style.transitionDelay;S.style.cssText="",S.style.transitionDelay=a,i===this.firstUnreadBubble&&i.classList.add("is-first-unread");const o=+i.dataset.mid;+e.mid===o||(delete this.bubbles[o],this.skippedMids.delete(o))}else if(S=document.createElement("div"),S.classList.add("bubble-content-wrapper"),w=document.createElement("div"),w.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),S.appendChild(w),i.appendChild(S),!f&&!e.pFlags.out&&this.unreadedObserver){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=C.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&E.length===e.length){if(a.default.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(C);if(1===e.length&&!I&&t)I={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=M,i.classList.add("emoji-"+e.length+"x"),w.append(t)}i.classList.add("is-message-empty","emoji-big"),T=!0,P=!1,k=!1}i.classList.add("can-have-big-emoji")}}k&&g(y,M);const O=En.setTime(this.chat,e,i,w,y);if(w.prepend(y),p&&e.views){if(!(null===(h=e.fwd_from)||void 0===h?void 0:h.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),w.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.viewsObserver&&this.viewsObserver.observe(i)}const A=p&&e.reply_markup;if(A&&"replyInlineMarkup"===A._&&A.rows&&A.rows.length){const t=A.rows,s=document.createElement("div");s.classList.add("reply-markup"),t.forEach(t=>{const i=t.buttons;if(!i||!i.length)return;const n=document.createElement("div");n.classList.add("reply-markup-row"),i.forEach(t=>{const s=J.b.wrapRichText(t.text,{noLinks:!0,noLinebreaks:!0});let i;switch(t._){case"keyboardButtonUrl":{const e=J.b.wrapRichText(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=Object(zs.a)(e).firstElementChild,i.classList.add("is-link","tgico");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline","tgico"),Object(l.b)(i,s=>{Object(c.a)(s);const i=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.appInlineBotsManager.checkSwitchReturn(i).then(e=>e||new Promise((e,t)=>{new Hs({[this.peerId]:[]},t=>{e(t)},!0).addEventListener("close",()=>{t()})})),n.then(e=>{const s=this.peerId===e?this.chat.threadId:void 0;this.appInlineBotsManager.switchInlineQuery(e,s,i,t.query)})});break;default:i=document.createElement("button")}i.classList.add("reply-markup-button","rp"),i.insertAdjacentHTML("beforeend",s),Object(se.ripple)(i),n.append(i)}),s.append(n)}),Object(l.b)(s,s=>{let i=s.target;if(i.classList.contains("reply-markup-button")||(i=Object(Me.a)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline"))return;Object(c.a)(s);const n=Object(xs.a)(i),a=t[Object(xs.a)(i.parentElement)];if(!a.buttons||!a.buttons[n])return void this.log.warn("no such button",a,n,e);const o=a.buttons[n];this.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,o)}),P=!1,i.classList.add("with-reply-markup"),S.append(s)}const F=e.pFlags.is_outgoing;if(f){(e.pFlags.unread||F)&&this.unreadOut.add(e.mid);let t="";t=F?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}const _=p&&this.appMessagesManager.getMessageWithReplies(e),D=!!_&&e.mid>0;D&&i.classList.add("with-replies");const j=p&&e.fwd_from,B=p&&e.fwdFromId,R=f&&(!j||this.peerId!==a.default.myId);let U=w;if(I){let t=document.createElement("div");t.classList.add("attachment"),C||i.classList.add("is-message-empty");let s=!1;switch(I._){case"messageMediaPhoto":{const s=I.photo;C||(P=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add("photo");const n=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==n.size&&m){i.classList.add("is-album","is-grouped"),Ps({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});break}const a=!re.IS_ANDROID&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),Ss({photo:s,message:e,container:t,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});break}case"messageMediaWebPage":{s=!0;let t=I.webpage;if("webPage"!==t._)break;i.classList.add("webpage");let n=document.createElement("div");n.classList.add("web");let a,o,r=document.createElement("div");r.classList.add("quote");const l=t.photo;(l||t.document)&&(a=document.createElement("div"),a.classList.add("preview-resizer"),o=document.createElement("div"),o.classList.add("preview"),a.append(o));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),ys({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:R,group:gr,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia})}else{const t=ws({message:e,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,loadPromises:L});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=J.b.wrapRichText(t.url),s=Object(zs.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");g(i,J.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");g(s,t.rTitle),e.append(s),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),g(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(i.classList.add("is-square-photo"),s=!0,this.appPhotosManager.setAttachmentSize(l,o,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),Ss({photo:l,message:e,container:o,boxWidth:s?0:b.b.active.webpage.width,boxHeight:s?0:b.b.active.webpage.height,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:L,withoutPreloader:s,noAutoDownload:this.chat.noAutoDownloadMedia})}n.append(r),y.insertBefore(n,O);break}case"messageMediaDocument":{const n=I.document;if(n.sticker){i.classList.add("sticker"),P=!1,T=!0,n.animated&&i.classList.add("sticker-animated");const e=b.b.active,s=i.classList.contains("emoji-big")?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;this.appPhotosManager.setAttachmentSize(n,t,s.width,s.height),w.style.height=t.style.height,w.style.width=t.style.width,Cs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:gr,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?C:void 0,withThumb:!0,loadPromises:L})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(T=!0),!s&&C||(P=!1),e.viaBotId||i.classList.add("hide-name"),i.classList.add(s?"round":"video");const a=this.appMessagesManager.groupedMessagesStorage[u];if(u&&1!==a.size&&m)i.classList.add("is-album","is-grouped"),Ps({groupId:u,attachmentDiv:t,middleware:this.getMiddleware(),isOut:f,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia});else{const a=!re.IS_ANDROID&&!re.IS_APPLE&&!s&&P&&!D&&!1;a&&i.classList.add("with-media-tail"),ys({doc:n,container:t,message:e,boxWidth:b.b.active.regular.width,boxHeight:b.b.active.regular.height,withTail:a,isOut:R,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),group:gr,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia,searchContext:s?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0})}}else{const t=function({albumMustBeRenderedFull:e,message:t,bubble:s,messageDiv:i,chat:n,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l,useSearch:c}){let d;const h=e?n.getMidsByMid(t.mid):[t.mid];return h.forEach((e,t)=>{const s=n.getMessage(e),c=ws({message:s,loadPromises:a,noAutoDownload:o,lazyLoadQueue:r,searchContext:l}),p=document.createElement("div");p.classList.add("document-container"),p.dataset.mid=""+e,p.dataset.peerId=""+s.peerId;const u=document.createElement("div");if(u.classList.add("document-wrapper"),s.message){const e=document.createElement("div");e.classList.add("document-message");const t=J.b.wrapRichText(s.message,{entities:s.totalEntities});e.innerHTML=t,u.append(e)}if(h.length>1){const e=document.createElement("div");e.classList.add("document-selection"),p.append(e),p.classList.add("grouped-item"),0===t&&(d=u)}u.append(c),p.append(u),i.append(p)}),h.length>1&&s.classList.add("is-multiple-documents","is-grouped"),d}({albumMustBeRenderedFull:m,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:L,noAutoDownload:this.chat.noAutoDownloadMedia,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0});t&&(U=t);const a=y.lastElementChild.querySelector(".document-message, .document-size, .audio");a&&a.append(O.cloneNode(!0)),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),s=!0}break}case"messageMediaCall":{const e=I.action,t=document.createElement("div");t.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";t.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),Object(x._i18n)(a,R?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append(Object(ca.a)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),Object(x._i18n)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),t.append(a,o),s=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(t);break}case"messageMediaContact":{const e=I,t=document.createElement("div");t.classList.add("contact"),t.dataset.peerId=""+e.user_id,s=!0;const n=[];e.first_name&&n.push(J.b.wrapEmojiText(e.first_name)),e.last_name&&n.push(J.b.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+Object(Rs.a)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new Or;a.lazyLoadQueue=this.lazyLoadQueue,a.setAttribute("peer",""+e.user_id.toPeerId()),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(t);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e){const t=new as;return t.message=e,t.setAttribute("peer-id",""+e.peerId),t.setAttribute("poll-id",e.media.poll.id),t.setAttribute("message-id",""+e.mid),t.render(),t}(e);y.prepend(t),y.classList.add("poll-message");break}default:i.classList.remove("is-message-empty"),y.append(Object(x.i18n)(x.UNSUPPORTED_LANG_PACK_KEY),O),this.log.warn("unrecognized media type:",I._,e)}s||w.append(t)}T&&i.classList.add("just-media"),this.chat.selection.isSelecting&&this.chat.selection.toggleElementCheckbox(i,!0);let H="";const N=e.fromId!==a.default.myId&&this.appPeersManager.isAnyChat(v)&&!this.appPeersManager.isBroadcast(v)||e.viaBotId||e.pFlags.sponsored;if(N||j||e.reply_to_mid){let t,s;const n=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===B;let o,r=j&&!j.from_id;if(e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+this.appUsersManager.getUser(e.viaBotId).username,s.classList.add("peer-title"),i.classList.add("must-have-name")),r?(t=document.createElement("span"),t.innerHTML=J.b.wrapEmojiText(j.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Lt.a({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&p&&En.setReply({chat:this.chat,bubble:i,bubbleContainer:w,message:e}),B||j)if(this.peerId===a.default.myId||n||i.classList.add("forwarded"),e.savedFrom&&(H=e.savedFrom,t.dataset.savedFrom=H),o=document.createElement("div"),t.dataset.peerId=""+B,this.peerId!==a.default.myId&&this.peerId!==Be.d&&!n||T){const e=[t];T&&e.unshift(document.createElement("br")),o.append(Object(x.i18n)("ForwardedFrom",[e]))}else o.style.color=this.appPeersManager.getPeerColorById(B,!1),o.append(t);else e.viaBotId||(!T&&N?(o=document.createElement("div"),o.append(t),f||(o.style.color=this.appPeersManager.getPeerColorById(e.fromId,!1)),o.dataset.peerId=""+e.fromId):i.classList.add("hide-name"));if(e.viaBotId){o?o.append(" "):o=document.createElement("div");const e=document.createElement("span");e.append(Object(x.i18n)("ViaBot")," ",s),e.classList.add("is-via"),o.append(e)}o&&(o.classList.add("name"),U.append(o));if(this.chat.isAnyGroup()&&!R){let t=new Or;t.lazyLoadQueue=this.lazyLoadQueue,t.classList.add("user-avatar","avatar-40"),t.loadPromises=L,!B&&j&&j.from_name&&t.setAttribute("peer-title",j.from_name),t.setAttribute("peer",""+((j&&(this.peerId===a.default.myId||this.peerId===Be.d)||n?B:e.fromId)||Be.c)),S.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(H=`${this.chat.peerId}_${e.mid}`);if(_&&_.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),H&&("pinned"===this.chat.type||j.saved_from_msg_id)&&this.peerId!==Be.d){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),w.append(e),i.dataset.savedFrom=H,i.classList.add("with-beside-button")}if(i.classList.add(R?"is-out":"is-in"),n&&this.renderMessagesQueue(e,i,t,L),D){En.renderReplies({bubble:i,bubbleContainer:w,message:_,messageDiv:y,loadPromises:L,lazyLoadQueue:this.lazyLoadQueue})&&(P=!0)}return P&&(i.classList.add("can-have-tail"),w.append(Sa())),i}safeRenderMessage(e,t,s,i,n){try{return this.renderMessage(e,t,s,i,n)}catch(e){this.log.error("renderMessage error:",e)}}performHistoryResult(e,t,s,i){return ga(this,void 0,void 0,(function*(){let s;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{const{scrollTop:e,scrollHeight:i}=this.scrollable;s=t?i-e:e,this.messagesQueueOnRender=void 0},this.needReflowScroll&&(Tn(this.scrollable.container),this.needReflowScroll=!1);const n=e=>{const s="number"==typeof e?this.chat.getMessage(e):e;s.pFlags.local?this.processLocalMessageRender(s):this.safeRenderMessage(s,t,!0)},a=e.length;if(t)for(let t=0;t=0;--t)n(e[t]);if("scheduled"!==this.chat.type){const t=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId),s=t.history.first,i=t.history.last;!s.isEnd(Mn.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(Mn.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);if(yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),void 0!==s){const e=t?this.scrollable.scrollHeight-s:s;this.scrollable.scrollTop=e,this.scrollable.lastScrollTop=e,this.scrollable.lastScrollDirection=0,re.IS_SAFARI&&Tn(this.scrollable.container)}return!0}))}requestHistory(e,t,s){if("chat"===this.chat.type||"discussion"===this.chat.type)return this.appMessagesManager.getHistory(this.peerId,e,t,s,this.chat.threadId);if("pinned"===this.chat.type){return this.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:s}).then(e=>({history:e.history.map(e=>e.mid)}))}return"scheduled"===this.chat.type?this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>({history:e.slice().reverse()})):void 0}animateAsLadder(e,t,s,i,n){return ga(this,void 0,void 0,(function*(){if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,s,i,n));if(!Object.keys(this.bubbles).length)return;let a,o=Object(w.e)(this.bubbles,"desc");s&&t.length&&(o=o.filter(e=>!t.includes(e))),a=i?n||Math.max(...o):e||Math.max(...o);const r=o.slice(o.findIndex(e=>a>e)),l=s?[]:[a],c=s?[]:o.slice(0,o.findIndex(e=>a>=e)).reverse();de.b&&this.log("getHistory: targeting mid:",a,n,e,r.map(e=>this.appMessagesIdsManager.getServerMessageId(e)),c.map(e=>this.appMessagesIdsManager.getServerMessageId(e)));const d=[];this.chatInner.classList.add("zoom-fading");const h=s?10:40,p=s?0:1,u=(e,t=0)=>{const s=Object(ae.a)();let i=0;return e.forEach((n,a)=>{if(!this.bubbles[n]||this.skippedMids.has(n))return void this.log.warn("animateAsLadder: no bubble by mid:",n);const o=this.bubbles[n].lastElementChild;if(i=(a+t||.1)*h,o.classList.add("zoom-fade"),o.style.transitionDelay=i+"ms",a===e.length-1){const e=t=>{t.target===o&&(s.resolve(),o.removeEventListener("transitionend",e))};o.addEventListener("transitionend",e)}d.push(o)}),e.length||s.resolve(),{lastMsDelay:i,animationPromise:s}},m=u(r,p),g=u(l),b=u(c,p),v=[m.animationPromise,g.animationPromise,b.animationPromise],f=[m.lastMsDelay,g.lastMsDelay,b.lastMsDelay];let y;return this.onAnimateLadder&&(yield this.onAnimateLadder()),Object(De.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Ts.b)(y,Math.max(...f)+200).then(()=>{Object(De.b)(()=>{d.forEach(e=>{e.style.transitionDelay=""}),this.chatInner.classList.remove("zoom-fading")}),re.IS_SAFARI||(this.needReflowScroll=!0)})),y}))}renderEmptyPlaceholder(e,t,s,i){const n="empty-bubble-placeholder";let a,o;if(t.classList.add(n,n+"-"+e),"group"===e?a=Object(x.i18n)("GroupEmptyTitle1"):"saved"===e?a=Object(x.i18n)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?a=Object(x.i18n)("NoMessages"):"noScheduledMessages"===e&&(a=Object(x.i18n)("NoScheduledMessages")),a.classList.add("center",n+"-title"),i.push(a),"group"===e)i.push(Object(x.i18n)("GroupEmptyTitle2")),o=[Object(x.i18n)("GroupDescription1"),Object(x.i18n)("GroupDescription2"),Object(x.i18n)("GroupDescription3"),Object(x.i18n)("GroupDescription4")];else if("saved"===e)o=[Object(x.i18n)("ChatYourSelfDescription1"),Object(x.i18n)("ChatYourSelfDescription2"),Object(x.i18n)("ChatYourSelfDescription3"),Object(x.i18n)("ChatYourSelfDescription4")];else if("greeting"===e){const e=Object(x.i18n)("NoMessagesGreetingsDescription");e.classList.add("center",n+"-subtitle"),this.messagesQueue.findAndSplice(e=>e.bubble===t);const a=document.createElement("div");a.classList.add(n+"-sticker");const o=this.getMiddleware(),r=this.appStickersManager.getGreetingSticker().then(e=>{if(!o())return;const t=[];return Cs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:gr,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),oa.onMediaClick({target:e.target})}),Promise.all(t)});this.renderMessagesQueue(s,t,!1,[r]),i.push(e,a)}o&&(i.push(...o.map(e=>{const t=document.createElement("span");return t.classList.add(n+"-list-item"),t.append(e),t})),"group"===e?o.forEach(e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)}):"saved"===e&&o.forEach(e=>{const t=document.createElement("span");t.classList.add(n+"-list-bullet"),t.innerText="•",e.prepend(t)})),i.length>1&&t.classList.add("has-description"),i.forEach(e=>e.classList.add(n+"-line"))}processLocalMessageRender(e){const t=!!e.pFlags.sponsored,s=this.safeRenderMessage(e,void 0,void 0,void 0,t);s.classList.add("is-group-last","is-group-first"),t||(s.classList.add("bubble-first"),s.classList.remove("can-have-tail","is-in"));const i=[],n=this.appPeersManager.isBot(this.peerId);if(t){let t,i,n,o;s.classList.add("avoid-selection");const r=this.sponsoredMessage=e.sponsoredMessage,c=this.appPeersManager.getPeerId(r.from_id);r.channel_post?(t="OpenChannelPost",i=this.appMessagesIdsManager.generateMessageId(r.channel_post)):r.start_param?(t="Chat.Message.ViewBot",n=r.start_param):t=this.appPeersManager.isAnyGroup(c)?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new ma(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:ha.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{a.default.dispatchEvent("history_focus",{peerId:c,mid:i,startParam:n})};const d=Object(U.a)("btn-primary btn-primary-transparent bubble-view-button",{text:t});return this.viewsObserver.observe(d),o&&Object(l.b)(d,o),void s.querySelector(".bubble-content").prepend(d)}if(n&&"message"===e._){const e=document.createElement("b");e.append(Object(x.i18n)("BotInfoTitle")),i.push(e,"\n\n")}else this.appPeersManager.isAnyGroup(this.peerId)&&this.appPeersManager.getPeer(this.peerId).pFlags.creator?this.renderEmptyPlaceholder("group",s,e,i):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",s,e,i):a.default.myId===this.peerId?this.renderEmptyPlaceholder("saved",s,e,i):this.appPeersManager.isUser(this.peerId)&&!n&&this.chat.canSend()&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",s,e,i):this.renderEmptyPlaceholder("noMessages",s,e,i);if(i.length){s.querySelector(".message, .service-msg").prepend(...i)}const o=t?"append":"prepend";this.messagesQueueOnRenderAdditional?this.onAnimateLadder=()=>{if(this.chatInner[o](s),this.onAnimateLadder=void 0,!this.messagesQueuePromise)return Object(De.d)()}:this.chatInner[o](s),this.emptyPlaceholderMid=e.mid}generateLocalMessageId(e=0){let t=("scheduled"===this.chat.type?-1:0)+e;const s=-Math.abs(t);return{id:s,mid:-Math.abs(this.appMessagesIdsManager.generateMessageId(s))}}generateLocalFirstMessage(e,t,s=0){const{id:i,mid:n}=this.generateLocalMessageId(s),a={_:e?"messageService":"message",date:0,id:i,mid:n,peer_id:this.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),Object(ms.a)(a),t&&t(a),this.appMessagesManager.saveMessages([a],{storage:new Map}),a.mid=n,a}setLoaded(e,t,s=!0){if(this.scrollable.loadedAll[e]!==t){if(this.scrollable.loadedAll[e]=t,"bottom"===e&&this.appPeersManager.isBroadcast(this.peerId)){const{mid:e}=this.generateLocalMessageId(1);if(t){const t=this.getMiddleware(()=>this.scrollable.loadedAll.bottom&&!this.bubbles[e]&&this.getSponsoredMessagePromise===s),s=this.getSponsoredMessagePromise=this.chat.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.appChatsManager.getChannelInput(this.peerId.toChatId())},{cacheSeconds:300}).then(e=>{if(!t())return;this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const s=e.messages.shift();if(!s)return;e.messages.push(s);const i=this.generateLocalFirstMessage(!1,e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s},1);return Promise.all([this.getHistoryTopPromise,this.messagesQueuePromise]).then(()=>{if(!t())return;this.performHistoryResult([i],!1,!0)})}).finally(()=>{this.getSponsoredMessagePromise=void 0})}else this.deleteMessagesByIds([e]),this.getSponsoredMessagePromise=void 0}if("top"===e&&t&&this.appPeersManager.isBot(this.peerId)){this.log("inject bot description");const e=this.getMiddleware();return this.appProfileManager.getProfile(this.peerId.toUserId()).then(t=>{var s;if(!e())return;if(!(null===(s=t.bot_info)||void 0===s?void 0:s.description))return void this.checkIfEmptyPlaceholderNeeded();const i=this.generateLocalFirstMessage(!1,e=>{e.message=t.bot_info.description});this.processLocalMessageRender(i)})}this.checkIfEmptyPlaceholderNeeded()}}checkIfEmptyPlaceholderNeeded(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderMid&&(!this.appMessagesManager.getHistoryStorage(this.peerId).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=this.generateLocalFirstMessage(!0);return this.processLocalMessageRender(e),!0}return!1}getHistory(e=0,t=!1,s=!1,i=0,n=!1){const o=this.peerId,r=Math.min(30,Ct.a.height/38|0),l=Object.keys(this.bubbles).length>0?Math.max(40,r):r;let c=l;if(void 0!==fa){if(!fa)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--fa}let d,h=0;if(s&&(h=c,t||(c=0)),i&&!s)if("pinned"===this.chat.type)d=[i];else{const t=this.appMessagesManager.getHistoryStorage(o,this.chat.threadId).history.slice;if(t.length=0;--e){if(!this.chat.getMessage(d[e]).grouped_id)break;d.splice(e,1)}e=d[d.length-1]||e}}let p,u=this.requestHistory(e,c,h);const m=(null==d?void 0:d.length)&&u instanceof Promise,g=this.isFirstLoad&&h&&u instanceof Promise||m;m&&(p=u,u={history:d}),this.isFirstLoad=!1;const b=e=>ga(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(Mn.a.Top)){if("discussion"===this.chat.type){const t=this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId+"_"+this.chat.threadId];t&&e.history.push(t),e.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse())}yield this.setLoaded("top",!0)}})),v=e=>Object(Ts.c)().then(()=>b(e)).then(()=>this.performHistoryResult(e.history||[],t,s,!m&&i)),f=e=>{const s=e.then(e=>(t?this.getHistoryTopPromise!==s:this.getHistoryBottomPromise!==s)?(this.log.warn("getHistory: peer changed"),Promise.reject()):n?(this.scrollable.onScroll(),!0):v(e),e=>{throw this.log.error("getHistory error:",e),e});return s};let y,S;if(u instanceof Promise)S=!1,y=f(u);else{if(n)return null;S=!0,y=v(u)}const L=m?f(p):y;if(g&&a.default.settings.animationsEnabled){let s=m?2:1;this.messagesQueueOnRenderAdditional=()=>{if(this.log("ship went past rocks of magnets"),--s)return;this.messagesQueueOnRenderAdditional=void 0;this.animateAsLadder(i,d,m,h,e).then(()=>{setTimeout(()=>{this.loadMoreHistory(t,!0)},0)})}}else this.messagesQueueOnRenderAdditional=void 0;return t?this.getHistoryTopPromise=L:this.getHistoryBottomPromise=L,L.then(()=>{t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0}),n?null:(!g&&y.then(()=>{let e;t?(this.loadedTopTimes++,this.loadedBottomTimes=Math.max(0,--this.loadedBottomTimes)):(this.loadedBottomTimes++,this.loadedTopTimes=Math.max(0,--this.loadedTopTimes)),(t&&this.loadedTopTimes>2||!t&&this.loadedBottomTimes>2)&&(e=Object(w.e)(this.bubbles));const s=2*l;e&&e.length>s&&(t?(e=e.slice(s),this.setLoaded("bottom",!1)):(e=e.slice(0,e.length-s),this.setLoaded("top",!1)),this.deleteMessagesByIds(e,!1))}),y.then(()=>{"chat"===this.chat.type&&setTimeout(()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)},0)}),{cached:S,promise:y})}setUnreadDelimiter(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId);let t=this.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter(e=>!this.bubbles[e].classList.contains("is-out")).map(e=>+e).sort((e,t)=>e-t).find(e=>e>t),t&&this.bubbles[t])){let s=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==s&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e.maxId&&s.classList.add("is-first-unread"),this.firstUnreadBubble=s,this.attachedUnreadBubble=!0}}deleteEmptyDateGroups(){const e=+!!this.stickyIntersector+1;let t=!1;for(const s in this.dateMessages){const i=this.dateMessages[s];i.container.childElementCount===e&&(i.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(i.container,i.div),delete this.dateMessages[s],t=!0)}t&&(this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Sa(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}class La{constructor(e,t,s,n){var r;let l,c,d,h=[],p=[];const u=o.a.canPinMessage(e),m=(a,o,r)=>{setTimeout(()=>{let a;a=s&&!t?u?i.a.unpinAllMessages(e):i.a.hidePinnedMessages(e):i.a.updatePinnedMessage(e,t,s,r,o),n&&a.then(n)},300)};if(s){let s="UnpinMessage";t?(l="UnpinMessageAlertTitle",c="Chat.Confirm.Unpin"):u?(l="Popup.Unpin.AllTitle",c="Chat.UnpinAllMessagesConfirmation",d=[""+((null===(r=i.a.pinnedMessages[e])||void 0===r?void 0:r.count)||1)]):(l="Popup.Unpin.HideTitle",c="Popup.Unpin.HideDescription",s="Popup.Unpin.Hide"),h.push({langKey:s,isDanger:!0,callback:m})}else{l="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(h.push({langKey:t,callback:e=>m(0,!1,!e.size)}),G.a.isBroadcast(e.toChatId())?c="PinMessageAlertChannel":(c="PinMessageAlert",p.push({text:"PinNotify",checked:!0}))):(c="PinMessageAlertChat",e===a.default.myId?h.push({langKey:t,callback:m}):(h.push({langKey:t,callback:e=>m(0,!e.size)}),p.push({text:"PinAlsoFor",textArgs:[new Lt.a({peerId:e}).element],checked:!0})))}Object(ut.a)(h);new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function Ca(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class Ea extends gt{constructor(e,t,s,n){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{o.isValid()&&(n&&n(),i.a.reportMessages(e,t,s,o.value).then(e=>{e&&ct({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Cs({doc:cs.a.getAnimatedEmojiSticker(Ea.STICKER_EMOJI),div:a,emoji:Ea.STICKER_EMOJI,width:100,height:100,loop:!1,play:!0}).finally(()=>{this.show()}),this.header.append(a);const o=new F.b({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});o.input.addEventListener("input",()=>{this.buttons[0].element.toggleAttribute("disabled",!o.isValid())}),this.body.append(o.container)}}Ea.STICKER_EMOJI="👮‍♀️";class Ia extends gt{constructor(e,t,s){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const i=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"]];i.forEach(e=>{const t=Object(U.a)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)});const n=cs.a.preloadAnimatedEmojiSticker(Ea.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Me.a)(a.target,"btn-primary"),r=i[Object(xs.a)(o)][1];n.then(()=>{this.hide(),new Ea(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class Ma extends gt{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[Object(x.i18n)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(x.default.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}]});const e=new T.b(void 0);e.onAdditionalScroll=()=>{e.container.classList.toggle("scrolled-top",!e.scrollTop),e.container.classList.toggle("scrolled-bottom",e.isScrolledDown)},this.description.replaceWith(e.container),e.container.append(this.description),e.container.classList.add("scrolled-top"),this.show()}}class Pa{constructor(e,t,s,i,n,a,o){this.attachTo=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.appPollsManager=n,this.appDocsManager=a,this.appMessagesIdsManager=o,this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new Vs(this.peerId,this.chat.getMidsByMid(this.mid))},this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>{if(Ca()){nt((this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort((e,t)=>e-t):[this.mid]).reduce((e,t)=>{const s=this.chat.getMessage(t);return e+((null==s?void 0:s.message)?s.message+"\n":"")},"").trim())}else document.execCommand("copy")},this.onCopyAnchorLinkClick=()=>{nt(this.target.href)},this.onCopyLinkClick=()=>{let e;"discussion"===this.chat.type&&(e=this.appMessagesManager.getMessageByPeer(this.peerId,this.chat.threadId));const t=this.appPeersManager.getPeerUsername(e?e.fromId:this.peerId),s=this.appMessagesIdsManager.getServerMessageId(this.mid);let i,n="https://t.me/";t?(n+=t+"/"+(e?this.appMessagesIdsManager.getServerMessageId(e.fwd_from.channel_post):s),e&&(n+="?comment="+s),i="LinkCopied"):(n+="c/"+this.peerId.toChatId()+"/"+s,e&&(n+="?thread="+this.appMessagesIdsManager.getServerMessageId(e.mid)),i="LinkCopiedPrivateInfo"),lt(x.default.format(i,!0)),nt(n)},this.onPinClick=()=>{new La(this.peerId,this.mid)},this.onUnpinClick=()=>{new La(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>{if(this.chat.selection.isSelecting)Object(l.d)(this.chat.selection.selectionForwardBtn);else{const e=this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid);new Hs({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Me.a)(this.target,"grouped-item")||Object(Me.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new Ns(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)};const r=e=>{let s,i;this.init&&(this.init(),this.init=null);try{i=Object(Me.a)(e.target,"bubble-content-wrapper"),s=i?i.parentElement:Object(Me.a)(e.target,"bubble")}catch(e){}if(!s||s.classList.contains("bubble-first"))return;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),this.element.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+s.dataset.mid;if(!n)return;const a=n<0;if(this.isSelectable=this.chat.selection.canSelectBubble(s),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Ca(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention"),t.selection.isSelecting&&!i){if(a)return;const e=this.chat.getMidsByMid(n);if(e.length>1){const t=this.chat.selection.isMidSelected(this.peerId,n)?n:e.find(e=>this.chat.selection.isMidSelected(this.peerId,e));t&&(n=t)}}const o=Object(Me.a)(this.target,"grouped-item");this.isTargetAGroupedItem=!!o,this.mid=o?+o.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=this.chat.getMessage(this.mid),a?this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.isSponsored)}):(this.noForwards=!this.appMessagesManager.canForward(this.message),this.buttons.forEach(e=>{let s;t.selection.isSelecting&&!e.withSelection?s=!1:(i||ue.IS_TOUCH_SUPPORTED,s=e.verify()),e.element.classList.toggle("hide",!s)}));const r=s.classList.contains("is-in")?"left":"right";Object(te.e)(e.touches?e.touches[0]:e,this.element,r),Object(te.d)(this.element,()=>{this.mid=0,this.peerId=void 0,this.target=null})};ue.IS_TOUCH_SUPPORTED?Object(l.b)(e,e=>{if(t.selection.isSelecting)return;const s=e.target.className;if(!s||!s.includes)return;t.log("touchend",e);["bubble","bubble-content-wrapper","bubble-content","message","time","inner"].find(e=>s.match(new RegExp(e+"($|\\s)")))&&(Object(c.a)(e),r(e))},{listenerSetter:this.chat.bubbles.listenerSetter}):Object(te.a)(e,r,this.chat.bubbles.listenerSetter)}init(){this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending(()=>{Object(ms.a)(this.message),this.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)},new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>this.chat.canSend()&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>this.appMessagesManager.canEditMessage(this.message,"text")&&!!this.chat.input.messageInput},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>{if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids)for(const s of t)if(this.appMessagesManager.getMessageByPeer(e,s).message)return!0;return!1},notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{nt(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>this.appPeersManager.isChannel(this.peerId)&&!this.message.pFlags.is_outgoing},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)&&"scheduled"!==this.chat.type},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>this.message.pFlags.pinned&&this.appPeersManager.canPinMessage(this.peerId)},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{this.appDocsManager.saveDocFile(this.message.media.document)},verify:()=>{var e;if(this.message.pFlags.is_outgoing)return!1;const t=null===(e=this.message.media)||void 0===e?void 0:e.document;if(!t)return!1;let s=!!ue.IS_TOUCH_SUPPORTED;const i=!t.type||!["gif","video","sticker"].includes(t.type);return i&&(s=s||!!Object(Me.a)(this.target,"document")||!!Object(Me.a)(this.target,"audio")),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return this.appMessagesManager.canEditMessage(this.message,"poll")&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.pFlags.out||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new Ia(this.peerId,[this.mid])},verify:()=>!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&this.appPeersManager.isChannel(this.peerId),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>this.appMessagesManager.canDeleteMessage(this.message)},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new Ma},verify:()=>!1,isSponsored:!0}],this.element=Ce(this.buttons,this.chat.bubbles.listenerSetter),this.element.id="bubble-contextmenu",this.element.classList.add("contextmenu"),this.chat.container.append(this.element)}}var Ta=s(175),ka=s.n(Ta),xa=s(159);class Oa{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=Ce(this.sendMenuButtons,e.listenerSetter),this.sendMenu.classList.add("menu-send",e.openSide),Object(te.a)(e.onContextElement,t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach(e=>{e.element.classList.toggle("hide",!e.verify())}),Object(c.a)(t),Object(te.d)(this.sendMenu))},e.listenerSetter)}setPeerId(e){this.type=e===a.default.myId?"reminder":"schedule"}}var Aa=s(90),Fa=s(107);class _a extends ut.b{constructor(e){if(super("popup-create-poll popup-new-media",null,{closable:!0,withConfirm:"Create",body:!0}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(Fa.a)(t);i||(t.parentElement.classList.add("is-filled"),s.classList.remove("hidden-widget"),s.firstElementChild.removeAttribute("disabled"));!s.nextElementSibling&&!i&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,s=Object(ft.a)(t,"LABEL"),i=Object(xs.a)(s);this.correctAnswers&&this.correctAnswers[0][0]===i&&(this.correctAnswers=void 0),s.remove(),this.optionInputFields.splice(i,1),this.optionInputFields.forEach((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1);x.default.weakMap.get(e.label.firstElementChild).update()}),this.handleChange()},Object(x._i18n)(this.title,"NewPoll"),this.questionInputField=new F.b({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()}),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new Oa({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const t=document.createElement("hr"),s=document.createElement("div");s.classList.add("caption"),Object(x._i18n)(s,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const n=document.createElement("div");n.classList.add("caption"),Object(x._i18n)(n,"Settings"),this.chat.appPeersManager.isBroadcast(this.chat.peerId)||(this.anonymousCheckboxField=new mt.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new mt.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new mt.a({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)}),this.listenerSetter.add(this.quizCheckboxField.input)("change",()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map(t=>{t.classList.toggle("radio-field",e)}),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),a.forEach(t=>t.classList.toggle("hide",!e)),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()}),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const a=[],o=document.createElement("div");o.classList.add("caption"),Object(x._i18n)(o,"AccDescrQuizExplanation");const r=document.createElement("hr"),c=document.createElement("div");c.classList.add("poll-create-questions"),this.quizSolutionField=new F.b({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",()=>{this.handleChange()});const d=document.createElement("div");d.classList.add("subtitle"),Object(x._i18n)(d,"AddAnExplanationInfo"),c.append(this.quizSolutionField.container,d),a.push(r,o,c),a.forEach(e=>e.classList.add("hide")),this.body.parentElement.insertBefore(t,this.body),this.body.append(s,this.questions,document.createElement("hr"),n,i,...a),Object(l.b)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.b(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}getFilledAnswers(){return Array.from(this.questions.children).map((e,t)=>{const s=e.querySelector(".input-field-input");return s instanceof HTMLInputElement?s.value:Object(Aa.a)(s,!1).value}).filter(e=>!!e.trim())}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const s=this.getFilledAnswers();if(s.length<2)return!1;if(s.find(e=>e.length>100))return!1;const{value:i}=Object(Aa.a)(this.quizSolutionField.input,!1);return!(i.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){const t=this.questionInputField.value,s=this.getFilledAnswers(),{value:i,entities:n}=Object(Aa.a)(this.quizSolutionField.input);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:s.map((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])})),id:void 0},r=this.chat.appPollsManager.getInputMediaPoll(o,this.correctAnswers,i,n);this.chat.appMessagesManager.sendOther(this.chat.peerId,r,{threadId:this.chat.threadId,replyToMsgId:this.chat.input.replyToMsgId,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent}),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,s=new F.b({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(s.input)("input",this.onInput);const i=new ot({text:"",name:"question"});i.main.append(s.container),Object(l.b)(s.input,c.a,{listenerSetter:this.listenerSetter}),i.label.classList.add("hidden-widget"),i.input.disabled=!0,this.quizCheckboxField.input.checked||i.label.classList.remove("radio-field"),this.listenerSetter.add(i.input)("change",()=>{if(i.input.checked){const e=Object(xs.a)(i.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}});const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),s.container.append(n),Object(l.b)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(i.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(s)}}var Da=s(79);function ja(e){const t=e.src;return fetch(t).then(e=>e.arrayBuffer()).then(e=>{const t=new Uint8Array(e);let s=0;for(let e=0,i=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.hasAttribute("contenteditable"))return;this.input.focus(),Object(Da.a)(this.input)}},this.attachFile=e=>{const t=this.willAttach,s=this.shouldCompress(e.type),i={};i.file=e;const n=document.createElement("div");n.classList.add("popup-item"),i.itemDiv=n;const a=s?this.attachMedia(e,i,n):this.attachDocument(e,i,n);return t.sendFileDetails.push(i),a},this.willAttach={type:s,sendFileDetails:[],group:!1},Object(l.b)(this.btnConfirm,()=>this.send(),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new Oa({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending(()=>{this.send()})},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new T.b(null);i.container.append(this.mediaContainer),this.inputField=new F.b({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:a.default.config.caption_length_max}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",()=>{this.files=[],Ba=void 0}),Ba=this}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new mt.a({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()})):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find(e=>m.has(e.type));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new mt.a({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()})):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter(e=>!this.files.find(t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending(()=>{this.send(!0)});let t=this.inputField.value;if(t.length>a.default.config.caption_length_max)return void lt(x.default.format("Error.PreviewSender.CaptionTooLong",!0));this.hide();const s=this.willAttach;s.isMedia="media"===s.type||void 0;const{sendFileDetails:i,isMedia:n}=s,{peerId:o,input:r}=this.chat,{sendSilent:l,scheduleDate:c}=r;i.forEach(e=>{e.itemDiv=void 0});const{length:d}=i,h=r.replyToMsgId;this.iterate(e=>{t&&e.length!==d&&(this.chat.appMessagesManager.sendText(o,t,{replyToMsgId:h,threadId:this.chat.threadId,silent:l,scheduleDate:c,clearDraft:!0}),t=void 0);const i=Object.assign(Object.assign({},s),{sendFileDetails:e});this.chat.appMessagesManager.sendAlbum(o,i.sendFileDetails.map(e=>e.file),Object.assign({caption:t,replyToMsgId:h,threadId:this.chat.threadId,isMedia:n,silent:l,scheduleDate:c,clearDraft:!0},i)),t=void 0}),r.replyToMsgId=this.chat.threadId,r.onMessageSent()}attachMedia(e,t,s){s.classList.add("popup-item-media");let i;if(e.type.startsWith("video/")){const n=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),n.addEventListener("timeupdate",()=>{n.pause()},{once:!0}),i=Object(me.e)(n).then(()=>{t.width=n.videoWidth,t.height=n.videoHeight,t.duration=Math.floor(n.duration);const e=n.webkitAudioDecodedByteCount;return void 0!==e&&(t.noSound=!e),s.append(n),Object(me.c)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})}),n.append(a)}else{const n=new Image;i=new Promise(i=>{n.onload=()=>{t.width=n.naturalWidth,t.height=n.naturalHeight,s.append(n),"image/gif"===e.type?(t.noSound=!0,Promise.all([ja(n).then(e=>{t.duration=Math.ceil(e)}),Object(me.b)(n).then(e=>{t.thumb=Object.assign({url:URL.createObjectURL(e.blob)},e)})]).then(()=>{i()})):i()}}),n.src=t.objectURL=URL.createObjectURL(e)}return i}attachDocument(e,t,s){s.classList.add("popup-item-document");const i=e.type.startsWith("image/"),n=e.type.startsWith("audio/");(i||n)&&(t.objectURL=URL.createObjectURL(e));const a={_:"document",file:e,file_name:e.name||"",fileName:e.name?J.b.wrapEmojiText(e.name):"",size:e.size,type:i?"photo":"doc"},o=he.a.getCacheContext(a);o.url=t.objectURL,o.downloaded=e.size;const r=ws({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:a}}});return new Promise(e=>{const n=()=>{s.append(r),e()};if(i){const e=new Image;e.src=t.objectURL,e.onload=()=>{t.width=e.naturalWidth,t.height=e.naturalHeight,n()},e.onerror=n}else n()})}shouldCompress(e){return"media"===this.willAttach.type&&m.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)}),this.show())}setTitle(){const{willAttach:e,title:t,files:s}=this;let i;const n=[];if("document"===e.type)i="PreviewSender.SendFile",n.push(s.length);else{let e=0,t=0,a=0;s.forEach(s=>{s.type.startsWith("image/")?++e:s.type.startsWith("video/")?++t:++a}),[e,t,a].filter(e=>e>0).length>1?(i="PreviewSender.SendFile",n.push(s.length)):e?(i="PreviewSender.SendPhoto",n.push(e)):t&&(i="PreviewSender.SendVideo",n.push(t))}Object(k.a)(t,Object(x.i18n)(i,n))}appendMediaToContainer(e,t){if(this.shouldCompress(t.file.type)){const s=Object(Vn.a)(t.width,t.height,380,320);e.style.width=s.width+"px",e.style.height=s.height+"px"}this.mediaContainer.append(e)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach(t=>e([t]));const s=t.length;for(let i=0;i{s.innerHTML="",e.length&&(this.setTitle(),this.iterate(e=>{if(this.shouldCompress(e[0].file.type)&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map(e=>e.itemDiv)),Ms({container:t,items:e.map(e=>({w:e.width,h:e.height})),maxWidth:380,minWidth:100,spacing:4}),s.append(t)}else e.forEach(e=>{this.appendMediaToContainer(e.itemDiv,e)})}))}).then(()=>{this.onRender()})}}const Ha=["ArrowUp","ArrowDown"],Na=["ArrowLeft","ArrowRight"];function za({list:e,type:t,onSelect:s,once:i,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Ha.concat(Na):"x"===t?Na:Ha);let r;const d=()=>r||e.querySelector(".active")||e.firstElementChild,h=(e,s)=>{if(r===e)return;let i=!1;r&&(i=!0,r.classList.remove("active")),r=e,r&&(r.classList.add("active"),i&&g&&s&&Object(wt.b)({container:g,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},p=(t,s)=>{let i;return i=s?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,i};let u;u="xy"===t?(t,s)=>"ArrowUp"===s||"ArrowDown"===s?((t,s)=>{const i=s?"nextElementSibling":"previousElementSibling",n=s?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[i]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[i]||e[n]}return o})(t,"ArrowDown"===s):p(t,"ArrowRight"===s):(e,t)=>p(e,"ArrowRight"===t||"ArrowDown"===t);let m=s=>{const i=s.key;if(o.has(i)){if(Object(c.a)(s),e.childElementCount>1){let e=d();e=u(e,i),h(e,!0)}}else("Enter"===i||"xy"!==t&&"Tab"===i)&&(Object(c.a)(s),f(d()))};const g=Object(Me.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(Ws.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(Ws.a)(t.target,e);s&&(h(s,!1),f(d()))},f=e=>{const t=s(e);(void 0!==t?!t:i)&&S()};let y=!1;const w=()=>{y||(y=!0,document.addEventListener("keydown",m,{capture:!0,passive:!1}),e.addEventListener("mousemove",b,{passive:!0}),Object(l.b)(e,v))},S=()=>{y&&(y=!1,document.removeEventListener("keydown",m,{capture:!0}),e.removeEventListener("mousemove",b),Object(l.c)(e,v))},L=()=>{a||h(e.firstElementChild,!1)};if(a){const e=m;m=t=>{a.has(t.key)&&(Object(c.a)(t),document.removeEventListener("keydown",m,{capture:!0}),m=e,document.addEventListener("keydown",m,{capture:!0,passive:!1}),a=void 0,L())}}else L();return w(),{attach:w,detach:S,resetTarget:L}}class Va extends B.a{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:s,resetTarget:i}=za({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=s,this.resetTarget=i,re.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},j.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0)},{once:!0})},Object(w.g)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1){this.init||(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden!==e?(this.hidden=e,e?(this.navigationItem&&(j.a.removeItem(this.navigationItem),this.navigationItem=void 0),t||this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller.hideOtherHelpers(this),this.dispatchEvent("visible")),Object(Jt.a)(this.container,"is-visible",!e,a.default.settings.animationsEnabled?200:0,()=>{this.hidden&&this.dispatchEvent("hidden")})):e||this.dispatchEvent("visible"))}}class Ka extends Va{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!oa.onMediaClick({target:e},!0),waitForKey:["ArrowUp","ArrowDown"]}),this.container.classList.add("stickers-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0),a.default.dispatchEvent("choosing_sticker",!0)}),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0),a.default.dispatchEvent("choosing_sticker",!1)})}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),cs.a.preloadAnimatedEmojiSticker(e),cs.a.getStickersByEmoticon(e).then(e=>{if(!t())return;this.init&&(this.init(),this.init=null);const s=this.list.cloneNode();let i;this.lazyLoadQueue.clear(),i=e.length?new Promise(t=>{const i=[];e.forEach(e=>{s.append(this.superStickerRenderer.renderSticker(e,void 0,i))}),Promise.all(i).finally(t)}):Promise.resolve(),i.then(()=>{this.list.replaceWith(s),this.list=s,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0})})}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Qn(this.lazyLoadQueue,gr)}}const Ga=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Wa=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class qa extends yn{constructor(e,t,s){var i;if(super((i=e).getTime()>Wa().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Ga(),maxDate:Wa(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),s){const e=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),Object(l.b)(e,()=>{t(2147483646),this.hide()})}}}var Qa=s(133),$a=s(101);function Ya(e,t=!0){const s=[],i=[],n=window.getSelection();let a,o;if(n&&n.rangeCount){const t=n.getRangeAt(0),s=t.startOffset;if(t.startContainer&&t.startContainer==t.endContainer&&s==t.endOffset){const i=s-1,n=e.childNodes;if(t.startContainer===e&&n[i]){a=n[i],o=0;for(let e=0;e{s.onEmojiSelected(Nn(e),!0)}}),this.appEmojiManager=i,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new T.a(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollLeft=0},0)})}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach(e=>{Hn(e,this.list,!1,!0)})),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const s=this.controller.getMiddleware();this.appEmojiManager.getBothEmojiKeywords().then(()=>{if(!s())return;const i=e.replace(/^:/,""),n=this.appEmojiManager.searchEmojis(i);this.render(n,":"!==t)})}}class Ja extends Va{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Ja.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Ja.BASE_CLASS+"-list"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)})}render(e){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach(e=>{const t=Ja.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)})),this.toggle(!e.length)}static listElement(e){const t=Ja.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const s=document.createElement("div");s.classList.add(t,e.className),s.dataset.peerId=""+e.peerId;const i=new Or;i.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),i.setAttribute("dialog","0"),i.setAttribute("peer",""+e.peerId);const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?n.innerHTML=J.b.wrapEmojiText(e.name):n.append(new Lt.a({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),s.append(i,n),e.description){const i=document.createElement("div");i.classList.add(t+"-description",e.className+"-description"),i.innerHTML=J.b.wrapEmojiText(e.description),s.append(i)}return s}}Ja.BASE_CLASS="autocomplete-peer-helper",Ja.BASE_CLASS_LIST_ELEMENT=Ja.BASE_CLASS+"-list-element";class Za extends Ja{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Ja.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return s.getReadyToSend(()=>{s.messageInput.innerHTML=t,s.sendMessage(!0)})}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t){if(!this.appUsersManager.isBot(t))return!1;const s=this.controller.getMiddleware();return this.appProfileManager.getProfileByPeerId(t).then(t=>{if(!s())return;const i=[].concat(t.bot_info),n=new On.a({ignoreCase:!0}),a=new Map;i.forEach(e=>{e.commands.forEach(t=>{const s="/"+t.command;a.set(t.command,{peerId:e.user_id.toPeerId(!1),name:s,description:t.description}),n.indexObject(t.command,s)})});const o=n.search(e),r=Array.from(o).map(e=>a.get(e));this.render(r)}),!0}}class eo{constructor(){this.helpers=new Set,this.middleware=Object(ks.a)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach(t=>{t!==e&&t.toggle(!0,!0)}),e||this.middleware.clean()}}class to extends Ja{constructor(e,t,s,i,n){super(e,t,"mentions-helper",e=>{const t=n.getUser(e.dataset.peerId.toUserId());let i,a="";t.username?a="@"+t.username:(a=t.first_name||t.last_name,i={_:"messageEntityMentionName",length:a.length,offset:0,user_id:t.id}),a+=" ",s.insertAtCaret(a,i)}),this.appProfileManager=i,this.appUsersManager=n}checkQuery(e,t,s){const i=e.trim();if(e.length!==i.length)return!1;const n=this.controller.getMiddleware();return this.appProfileManager.getMentions(t&&t.toChatId(),i,s).then(e=>{if(!n())return;const t=i.slice(1).toLowerCase();this.render(e.map(e=>{const s=this.appUsersManager.getUser(e);if(!s.username||s.username.toLowerCase()!==t)return{peerId:e,description:s.username?"@"+s.username:void 0}}).filter(Boolean))}),!0}}var so=s(4);class io extends ia{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(Ws.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.g)(this,e),this.element.classList.add(io.BASE_CLASS),this.element.style.display="none",this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(a.default)("history_reply_markup",({peerId:e})=>{this.peerId===e&&(this.checkAvailability()&&this.isActive()&&this.render(),Object(Ts.c)().then(()=>{this.checkForceReply()}))})}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",()=>{this.render(),ue.IS_TOUCH_SUPPORTED&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",()=>{this.listenerSetter.remove(this.touchListener)},{once:!0}))}),this.listenerSetter.add(this.element)("click",e=>{const t=Object(Me.a)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;switch(s){case"keyboardButtonRequestPhone":ln({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then(()=>{this.appMessagesManager.sendContact(i,a.default.myId)});break;default:this.appMessagesManager.sendText(i,t.dataset.text)}this.toggle(!1)}),super.init()}checkForceReply(){const e=this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}getReplyMarkup(){var e;return null!==(e=this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}render(e=this.getReplyMarkup()){this.element.innerHTML="";for(const t of e.rows){const e=document.createElement("div");e.classList.add(io.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(io.BASE_CLASS+"-button","btn"),t.innerHTML=J.b.wrapEmojiText(s.text),t.dataset.text=s.text,t.dataset.type=s._,e.append(t)}this.element.append(e)}}checkAvailability(e=this.getReplyMarkup()){var t;const s="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",s),s&&this.toggle(!1),!s}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}io.BASE_CLASS="reply-keyboard";var no=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class ao extends Va{constructor(e,t,s,i,n){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:s,queryId:i}=this.list.dataset;return this.chat.input.getReadyToSend(()=>{const n=this.appInlineBotsManager.generateQId(i,e.dataset.resultId);this.appInlineBotsManager.sendInlineResult(t.toPeerId(),s,n,{clearDraft:!0,scheduleDate:this.chat.input.scheduleDate,silent:this.chat.input.sendSilent,replyToMsgId:this.chat.input.replyToMsgId}),this.chat.input.onMessageSent(!0,!0)})}}),this.chat=s,this.appUsersManager=i,this.appInlineBotsManager=n,this._checkQuery=(e,t,s)=>no(this,void 0,void 0,(function*(){const i=this.controller.getMiddleware(),n=yield this.appUsersManager.resolveUsername(t);if(!i())throw"PEER_CHANGED";if("user"!==n._)throw"NOT_A_BOT";const a=this.appInlineBotsManager.getInlineResults(e,n.id,s).then(t=>{var s;if(!i())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const a=this.list.cloneNode();a.dataset.peerId=""+e,a.dataset.botId=""+n.id,a.dataset.queryId=""+t.query_id;const o=new Gn(null,"INLINE-HELPER",this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],c=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=c?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),a.append(t),c)t.classList.add("grid-item");else{n.classList.add("empty"),n.innerHTML=J.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=J.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=J.b.wrapRichText(e.description,{noCommands:!0,noLinks:!0}),t.append(s,i);const o=document.createElement("div");o.classList.add("inline-helper-separator"),a.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let s;n?(s=document.createElement("div"),n.append(s)):s=t,s.classList.add("media-container"),c&&s.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>he.a.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then(e=>{const t=new Image;t.classList.add("media-photo"),Object(ne.b)(e).then(e=>{Ls(s,t,e,!0)})})})}}else{const a=e.document||e.photo;if(["sticker","gif"].includes(null===(s=a)||void 0===s?void 0:s.type)&&c)Object(ms.a)(a),"gif"===a.type?o.add(a,t):"sticker"===a.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(a,t,r),2===a.sticker&&this.superStickerRenderer.observeAnimatedDiv(t));else if(a){const e=c?48:void 0;c&&t.classList.add("no-border-radius"),Ss({photo:a,container:c?t:n,boxWidth:e,boxHeight:e,middleware:i,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then(()=>{if(!i())return void o.clear();a.classList.toggle("is-gallery",c),a.classList.toggle("super-stickers",c),this.container.classList.toggle("is-gallery",c);const s=this.list.parentElement;if(s.textContent="",t.switch_pm){const i=Object(U.a)("btn-primary btn-secondary btn-primary-transparent primary");i.insertAdjacentHTML("beforeend",J.b.wrapEmojiText(t.switch_pm.text)),Object(l.b)(i,s=>{this.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)}),s.append(i)}s.append(this.list=a),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=o,o.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*b.b.active.esgSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},b.b.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0})});return{user:n,renderPromise:a}})),this.container.classList.add("inline-helper"),this.addEventListener("visible",()=>{setTimeout(()=>{this.scrollable.container.scrollTop=0},0)}),this.checkQuery=dt(this._checkQuery,200,!0,!0),this.addEventListener("hidden",()=>{this.onChangeScreen&&(b.b.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)})}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new T.b(this.container),this.lazyLoadQueue=new ee.d,this.superStickerRenderer=new Qn(this.lazyLoadQueue,"INLINE-HELPER")}}var oo=s(3);class ro{constructor(e,t,s,i,n,o,r,d,h,p,u,m,g,b){this.chat=e,this.appMessagesManager=t,this.appMessagesIdsManager=s,this.appDocsManager=i,this.appChatsManager=n,this.appPeersManager=o,this.appWebPagesManager=r,this.appImManager=d,this.appDraftsManager=h,this.serverTimeManager=p,this.appNotificationsManager=u,this.appEmojiManager=m,this.appUsersManager=g,this.appInlineBotsManager=b,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&Object(c.a)(e),this.recordCanceled=!0,this.recorder.stop(),xa.a.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=ue.IS_TOUCH_SUPPORTED?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>{const{peerId:s}=this.chat,i=this.chat.bubbles.getMiddleware(),n=a.default.myId!==s&&s.isUser()&&this.appUsersManager.isUserOnlineVisible(s);new qa(t,t=>{if(!i())return;t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout(()=>{i()&&this.appImManager.openScheduled(s)},0)},n).show()},this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,s)=>{Object(c.a)(e);let i=this.messageInput.innerHTML;if(i&&i!==s){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const s=this.messageInput.innerHTML;if(i===s){if(++e>2)break}else e=0;i=s}while(i!==s);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const s=e.code,i=t[s];if(document.getSelection().toString().trim().length&&i&&("KeyK"===s?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(i),Object(c.a)(e)),"KeyZ"===s){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:s,entities:i,caretPos:n}=Ya(this.messageInputField.input),a=J.b.parseMarkdown(s,i,!0),o=J.b.mergeEntities(i,J.b.parseEntities(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=!(null===(t=this.editMessage)||void 0===t?void 0:t.media)&&o.filter(e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._);if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=s.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=ht.a.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.appWebPagesManager.saveWebPage(e),params:{url:t}}).then(s=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===s._?(this.setTopInfo("webpage",()=>{},s.site_name||s.title||"Webpage",s.description||s.url||""),delete this.noWebPage,this.willSendWebPage=s):this.willSendWebPage&&this.onHelperCancel())})}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(s.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"}))}else this.lastTimeType&&this.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"}),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide();this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(s,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{this.insertAtCaret(e,J.b.getEmojiEntityFromEmoji(e),t)},this.onBtnSendClick=e=>{if(Object(c.a)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{if(this.chat.peerId.isAnyChat()&&!this.chat.canSend("send_media"))return void lt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(Ks.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),xa.a.setKeepAlive(!0);const e=()=>{new gt("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{Object(l.d)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",t=>{Object(Me.a)(t.target,"chat-input")||Object(Me.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),j.a.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout(()=>{e()},0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,s=t.context.createAnalyser();t.connect(s),s.fftSize=32;const i=new Uint8Array(s.frequencyBinCount),n=255*i.length;let a=()=>{if(!this.recording)return;s.getByteFrequencyData(i);let e=0;i.forEach(t=>{e+=t});let t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;let o=Date.now()-this.recordStartTime,r=o%1e3,l=(""+o/1e3).toHHMMSS()+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(De.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":lt("Please allow access to your microphone");break;case"NotReadableError":lt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),lt(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")})}},this.onHelperCancel=(e,t)=>{if(e&&Object(c.a)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=J.b.parseMarkdown(this.messageInputField.value,[]);if(e.message!==t)return void new gt("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()},this.onHelperClick=e=>{if(Object(c.a)(e),Object(Me.a)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&ue.IS_TOUCH_SUPPORTED&&!e.container.classList.contains("active")&&Object(te.d)(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new R.a}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input"),this.chatInput.style.display="none",this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Sa();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const s=this.fakeSelectionWrapper=document.createElement("div");s.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,s),this.chatInput.append(this.inputContainer),this.goDownBtn=Q({icon:"arrow_down",className:"bubbles-corner-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),Object(l.b)(this.goDownBtn,e=>{Object(c.a)(e),this.chat.bubbles.onGoDownClick()},{listenerSetter:this.listenerSetter});const i=this.controlContainer=document.createElement("div");i.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(i)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=H(""),this.replyElements.cancelBtn=H("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(i=!0,this.canToggleHideAuthor()),t=()=>{i=!1},s=this.forwardElements={};let i=!1;const n=[s.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new mt.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new mt.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new mt.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new mt.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ce(n,this.listenerSetter),r=Array.from(o.children);if([{elements:r.slice(0,2),onChange:(e,t)=>{const n=!!+e;i&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=x.default.weakMap.get(e),i=s.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=i,t.update()}}},{elements:r.slice(2,4),onChange:e=>{const t=!!+e;let i;i=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?s.hideSender:s.showSender:t?s.showSender:s.hideSender,i.checkboxField.checked=!0}}].forEach(e=>{const t=tt(e.elements.map(e=>({container:e,input:e.querySelector("input")})),e.onChange),s=document.createElement("hr");t.append(s),o.append(t)}),o.append(s.changePeer.element),!ue.IS_TOUCH_SUPPORTED){this.forwardHover=new ia({element:o})}s.modifyArgs=n.slice(0,-1),this.replyElements.container.append(o),s.modifyArgs.forEach((e,t)=>{const{input:s}=e.checkboxField;s.type="radio",s.name=t<2?"author":"caption",s.value=""+ +!(t%2)}),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.btnToggleEmoticons=H("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),"chat"===this.chat.type&&(this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=Q({icon:"mention",className:"bubbles-corner-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),Object(l.b)(this.goMentionBtn,e=>{Object(c.a)(e),this.appMessagesManager.goToNextMention(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.btnScheduled=H("scheduled btn-scheduled float hide",{noRipple:!0}),Object(l.b)(this.btnScheduled,e=>{this.appImManager.openScheduled(this.chat.peerId)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("scheduled_new",({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")}),this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e})=>{this.chat.peerId===e&&this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(e=>{this.btnScheduled.classList.toggle("hide",!e.length)})}),this.btnToggleReplyMarkup=H("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new io({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,appMessagesManager:this.appMessagesManager,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",()=>this.btnToggleReplyMarkup.classList.add("active")),this.listenerSetter.add(this.replyKeyboard)("close",()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...m].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{new _a(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=Ie({noRipple:!0,listenerSetter:this.listenerSetter},"top-left",this.attachMenuButtons),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new eo,this.stickersHelper=new Ka(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Xa(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Za(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new to(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new ao(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.appUsersManager,this.appInlineBotsManager),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=H("delete danger btn-circle z-depth-1 btn-record-cancel"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=H("none btn-circle z-depth-1 btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),"scheduled"!==this.chat.type&&(this.sendMenu=new Oa({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!this.isInputEmpty()||!!Object.keys(this.forwarding).length}),this.btnSendContainer.append(this.sendMenu.sendMenu)),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),la.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(la)("open",this.onEmoticonsOpen),this.listenerSetter.add(la)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(a.default)("settings_updated",()=>{(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),this.messageInputField&&this.messageInputField.onFakeInput()}),this.listenerSetter.add(a.default)("draft_updated",({peerId:e,threadId:t,draft:s,force:i})=>{this.chat.threadId===t&&this.chat.peerId===e&&this.setDraft(s,!0,i)}),this.listenerSetter.add(a.default)("peer_changing",e=>{this.chat===e&&this.saveDraft()}),this.listenerSetter.add(a.default)("chat_changing",({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)}),"scheduled"===this.chat.type?this.listenerSetter.add(a.default)("scheduled_delete",({peerId:e,mids:t})=>{this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()}):(this.listenerSetter.add(a.default)("history_delete",({peerId:e,msgs:t})=>{this.chat.peerId===e&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))}),this.listenerSetter.add(a.default)("dialogs_multiupdate",e=>{e[this.chat.peerId]&&(this.startParam===Be.a?this.setStartParam():this.center(!0))}));try{this.recorder=new ka.a({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",e=>{let t=e.target.files;t.length&&(new Ua(this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")},!1),Object(l.b)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&(Object(l.b)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(j.a.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:s}=this.chat,i=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});xa.a.decode(e,!0).then(e=>{xa.a.setKeepAlive(!1),this.appMessagesManager.sendFile(t,a,{isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:i,threadId:s,clearDraft:!0}),this.onMessageSent(!1,!0)})}),Object(l.b)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),Object(l.b)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=dt(()=>this.saveDraft(),2500,!1,!0),this.botStartBtn=Object(U.a)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append(Object(x.i18n)("BotStart")),Object(l.b)(this.botStartBtn,()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=Object(bt.a)([this.botStartBtn],!0),s=this.chat.peerId,i=this.chat.bubbles.getMiddleware(()=>this.chat.peerId===s&&this.startParam===e&&this.toggleBotStartBtnDisability===t);this.appMessagesManager.startBot(s.toUserId(),void 0,e).then(()=>{i()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())})},{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn)}constructPinnedHelpers(){this.pinnedControlBtn=Object(U.a)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",()=>{const e=this.chat.peerId;new La(e,0,!0,()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)})}),this.chatInput.classList.add("type-pinned")}center(e=!1){const t=this.getNeededFakeContainer();if(!t&&!this.inputContainer.classList.contains("is-centering"))return;if(t===this.fakeWrapperTo)return;const s=t||this.fakeWrapperTo,i=!!t,n=this.fakeWrapperTo;let a,o="",r="";const l=s.getBoundingClientRect(),c=this.fakeRowsWrapper.getBoundingClientRect(),d=c.width,h=l.width;if(d!==h){const e=h/d,t=(d-h)/2;if(a=l.left-c.left-t,i&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=12;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=t;const p=e?200:0;return Object(Jt.a)(this.inputContainer,"is-centering",i,p),Object(Jt.a)(this.rowsWrapperWrapper,"is-centering-to-control",!!(i&&t&&t.classList.contains("chat-input-control")),p),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(t&&t.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:d,widthTo:h}}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}getNeededFakeContainer(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==this.startParam||!this.chat.canSend()||"pinned"===this.chat.type||this.chat.isStartButtonNeeded()?this.controlContainer:void 0}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){if(!this.goDownUnreadBadge)return;const e=this.appMessagesManager.getDialogOnly(this.chat.peerId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId,!0)),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const{value:e,entities:t}=Object(Aa.a)(this.messageInputField.input);let s;(e.length||this.replyToMsgId)&&(s={_:"draftMessage",date:Object(oe.h)(!0)+this.serverTimeManager.serverTimeOffset,message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),this.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,s)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.style.display="none",this.goDownBtn.classList.add("hide")),Gs(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,s=!1){return!(!s&&!Object(Fa.a)(this.messageInput)||"scheduled"===this.chat.type)&&(e||(e=this.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId))?(this.messageInputField.value!==e.rMessage||this.replyToMsgId!==e.reply_to_msg_id)&&(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(e.rMessage,t,t),!0):(s&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then(()=>{Object(De.b)(()=>{this.onMessageSent()})})),!1))}finishPeerChange(e){const t=this.chat.peerId,{forwardElements:s,btnScheduled:i,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r}=this;r.style.display="";const l=this.appPeersManager.isBroadcast(t);if(o.classList.toggle("is-broadcast",l),o.classList.remove("hide"),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",this.appPeersManager.canPinMessage(t)),s&&(this.forwardWasDroppingAuthor=!1,s.showCaption.checkboxField.setValueSilently(!0),s.showSender.checkboxField.setValueSilently(!0)),i){i.classList.add("hide");const e=this.chat.bubbles.getMiddleware();this.appMessagesManager.getScheduledMessages(t).then(t=>{e()&&i.classList.toggle("hide",!t.length)})}n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput?this.updateMessageInput():this.pinnedControlBtn&&this.pinnedControlBtn.append(Object(x.i18n)(this.appPeersManager.canPinMessage(this.chat.peerId)?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow")),this.startParam=e,this.center(!1)}updateMessageInput(){const{chatInput:e,attachMenu:t,messageInput:s}=this,{peerId:i,threadId:n}=this.chat,a=this.chat.canSend();e.classList.contains("is-hidden")!==!a&&(e.classList.add("no-transition"),e.classList.toggle("is-hidden",!a),e.offsetLeft,e.classList.remove("no-transition"));const o=x.default.weakMap.get(s);if(o){let e;e=n?"Comment":this.appPeersManager.isBroadcast(i)?"ChannelBroadcast":this.appMessagesManager.isAnonymousSending(i)?"SendAnonymously":"Message",o.compareAndUpdate({key:e})}const r=this.attachMenuButtons.filter(e=>{const t=e.verify(i,n);return e.element.classList.toggle("hide",!t),t});a?(s.setAttribute("contenteditable","true"),this.setDraft(void 0,!1),s.innerHTML||this.messageInputField.onFakeInput()):s.removeAttribute("contenteditable"),t.toggleAttribute("disabled",!r.length),t.classList.toggle("btn-disabled",!r.length),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new F.b({placeholder:"Message",name:"message",animate:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),oo.a&&Object(oo.b)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",e=>{const t=e.key;if(Object(Qa.a)(e))Object(c.a)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else Object(Da.a)(this.messageInput)}),ue.IS_TOUCH_SUPPORTED&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),la.toggle(!1)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",()=>{this.checkAutocomplete()}),"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.listenerSetter.add(this.messageInput)("focusin",()=>{this.chat.bubbles.scrollable.loadedAll.bottom&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)})}applyMarkdown(e,t){const s={bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",monospace:()=>document.execCommand("fontName",!1,"monospace"),link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null),spoiler:()=>document.execCommand("fontName",!1,"spoiler")};if(!s[e])return!1;const i=s[e],n=this.prepareDocumentExecute(),a=[];if(a.push(document.execCommand("styleWithCSS",!1,"true")),"monospace"===e){let t=!1;const s=window.getSelection();if(!s.isCollapsed){const i=s.getRangeAt(0),n=$a.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):a.push("function"==typeof i?i():document.execCommand(i,!1,null))}else a.push("function"==typeof i?i():document.execCommand(i,!1,null));return a.push(document.execCommand("styleWithCSS",!1,"false")),n(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),!0}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Ya(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(ro.AUTO_COMPLETE_REG_EXP):null,d=c?c.index+(c[0].length-c[2].length):r.length,h=r.slice(0,d)+e+l,p=J.b.parseEntities(i);J.b.mergeEntities(a,p);const u=t?Math.max(t.length,e.length):e.length,m=[];t&&(m.push(t),t.offset=d);const g=c?u-c[2].length:u;a.forEach(e=>{e.offset>=d&&(e.offset+=g)}),J.b.mergeEntities(a,m);{const e={_:"messageEntityCaret",offset:d+u,length:0};let t=0;for(let s=a.length;te.offset)break}a.splice(t,0,e)}const b=J.b.wrapDraftText(h,{entities:a});this.messageInputField.setValueSilently(b,!0);const v=this.messageInput.querySelector(".composer-sel");v&&(!function(e){const t=e;if(1===(e=e.previousSibling).nodeType){const s=document.createTextNode("");e.parentNode.insertBefore(s,t.nextSibling&&t.nextSibling.nodeType!==e.nodeType?t.nextSibling:t),e=s}if(window.getSelection&&document.createRange){const t=document.createRange();e&&(t.setStartAfter(e),t.insertNode(e),t.setStart(e,e.nodeValue.length)),t.collapse(!0);const s=window.getSelection();s.removeAllRanges(),s.addRange(t)}}(v),v.remove()),this.onMessageInput()}checkAutocomplete(e,t,s){if(void 0===e){const i=Ya(this.messageInputField.input,!0);e=i.value,t=i.caretPos,s=i.entities}if(-1===t&&(t=e.length),void 0===s){const t=J.b.parseMarkdown(e,s,!0);s=J.b.mergeEntities(s,J.b.parseEntities(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const i=e.match(ro.AUTO_COMPLETE_REG_EXP);let n;if(i){const t=s[0];let o=i[2];const r=o[0];if(this.stickersHelper&&a.default.settings.stickers.suggest&&this.chat.canSend("send_stickers")&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===r){const e=this.chat.threadId?this.appMessagesIdsManager.getServerMessageId(this.chat.threadId):void 0;this.mentionsHelper.checkQuery(o,this.chat.peerId.isUser()?Be.c:this.chat.peerId,e)&&(n=this.mentionsHelper)}else i[1]||"/"!==r?a.default.settings.emoji.suggest&&(o=o.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!o||(n=this.emojiHelper,this.emojiHelper.checkQuery(o,r))):this.commandsHelper.checkQuery(o,this.chat.peerId)&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}checkInlineAutocomplete(e,t){let s=!1;if(!t){const i=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(i){const n=i[1],a=e.slice(i[0].length);s=i[0].length===e.length,t=this.inlineHelper,this.btnPreloader?Object(Jt.a)(this.btnPreloader,"show",!0,400):(this.btnPreloader=H("none btn-preloader float show disable-hover",{noRipple:!0}),Object(te.f)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,n,a).then(({user:e,renderPromise:t})=>{s&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then(()=>{Object(Jt.a)(this.btnPreloader,"show",!1,400)})}).catch(Fe.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(Jt.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(Jt.a)(this.chatInput,"is-recording",e,200),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=this.helperFunc;this.clearHelper(),this.updateSendBtn();let t=!1;new Hs(Object(w.a)(this.forwarding),()=>{t=!0}).addEventListener("close",()=>{this.helperWaitingForward=!1,t||e()})}clearInput(e=!0,t=!0,s=""){if(document.activeElement===this.messageInput&&re.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),Object(so.a)(e),this.messageInputField.setValueSilently(s),Object(so.a)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(s);ue.IS_TOUCH_SUPPORTED||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let i=!1;e&&(i=this.setDraft(void 0,!1)),!i&&t&&this.onMessageInput()}isInputEmpty(){return Object(Fa.a)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach(t=>{this.btnSend.classList.toggle(t,e===t)}),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t)}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const s=this.messageInputField.value;J.b.parseEntities(s).filter(e=>"messageEntityEmoji"===e._).forEach(e=>{const t=Object(ie.a)(e.unicode);this.appEmojiManager.pushRecentEmoji(t)}),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:s}=this;if("scheduled"===s.type&&!e&&!t)return void this.scheduleSending();const{threadId:i,peerId:n}=s,{replyToMsgId:a,noWebPage:o,sendSilent:r,scheduleDate:l}=this,{value:c,entities:d}=Object(Aa.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!c.trim()&&!e.media)return void new Ns(n,[t],s.type);this.appMessagesManager.editMessage(e,c,{entities:d,noWebPage:o}),this.onMessageSent()}else c.trim()&&(this.appMessagesManager.sendText(n,c,{entities:d,replyToMsgId:a,threadId:i,noWebPage:o,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,scheduleDate:l,silent:r,clearDraft:!0}),this.onMessageSent(!1,!1));if(this.forwarding){const e=Object(w.a)(this.forwarding);setTimeout(()=>{for(const t in e)this.appMessagesManager.forwardMessages(n,t.toPeerId(),e[t],{silent:r,scheduleDate:l,dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()});c||this.onMessageSent()},0)}}sendMessageWithDocument(e,t=!1,s=!1){var i;const n="sticker"===(e=this.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!this.chat.canSend(n)?(lt("Posting media content isn't allowed in this group."),!1):"scheduled"!==this.chat.type||t?!!e&&(this.appMessagesManager.sendFile(this.chat.peerId,e,{isMedia:!0,replyToMsgId:this.replyToMsgId,threadId:this.chat.threadId,silent:this.sendSilent,scheduleDate:this.scheduleDate,clearDraft:s||void 0}),this.onMessageSent(s,!0),"sticker"===e.type&&(null===(i=la.stickersTab)||void 0===i||i.pushRecentSticker(e)),!0):(this.scheduleSending(()=>this.sendMessageWithDocument(e,!0,s)),!1)}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||Object(ft.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=J.b.wrapDraftText(t.message,{entities:t.totalEntities});const i=()=>{const n=this.appMessagesManager.wrapMessageForReply(t,void 0,[t.mid]);this.setTopInfo("edit",i,Object(x.i18n)("AccDescrEditing"),n,s,t),this.editMsgId=e,this.editMessage=t,s=void 0};i()}initMessagesForward(e){const t=()=>{const s=Object.keys(e).map(e=>e.toPeerId()),i=new Set;let n=0,o=0;s.forEach(t=>{const s=e[t];s.forEach(e=>{var s;const n=this.appMessagesManager.getMessageByPeer(t,e);!(null===(s=n.fwd_from)||void 0===s?void 0:s.from_name)||n.fromId||n.fwdFromId?i.add("P"+n.fromId):i.add("N"+n.fwd_from.from_name),n.media&&n.message&&++o}),n+=s.length});const r=i.size>2,l=[...i].map(e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===a.default.myId?Object(x.i18n)("Chat.Accessory.Forward.You"):new Lt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(ft.a)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!o);const d=c.hideCaption.checkboxField.checked;o&&d?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const h=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=Object(x.i18n)(h,[n]),u=document.createDocumentFragment();let m,g;if(l.length<3?u.append(...Object(x.join)(l,!1)):u.append(l[0],Object(x.i18n)("AndOther",[l.length-1])),1===s.length){const t=s[0],i=e[t];if(m=this.appMessagesManager.getMessageByPeer(t,i[0]),g=!!m.grouped_id,g){const e=this.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find(e=>!i.includes(e)))&&(g=!1)}}const b=document.createDocumentFragment();if(g||1===n){const t=e[s[0]],i=this.appMessagesManager.wrapMessageForReply(m,void 0,t);b.append(u,": ",i)}else b.append(Object(x.i18n)("Chat.Accessory.Forward.From"),": ",u);let v=this.setTopInfo("forward",t,p,b);c.modifyArgs.forEach((e,t)=>{const i=e.textElement,n=x.default.weakMap.get(i);n.args=[t<2?s.length:o],n.update()}),this.forwardHover&&this.forwardHover.attachButtonListener(v,this.listenerSetter),this.forwarding=e};t()}initMessageReply(e){if(this.replyToMsgId===e)return;let t=this.chat.getMessage(e);const s=()=>{let i;"messageEmpty"===t._?(i=Object(x.i18n)("Loading"),this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId,e).then(i=>{this.replyToMsgId===e&&(t=i,"messageEmpty"===t._?this.clearHelper("reply"):s())})):i=new Lt.a({peerId:t.fromId,dialog:!1}).element,this.setTopInfo("reply",s,i,t&&t.message,void 0,t),this.replyToMsgId=e};s()}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.replyToMsgId=void 0,this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(j.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(Jt.a)(this.chat.container,"is-toggling-helper",!0,150,()=>{this.chat.container.classList.remove("is-toggling-helper")})}setInputValue(e,t=!0,s=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),Object(De.b)(()=>{s&&Object(Da.a)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight})}setTopInfo(e,t,s="",i="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,l=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=H(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const c=Is(s,i,a);return l?r.replaceWith(c):o.insertBefore(c,o.lastElementChild),"webpage"===e&&(c.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),re.IS_MOBILE||j.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}ro.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class lo{constructor(e){this.floating=!1,Object(w.g)(this,e);const{divAndCaption:t,className:s}=this;t.container.classList.add("pinned-container","hide"),t.title.classList.add("pinned-container-title"),t.subtitle.classList.add("pinned-container-subtitle"),t.content.classList.add("pinned-container-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add("pinned-container-close",`pinned-${s}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("pinned-container-wrapper"),Object(se.ripple)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add("pinned-container-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){Object(l.b)(e,e=>{Object(c.a)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then(e=>{e&&this.toggle(!0)})},{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const s=(this.floating||b.b.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",s),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",s),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}fill(e,t,s){this.divAndCaption.container.dataset.peerId=""+s.peerId,this.divAndCaption.container.dataset.mid=""+s.mid,this.divAndCaption.fill(e,t,s),this.topbar.setUtilsWidth()}}class co extends lo{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new ze("pinned-audio",(e,t)=>{Object(k.a)(this.divAndCaption.title,e),Object(k.a)(this.divAndCaption.subtitle,t)}),onClose:()=>{fe.stop()},floating:!0}),this.topbar=e,this.chat=t,this.appMessagesManager=s,this.divAndCaption.border.remove();const i=H("pprevious active",{noRipple:!0}),n=H("nnext active",{noRipple:!0});i.innerHTML='',n.innerHTML='';const o=(e,t)=>{Object(l.b)(e,e=>{Object(c.a)(e),t()},{listenerSetter:this.topbar.listenerSetter})};o(i,()=>{fe.previous()}),o(n,()=>{fe.next()}),this.toggleEl=H("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),o(this.toggleEl,()=>{fe.toggle()}),this.wrapper.prepend(this.wrapper.firstElementChild,i,this.toggleEl,n),this.volumeSelector=new xe(this.listenerSetter,!0);const r=document.createElement("div");r.classList.add("progress-line-container"),r.append(this.volumeSelector.container);const d=document.createElement("div");d.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(d),this.volumeSelector.btn.append(r),this.wrapperUtils.prepend(this.volumeSelector.btn);const h=document.createElement("div");h.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new ke(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),h.append(this.progressLine.container),this.wrapper.insertBefore(h,this.wrapperUtils),this.topbar.listenerSetter.add(a.default)("media_play",({doc:e,message:t,media:s})=>{let i,n;"voice"===e.type||"round"===e.type?(i=new Lt.a({peerId:t.fromId}).element,n=Object(oe.d)(t.date)):(i=e.audioTitle||e.fileName,n=e.audioPerformer||Object(x.i18n)("AudioUnknownArtist")),this.progressLine.setMedia(s),this.fill(i,n,t),this.toggleEl.classList.add("flip-icon"),this.toggle(!1)}),this.topbar.listenerSetter.add(a.default)("media_pause",()=>{this.toggleEl.classList.remove("flip-icon")}),this.topbar.listenerSetter.add(a.default)("media_stop",()=>{this.toggle(!0)})}}var ho;!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(ho||(ho={}));class po{constructor(){this.drawRect=(e,t,s,i,n)=>`M${e},${t+n}a${n},${n},0,0,1,${s},0v${i-2*n}a${n},${n},0,0,1,${-s},0Z`,this.getClipPath=(e,t,s)=>{let i="";if(2===s)i=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let s;return e<=1?s=ho.ONE:2===e?s=ho.TWO:3===e?s=ho.THREE:4===e?s=ho.FOUR:e>3&&(s=ho.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=ho.ONE:2===e?s=ho.TWO:3===e?s=ho.THREE:4===e?s=ho.FOUR:e>3&&(s=ho.MORE),s},this.getMarkTranslateY=(e,t,s)=>1===s?0:2===s?e?t+1:0:3===s?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,s,i)=>t<=4||e<=1?0:e>=t-2?i-ho.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?ho.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add("pinned-message-border"),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className="pinned-message-border-wrapper-1",this.border.classList.remove("pinned-message-border-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const s=this.getBarHeight(e,t),i=this.getMarkHeight(e,t),n=this.getTrackHeight(e,s),a="clipPath_"+e,o=this.getClipPath(a,s,e),r=this.getMarkTranslateY(t,s,e),l=this.getTrackTranslateY(t,e,s,n);return this.border.classList.toggle("pinned-message-border-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className="pinned-message-border-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${l}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add("pinned-message-border-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${i}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var uo=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class mo{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=mo.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const s=document.createElement("div"),i=!Object.keys(this.rows).length&&!t;return s.className=mo.BASE_CLASS+"-row"+(i?"":" is-hiding hide"),this.rows[e]={element:s,new:!0},this.container.append(s),s}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout(()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)},mo.DURATION)}setNewRow(e,t=!1){const s=this.rows[e];s.new&&(t?(s.element.classList.remove("hide"),s.element.offsetLeft):s.element.classList.remove("is-hiding","hide"),delete s.new),this.clearRows(e)}animate(e,t,s=e>t,i=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!i)return this.setNewRow(e);const o=["from-top","from-bottom"];s||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}mo.DURATION=200,mo.BASE_CLASS="animated-super";class go{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=go.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=go.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=go.BASE_CLASS+"-decimal-placeholder";const i=new mo;return i.container.className=go.BASE_CLASS+"-decimal-wrapper",t.append(s,i.container),this.container.append(t),this.decimals[e]={container:t,placeholder:s,animatedSuper:i}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout(()=>{this.decimals.splice(t,this.decimals.length-t).forEach(e=>{e.container.remove()})},mo.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(go.EMPTY_INDEX,!0);t.animatedSuper.animate(go.EMPTY_INDEX,s,this.reverse?ethis.previousNumber,!0)}),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map(e=>+e);Array.from(""+e).map(e=>+e).forEach((s,i)=>{var n;const a=this.getDecimal(i),o=a.animatedSuper.getRow(s,!0),r=null!==(n=t[i])&&void 0!==n?n:go.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}go.EMPTY_INDEX=-1,go.BASE_CLASS="animated-counter";class bo{constructor(e,t,s,i){this.topbar=e,this.chat=t,this.appMessagesManager=s,this.appPeersManager=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.isStatic=!1,this.debug=!1,this.listenerSetter=new R.a;const n=new Ke("pinned-message");this.pinnedMessageContainer=new lo({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>uo(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new La(this.topbar.peerId,this.pinnedMid,!0):new La(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new po,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new mo,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new mo,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new go(!0),n.title.append(Object(x.i18n)("PinnedMessage")," ",this.animatedCounter.container);const o=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(o),n.container.prepend(o),this.btnOpen=H("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),Object(l.b)(this.btnOpen,e=>{Object(c.a)(e),this.topbar.openPinned(!0)},{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e})=>{e===this.topbar.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))}),this.listenerSetter.add(a.default)("peer_pinned_hidden",({peerId:e})=>{e===this.topbar.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)}),this.setPinnedMessage=dt(()=>this._setPinnedMessage(),100,!0,!0),this.isStatic="discussion"===this.chat.type}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;let t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const s=t.dataset.mid;t&&void 0!==s&&this.testMid(+s,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let s=this.mids.findIndex(t=>t<=e);if(-1===s||this.isNeededMore(s)){if(!(this.loadedTop&&es))return;this.pinnedIndex=s,this.pinnedMid=this.mids.find(t=>t<=e)||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>bo.LOAD_COUNT&&(!this.loadedBottom&&e<=bo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=bo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return uo(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{let s=!1;const i=[this.appMessagesManager.getSearch({peerId:this.topbar.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:bo.LOAD_COUNT,backLimit:bo.LOAD_COUNT}).then(e=>(s=!0,e))];if(!this.pinnedMaxMid){const e=this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))});i.push(e)}const n=(yield Promise.all(i))[0];let a=n.history.findIndex(t=>t.mid<=e);-1===a&&(a=n.history.length),this.offsetIndex=n.offset_id_offset?n.offset_id_offset-a:0,this.mids=n.history.map(e=>e.mid).slice(),this.count=n.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,this.debug&&this.chat.log("[PM]: getCurrentIndex result:",e,n,a,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.chat.log.error("[PM]: getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new R.a,function(e,t,s,i){if(ue.IS_TOUCH_SUPPORTED){let n;const a={passive:!0};i.add(e)("touchstart",t=>{t.touches.length>1?r():(n=t.touches[0].clientY,i.add(e)("touchmove",o,a),i.add(e)("touchend",r,a))},a);const o=e=>{const i=e.touches[0].clientY,a=i{i.removeManual(e,"touchmove",o,a),i.removeManual(e,"touchend",r,a)}}else i.add(e)("wheel",e=>{const i=e.deltaY>0;"bottom"===t&&i?s():"top"!==t||i||s()},{passive:!0})}(this.chat.bubbles.scrollable.container,"bottom",()=>{this.unsetScrollDownListener()},this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return uo(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield Object(Ts.c)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.chat.log("[PM]: handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.chat.log.error("[PM]: handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return uo(this,void 0,void 0,(function*(){const t=this.chat.getMessage(e);t&&!t.deleted&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then(()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)}))}))}_setPinnedMessage(){return uo(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,s=this.chat.getMessage(this.pinnedMid),i=0===t;this.animatedCounter.container.classList.toggle("is-last",i),i||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.chat.log("[PM]: setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],l=Ve({title:void 0,titleEl:null,subtitle:s.message,subtitleEl:a,message:s,mediaEl:o,loadPromises:r});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",l),this.animatedSubtitle.animate(t,this.wasPinnedIndex),l?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+s.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}bo.LOAD_COUNT=50,bo.LOAD_OFFSET=5;var vo=da;class fo{constructor(e,t,s,i,n,a,o,r,l){this.chat=e,this.appSidebarRight=t,this.appMessagesManager=s,this.appPeersManager=i,this.appChatsManager=n,this.appNotificationsManager=a,this.appProfileManager=o,this.appUsersManager=r,this.appGroupCallsManager=l,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&Object(c.a)(e);const s=e=>{e.forEach(e=>{e.element.classList.toggle("hide",!e.verify())})};t&&(s(this.menuButtons),this.menuButtons[this.menuButtons.length-1].element.lastChild.replaceWith(Object(x.i18n)(this.appPeersManager.getDeleteButtonText(this.peerId)))),s(this.buttonsToVerify)},this.verifyVideoChatButton=e=>{var t;if(!vo||this.peerId.isUser())return!1;const s=this.appGroupCallsManager.groupCall,i=this.peerId.toChatId();if((null==s?void 0:s.chatId)===i)return!1;if(e&&(this.peerId.isBroadcast()&&"group"===e||this.peerId.isAnyGroup()&&"broadcast"===e))return!1;return(null===(t=this.appChatsManager.getChatTyped(i).pFlags)||void 0===t?void 0:t.call_active)||this.appChatsManager.hasRights(i,"manage_call")},this.verifyCallButton=e=>{if(!pa||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),s=this.appProfileManager.getCachedFullUser(t);return!!s&&!!("voice"===e?s.pFlags.phone_calls_available:s.pFlags.video_calls_available)},this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",b.b.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===b.a.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),re.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame(()=>{re.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0})},this.setFloating=()=>{const e=[this.chatAudio,this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer].filter(Boolean).reduce((e,t)=>{const s=t.divAndCaption.container.classList.contains("is-floating");return this.container.classList.toggle(`is-pinned-${t.className}-floating`,s),e+ +s},0);this.container.dataset.floating=""+e},this.setPeerStatus=(e=!1)=>{if(!this.subtitle)return;const t=this.peerId;this.chat.appImManager.setPeerStatus(this.peerId,this.subtitle,e,!1,()=>t===this.peerId)},this.listenerSetter=new R.a,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar"),this.container.dataset.floating="0",this.btnBack=H("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const s=document.createElement("div");s.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),s.append(this.title);const i=document.createElement("div");i.classList.add("bottom"),this.subtitle&&i.append(this.subtitle),t.append(s,i),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new co(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ie({listenerSetter:this.listenerSetter},"bottom-left",this.menuButtons,this.verifyButtons)),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(b.b)("changeScreen",this.onChangeScreen),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"pinned-container");if(Object(Ks.a)(),t){if(Object(c.a)(e),Object(Me.a)(e.target,"progress-line"))return;const s=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(s);else{const e=t.dataset.peerId.toPeerId(),i=fe.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:s,type:i.isScheduled?"scheduled":i.threadId?"discussion":void 0,threadId:i.threadId})}}else b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown")?n():Object(ft.a)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains("is-right-column-shown")):this.appSidebarRight.toggleSidebar(!0)},{listenerSetter:this.listenerSetter});const n=e=>{if(e&&Object(c.a)(e),b.b.activeScreen===b.a.medium&&document.body.classList.contains("is-left-column-shown"))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);j.a.back(e?"im":"chat")}};Object(l.b)(this.btnBack,n,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>b.b.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&!this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.appMessagesManager.mutePeer(this.peerId)},verify:()=>"chat"===this.chat.type&&a.default.myId!==this.peerId&&this.appNotificationsManager.isPeerLocalMuted(this.peerId,!1)},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null===(e=t)||void 0===e?void 0:e.linked_chat_id)}},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),M.default.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{M.default.pushToState("chatContextMenuHintWasShown",!0),lt(Object(x.i18n)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(jt)){const e=new jt(this.appSidebarRight);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>this.peerId.isUser()&&!this.appPeersManager.isContact(this.peerId)},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new Pt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new gt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Lt.a({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{s(),this.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{i()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()}),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>a.default.myId!==this.peerId&&this.peerId.isUser()&&this.appPeersManager.isContact(this.peerId)&&!!this.appUsersManager.getUser(this.peerId.toUserId()).phone},{icon:"lock",text:"BlockUser",onClick:()=>{new gt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Lt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&ct({langPackKey:"UserBlocked"})})}}]}).show()},verify:()=>{var e;if(!this.peerId.isUser())return!1;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==a.default.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"lockoff",text:"Unblock",onClick:()=>{this.appUsersManager.toggleBlock(this.peerId,!1).then(e=>{e&&ct({langPackKey:"UserUnblocked"})})},verify:()=>{var e;const t=this.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}},{icon:"delete danger",text:"Delete",onClick:()=>{new At(this.peerId)},verify:()=>"chat"===this.chat.type&&!!this.appMessagesManager.getDialogOnly(this.peerId)}],this.btnSearch=H("search"),this.attachClickEvent(this.btnSearch,e=>{this.chat.initSearch()},!0)}attachClickEvent(e,t,s){Object(l.b)(e,e=>{Object(c.a)(e),!s&&Object(Ks.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new Or,this.avatarElement.setAttribute("dialog","1"),this.avatarElement.classList.add("avatar-42","person-avatar"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager),this.btnJoin=Object(U.a)("btn-primary btn-color-primary chat-join hide"),this.btnCall=H("phone"),this.btnGroupCall=H("videochat"),this.btnPinned=H("pinlist"),this.btnMute=H("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,()=>{this.openPinned(!0)}),this.attachClickEvent(this.btnMute,()=>{this.appMessagesManager.mutePeer(this.peerId)}),this.attachClickEvent(this.btnJoin,()=>{const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let s;s=this.appChatsManager.isChannel(t)?this.appChatsManager.joinChannel(t):this.appChatsManager.addChatUser(t,a.default.myId),s.finally(()=>{e()&&this.btnJoin.removeAttribute("disabled")})}),this.listenerSetter.add(a.default)("chat_update",e=>{var t,s;if(this.peerId===e.toPeerId(!0)){const i=this.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(s=null===(t=i)||void 0===t?void 0:t.pFlags)||void 0===s?void 0:s.left)),this.setUtilsWidth(),this.verifyButtons()}}),this.listenerSetter.add(a.default)("dialog_notify_settings",e=>{e.peerId===this.peerId&&this.setMutedState()}),this.listenerSetter.add(a.default)("peer_typings",({peerId:e})=>{this.peerId===e&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("user_update",e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()}),this.listenerSetter.add(a.default)("peer_full_update",e=>{this.peerId===e&&this.verifyButtons()}),this.pinnedMessage&&this.chat.addEventListener("setPeer",(e,t)=>{const s=this.chat.bubbles.getMiddleware();M.default.getState().then(i=>{s()&&(this.pinnedMessage.hidden=!!i.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))})}),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}constructPinnedHelpers(){this.listenerSetter.add(a.default)("peer_pinned_messages",({peerId:e,mids:t})=>{e===this.peerId&&t&&this.setTitle()})}constructDiscussionHelpers(){this.pinnedMessage=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager)}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),this.pinnedMessage&&this.pinnedMessage.destroy(),delete this.chatAudio,delete this.pinnedMessage}setPeer(e){this.wasPeerId=this.peerId,this.peerId=e,this.container.style.display=e?"":"none"}finishPeerChange(e,t,s){var i,n;const a=this.peerId;this.avatarElement&&(this.avatarElement.setAttribute("peer",""+a),this.avatarElement.update());const o=this.appPeersManager.isBroadcast(a);if(this.btnMute&&this.btnMute.classList.toggle("hide",!o),this.btnJoin)if(this.appPeersManager.isAnyChat(a)){const e=a.toChatId();Object(k.a)(this.btnJoin,Object(x.i18n)(this.appChatsManager.isBroadcast(e)?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(n=null===(i=this.appChatsManager.getChat(e))||void 0===i?void 0:i.pFlags)||void 0===n?void 0:n.left))}else this.btnJoin.classList.add("hide");this.setUtilsWidth(),this.verifyButtons();const r=this.chat.bubbles.getMiddleware();if(this.pinnedMessage)if("chat"===this.chat.type){if(void 0!==this.wasPeerId){const e=new bo(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}M.default.getState().then(t=>{r()&&(this.pinnedMessage.hidden=!!t.hiddenPinnedMessages[a],e||this.pinnedMessage.setCorrectIndex(0))})}else"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage());Object(De.b)(()=>{this.setTitle(),this.setPeerStatus(!0),this.setMutedState()})}setTitle(e){var t;let s;if("pinned"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("PinnedMessagesCount",[e]),void 0===e&&this.appMessagesManager.getSearchCounters(this.peerId,[{_:"inputMessagesFilterPinned"}],!1).then(e=>{const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}})):"scheduled"===this.chat.type?(s=this.peerId===a.default.myId?Object(x.i18n)("Reminders"):Object(x.i18n)("ScheduledMessages"),void 0===e&&this.appMessagesManager.getScheduledMessages(this.peerId).then(e=>{this.setTitle(e.length)})):"discussion"===this.chat.type?(s=void 0===e?Object(x.i18n)("Loading"):Object(x.i18n)("Chat.Title.Comments",[e]),void 0===e&&Promise.all([this.appMessagesManager.getHistory(this.peerId,0,1,0,this.chat.threadId),Promise.resolve()]).then(()=>{const e=this.appMessagesManager.getHistoryStorage(this.peerId,this.chat.threadId).count;null===e?setTimeout(()=>{this.setTitle()},30):this.setTitle(e)})):"chat"===this.chat.type&&(s=new Lt.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,s),"chat"===this.chat.type){const e=this.appPeersManager.getPeer(this.peerId);(null===(t=null==e?void 0:e.pFlags)||void 0===t?void 0:t.verified)&&this.title.append(Ut())}}setMutedState(){if(!this.btnMute)return;const e=this.peerId;let t=this.appNotificationsManager.isPeerLocalMuted(e,!1);this.appPeersManager.isBroadcast(e)?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}}class yo extends z{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new _("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=H("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const e=document.createElement("div");e.classList.add("chatlist-container"),this.scrollable.container.replaceWith(e),this.appSearch=new A(e,this.inputSearch,{messages:new O("Chat.Search.PrivateSearch","messages")})}open(e,t,s,i){const n=super.open();return this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,i):(this.query=i,this.peerId=e,this.threadId=t,this.onDatePick=s,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&Object(l.b)(this.btnPickDate,()=>{new yn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),Yt.toggleSidebar(!0)),n}}class wo{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new yn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(ft.a)(e.target,"LI");t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.bubblesContainer.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{Object(c.a)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),Object(se.ripple)(this.backBtn);const i=this.listenerSetter=new R.a,n=(e,t)=>{Object(l.b)(e,t,{listenerSetter:i})};n(this.backBtn,()=>{this.destroy()}),this.inputSearch=new _("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new O(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new A(this.results,this.inputSearch,{messages:this.searchGroup},e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):(Object(k.a)(this.foundCountEl,this.inputSearch.value?Object(x.i18n)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))}),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.bubblesContainer.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),Object(se.ripple)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),s&&this.setQuery(s),re.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},j.a.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active"),this.chat.search=void 0,j.a.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),s=+e.dataset.mid||void 0,i=Object(xs.a)(e);i===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),i?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.bubblesContainer.classList.remove("search-results-active");const n=this.chat.setPeer(t,s);this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then(()=>{this.selectedIndex=i,Object(k.a)(this.foundCountEl,Object(x.i18n)("Of",[i+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()}).finally(()=>{this.setPeerPromise=null})}}class So extends B.a{constructor(e,t,s,i,n,a,o,r,l,c,d,h,p,u,m,g,b,v,f,y){super(),this.appImManager=e,this.appChatsManager=t,this.appDocsManager=s,this.appInlineBotsManager=i,this.appMessagesManager=n,this.appPeersManager=a,this.appPhotosManager=o,this.appProfileManager=r,this.appStickersManager=l,this.appUsersManager=c,this.appWebPagesManager=d,this.appPollsManager=h,this.apiManager=p,this.appDraftsManager=u,this.serverTimeManager=m,this.storage=g,this.appNotificationsManager=b,this.appEmojiManager=v,this.appMessagesIdsManager=f,this.appGroupCallsManager=y,this.type="chat",this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=Object(X.b)("CHAT",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.peerId=Be.c,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container)}setBackground(e){const t=a.default.getTheme();let s;if("color"===t.background.type&&"grabbing"===document.documentElement.style.cursor){const e=this.backgroundEl.lastElementChild;e&&e.dataset.type===t.background.type&&(s=e)}return s||(s=document.createElement("div"),s.classList.add("chat-background-item"),s.dataset.type=t.background.type),"color"===t.background.type&&(s.style.backgroundColor=t.background.color,s.style.backgroundImage="none"),new Promise(t=>{const i=()=>{const e=this.backgroundEl.lastElementChild;e!==s?(this.backgroundEl.append(s),Object(De.b)(()=>{Object(De.b)(()=>{Object(Jt.a)(s,"is-visible",!0,200,e?()=>{e.remove()}:null)})}),t()):t()};e?Object(rs.a)(s,e,i):i()})}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new fo(this,Yt,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new wa(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager),this.input=new ro(this,this.appMessagesManager,this.appMessagesIdsManager,this.appDocsManager,this.appChatsManager,this.appPeersManager,this.appWebPagesManager,this.appImManager,this.appDraftsManager,this.serverTimeManager,this.appNotificationsManager,this.appEmojiManager,this.appUsersManager,this.appInlineBotsManager),this.selection=new Ys(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new Pa(this.bubbles.bubblesContainer,this,this.appMessagesManager,this.appPeersManager,this.appPollsManager,this.appDocsManager,this.appMessagesIdsManager),"chat"===this.type?(this.topbar.constructUtils(),this.topbar.constructPeerHelpers()):"pinned"===this.type?this.topbar.constructPinnedHelpers():"discussion"===this.type&&(this.topbar.constructUtils(),this.topbar.constructDiscussionHelpers()),this.topbar.construct(),this.input.construct(),"chat"===this.type?(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()):"pinned"===this.type?(this.bubbles.constructPinnedHelpers(),this.input.constructPinnedHelpers()):"scheduled"===this.type?(this.bubbles.constructScheduledHelpers(),this.input.constructPeerHelpers()):"discussion"===this.type&&(this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers()),this.container.classList.add("type-"+this.type),this.container.append(this.topbar.container,this.bubbles.bubblesContainer,this.input.chatInput),this.bubbles.listenerSetter.add(a.default)("dialog_migrate",({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer(t)}),this.bubbles.listenerSetter.add(a.default)("dialog_drop",e=>{e.peerId===this.peerId&&this.appImManager.setPeer()})}beforeDestroy(){this.bubbles.cleanup()}destroy(){this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.selection.cleanup()}setPeer(e,t,s){e?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const i=this.peerId===e;if(i){if(this.setPeerPromise)return}else a.default.dispatchEvent("peer_changing",this),this.peerId=e||Be.c;if(!e)return Yt.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.default.dispatchEvent("peer_changed",e);if(!i){const t=Yt.getTab(yo);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.container.classList.toggle("no-forwards",this.noForwards),Yt.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Be.a);const n=this.bubbles.setPeer(e,t,s);if(!n)return;const{promise:o}=n,r=this.setPeerPromise=o.finally(()=>{this.setPeerPromise===r&&(this.setPeerPromise=null)});return i||(Yt.sharedMediaTab.setLoadMutex(this.setPeerPromise),Yt.sharedMediaTab.loadSidebarMedia(!0)),n}setAutoDownloadMedia(){const e=this.peerId;if(!e)return;let t;t=e.isUser()?e.isContact()?"contacts":"private":e.isBroadcast()?"channels":"groups",this.noAutoDownloadMedia=!a.default.settings.autoDownload[t]}setMessageId(e){return this.setPeer(this.peerId,e)}finishPeerChange(e,t,s,i){if(this.peerChanged)return;let n=this.peerId;this.peerChanged=!0,this.cleanup(!1),this.topbar.setPeer(n),this.topbar.finishPeerChange(e,t,s),this.bubbles.finishPeerChange(),this.input.finishPeerChange(i),Yt.sharedMediaTab.fillProfileElements(),this.log.setPrefix("CHAT-"+n+"-"+this.type),a.default.dispatchEvent("peer_changed",n),this.wasAlreadyUsed=!0}getMessagesStorage(){return this.appMessagesManager.getMessagesStorage(this.peerId)}getMessage(e){return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(),e)}getMidsByMid(e){return this.appMessagesManager.getMidsByMessage(this.getMessage(e))}isAnyGroup(){return this.peerId===a.default.myId||this.peerId===Be.d||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new wo(this.topbar,this,e);else{let t=Yt.getTab(yo);t||(t=new yo(Yt)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return this.appPeersManager.isBot(this.peerId)&&!this.appMessagesManager.getDialogOnly(this.peerId)&&!this.appMessagesManager.getHistoryStorage(this.peerId).history.length}}var Lo=s(160);class Co{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,ue.IS_TOUCH_SUPPORTED){if(Object(c.a)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools");["bold","italic","underline","strikethrough","monospace","link"].forEach(t=>{const s=H(t,{noRipple:!0});e.append(this.buttons[t]=s),"link"!==t?s.addEventListener("mousedown",e=>{Object(c.a)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()}):Object(l.b)(s,e=>{Object(c.a)(e),this.showLinkEditor(),this.cancelClosening()})}),this.linkBackButton=H("left",{noRipple:!0}),this.linkInput=document.createElement("input"),Object(x._i18n)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",e=>{const t=!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))}),this.linkInput.addEventListener("input",e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")}),this.linkBackButton.addEventListener("mousedown",e=>{Object(c.a)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()}),this.linkApplyButton=H("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",e=>{this.applyLink(e)});const s=document.createElement("div");s.classList.add("markup-tooltip-link-apply-container");const i=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");i.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(i,this.buttons.link),s.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,s),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",()=>{this.hide()})}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout(()=>{this.linkInput.focus()},200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){Object(c.a)(e),this.resetSelection();let t=this.linkInput.value;t&&!J.b.matchUrlProtocol(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout(()=>{this.hide()},0)}isLinkValid(){return!this.linkInput.value.length||!!J.b.matchUrl(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,j.a.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout(()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")},200))}getActiveMarkupButton(){const e=function(){const e=[],t=window.getSelection();for(let s=0;s!!e)}(),t=[...new Set(e.map(e=>e.parentNode))],s=new Set;return t.forEach(e=>{for(const t in $a.b){const i=$a.b[t];e.closest(i.match+", [contenteditable]")!==this.appImManager.chat.input.messageInput&&s.add(this.buttons[t])}}),[...s]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const s=this.buttons[t];s.classList.toggle("active",e.includes(s))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),s=document.body.getBoundingClientRect(),i=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=i.top+-1*s.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,l=n.left,c=n.left+n.width-Math.min(n.width,o.width);let d;if(e){const e=this.container.getBoundingClientRect();d=Object(I.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(I.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Ca())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),re.IS_MOBILE||j.a.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){ue.IS_TOUCH_SUPPORTED&&!re.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",e=>{Object(c.a)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()},{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",e=>{if(document.activeElement===this.linkInput)return;if(document.activeElement!==this.appImManager.chat.input.messageInput)return void this.hide();const t=document.getSelection();if(Ca(t))this.hide();else if(ue.IS_TOUCH_SUPPORTED)if(re.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=t.getRangeAt(0),this.setMouseUpEvent()}else this.setMouseUpEvent()}))}}function Eo(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function Io(e,t,s,i,n,a,o,r){const l=[];return l.push("M"+(e+s/2)+","+t),l.push("H"+(e+s-a)),a>0&&l.push("A"+Eo(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+Eo(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+Eo(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Eo(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}de.a.generatePathData=Io;class Mo{constructor(e,t){let s;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(s=document.createElement("div"),s.classList.add("drop-icon","tgico-"+t.icon));const i=document.createElement("div");let n;i.classList.add("drop-header"),i.append(Object(x.i18n)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append(Object(x.i18n)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,s,i,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",""+e.width),this.svg.setAttributeNS(null,"height",""+e.height);const t=Io(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function Po(e){e.forEach(e=>e.classList.add("no-transition")),Object(De.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var To=s(154),ko=s(24),xo=s(126),Oo=s(118);class Ao{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:s,minRadius:i,speed:n}=this,a=s-i;e[t]=i+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:s,N:i}=this;for(let n=0;n=1&&(i[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,s,i,n,a,o,r){if(n.getContext){const l=n.getContext("2d");l.beginPath(),l.moveTo(s,i),l.lineTo(e,i);const{radius:c,radiusNext:d,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const s=this.progress[n],i=(t-(c[n]*(1-s)+d[n]*s))*r+o*(1-r);l.lineTo(e,i)}else{const a=this.progress[n-1],p=c[n-1]*(1-a)+d[n-1]*a,u=this.progress[n],m=(s-e)/h*(n-1),g=(s-e)/h*n,b=m+(g-m)/2,v=(t-p)*r+o*(1-r),f=(t-(c[n]*(1-u)+d[n]*u))*r+o*(1-r);l.bezierCurveTo(b,v,b,f,g,f),n===h&&l.lineTo(s,i)}a(l),l.fill(),l.closePath()}}}class Fo{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Fo.getGradientFromType(t,e,s,i,n,a)}}static getGradientFromType(e,t,s,i,n,a){const o=e.createLinearGradient(s,i,n,a);return t===Oo.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Oo.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Oo.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Oo.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class _o{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout(()=>{this.resizing=!1,this.invokeDraw()},250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:s,lbd2:i,scale:n,left:a,top:o,right:r,bottom:l,currentState:c,previousState:d,focused:h,resizing:p,canvas:u}=this;if(!h&&!p&&this.progressToState>=1)return;let m=Date.now()-this.lastUpdateTime;m>20&&(m=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*m,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:g,amplitude2:b,progressToState:v}=this,f=6*b*n,y=6*b*n;u.getContext("2d").clearRect(0,0,u.width,u.height),t.minRadius=0,t.maxRadius=(2+2*g)*n,s.minRadius=0,s.maxRadius=(3+9*g)*n,i.minRadius=0,i.maxRadius=(3+9*g)*n,t.update(g,.3),s.update(g,.7),i.update(g,.7);for(let e=0;e<2;e++){if(0===e&&!d)continue;let n=1,h=null;0===e?(n=1-v,h=d):(n=d?v:1,c.update(l-o,r-a,m,g),h=c);const p=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,l)},b=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,l)};s.draw(a,o-f,r,l,u,p,o,1),i.draw(a,o-y,r,l,u,p,o,1),t.draw(a,o,r,l,u,b,o,1)}e||(this.raf=requestAnimationFrame(()=>this.draw()))},this.setCurrentState=(e,t)=>{const{currentState:s,states:i}=this;(null==s?void 0:s.stateId)!==e&&(this.previousState=t?s:null,this.currentState=i.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[Oo.a.UNMUTED,new Fo(Oo.a.UNMUTED)],[Oo.a.MUTED,new Fo(Oo.a.MUTED)],[Oo.a.MUTED_BY_ADMIN,new Fo(Oo.a.MUTED_BY_ADMIN)],[Oo.a.CONNECTING,new Fo(Oo.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Oo.a.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new Ao(3),this.lbd1=new Ao(7),this.lbd2=new Ao(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const s=this.canvas=document.createElement("canvas");return s.classList.add(e+"-canvas"),t.append(s),t}}var Do=new class{constructor(){this.cache={},a.default.addEventListener("theme_change",()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(let t in e)this.getProperty(t)})}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}};class jo{constructor(e,t){this.item=e,Object(w.g)(this,t)}play(e){return this.item.playPart(this,e)}}class Bo{constructor(e,t){this.icon=e,this.autoplay=!1,Object(w.g)(this,t),this.parts=this.parts.map(e=>this.createPart(e))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:s,canvas:i,width:n,height:a}=this.icon;return t=le.a.loadAnimationAsAsset({container:s,canvas:i,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then(e=>le.a.waitForFirstFrame(e)).then(e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)}),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new jo(this,e)}getPart(e){return e instanceof jo?e:"string"==typeof e?this.parts.find(t=>t.name===e):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Ro{constructor(e){Object(w.g)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:s}=this;this.container.style.width=t+"px",this.container.style.height=s+"px";const i=this.canvas=document.createElement("canvas");i.classList.add("rlottie"),i.width=t,i.height=s,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Fe.a)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Bo(this,e);return this.items.set(e.name,t),t}playPart(e,t,s){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,s)});const i=e.getPart(t);e.player.playPart({from:a.default.settings.animationsEnabled&&!this.skipAnimation?i.startFrame:i.endFrame,to:i.endFrame,callback:s})}static generateEqualParts(e,t){return new Array(e).fill(0).map((e,s)=>{const i=s*t;return{startFrame:i,endFrame:i+t-1}})}}class Uo extends Ro{constructor(e){super({width:e.width,height:e.height}),Object(w.g)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const s=this.getPart(e),i=void 0!==t&&this.getColor&&this.getColor(t),n=s.item;n.initFrame=s.endFrame,n.color=i;const a=[...this.items.values()].map(e=>e.load());return Promise.all(a).then(Fe.a)}setState(e,t,s){this.loaded||this.load(e,t);let i=!1,n=!1;return void 0!==e?i=this.setPartState(e,t,s):void 0!==t&&this.getColor&&(n=this.setColorState(t)),i||n}setPartState(e,t,s){const{partState:i}=this;if(i===e)return void 0!==t&&this.setColorState(t);void 0!==t&&this.setColorState(t,!1),this.partState=e;return this.getPart(e,i).play(s),!0}setColorState(e,t=!0){const{colorState:s}=this;if(s===e)return!1;this.colorState=e;const i=this.getItem(),n=this.getColor(e,s),a=()=>{i.player.setColor(n,t)};return i.player?a():i.onLoadForColor=a,!0}destroy(){this.items.forEach(e=>{e.loadPromise.then(()=>{e.player.remove()})})}}class Ho extends Uo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const s=tr;let i;switch(e){case s.HAND:i=t===s.MUTED?"muted-to-hand":"unmuted-to-hand";break;case s.MUTED:i=t===s.HAND?"hand-to-muted":"mute";break;case s.UNMUTED:i="unmute"}return this.getItem().getPart(i)}});this.container.classList.add("group-call-microphone-icon-container");this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}class No extends Uo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const s=er;let i;switch(e){case s.HAND:i=3;break;case s.MUTED:i=t===s.HAND?0:2;break;case s.UNMUTED:i=1}return this.getItem().getPart(i)},getColor:e?(e,t)=>function(e){const t=er;let s,i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const n=Do.getProperty("gc-"+i+"-text-color");return s=function(e){return xi(e.slice(0,7))}(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=Ro.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=er;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}class zo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-status-container")}setState(e,t){const s=er,i=this.withIcons.filter(e=>!!t[e]).map(e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),s=document.createElement("i");return s.classList.add("group-call-participant-status-icon","group-call-participant-status-icon-"+e,t),s});let n,a;if(e===s.MUTED_FOR_ME)n=Object(x.i18n)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===s.UNMUTED)n=Object(x.i18n)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===s.HAND)n=Object(x.i18n)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!i.length)return void g(this.container,J.b.wrapEmojiText(t.about));n=Object(x.i18n)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add("group-call-participant-status",a),o.append(...i,n),Object(k.a)(this.container,o)}}class Vo extends As{constructor(e){super({getIndex:e=>e.participant.date,onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>{const{participant:t}=e,s=ar(t);e.mutedIcon.setState(s),e.status.setState(s,t)},onSort:(e,t)=>{Os(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=qr.addDialogNew({dialog:t.id,container:!1,drawStatus:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,lazyLoadQueue:this.lazyLoadQueue});s.listEl.classList.add("group-call-participant");const i=e.participants.get(t.id),n=ar(i),a=new No(!0),o=new zo(["presentation","video"]);return a.setState(n),o.setState(n,i),Object(k.a)(s.lastMessageSpan,o.container),s.listEl.append(a.container),t.dom=s,t.participant=i,t.mutedIcon=a,t.status=o,t},updateElementWith:De.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=qr.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}class Ko{constructor(e,t,s){this.appPeersManager=e,this.instance=t,this.source=s,this.container=document.createElement("div"),this.container.classList.add("group-call-participant-video-container"),this.info=document.createElement("div"),this.info.classList.add("group-call-participant-video-info"),this.left=document.createElement("div"),this.left.classList.add("group-call-participant-video-info-left"),this.right=document.createElement("div"),this.right.classList.add("group-call-participant-video-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add("group-call-participant-video-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,s){let i;e.pFlags.self?(i=Object(x.i18n)("VoiceChat.Status.You"),i.classList.add("peer-title")):(this.peerTitle=new Lt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new No(!1),this.groupCallParticipantStatus=new zo([t]),this.left.append(i,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),s.classList.add("group-call-participant-video","call-video"),s.paused&&s.play();const n=function(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const s=t.getContext("2d");s.filter="blur(2px)";const i=()=>{s.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return Object(os.a)(()=>(i(),t.isConnected)),i(),t}(s);n.classList.add("group-call-participant-video-blur"),this.container.prepend(n,s),this.updateParticipant(e)}updateParticipant(e){const t=ar(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Go extends Pe{constructor(e){super(),Object(w.g)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:s}=this;s.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)}),s.add(this.instance)("pinned",e=>{this.participantsElements.forEach(t=>{t.forEach(t=>{this.setElementDisplay(t,e)})})}),Object(l.b)(this.container,e=>{const t=Object(Me.a)(e.target,"group-call-participant-video-container");if(!t)return;const s=this.containers.get(t);this.instance.pinnedSource!==s.source?this.instance.pinSource(s.source):this.instance.unpinAll()},{listenerSetter:s}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:s,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const s=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!s);const i=e.source===t;e.setPinned(i)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=["video","presentation"],i=s.some(t=>!!e[t]);let n=this.participantsElements.get(t);(i||n)&&(n||this.participantsElements.set(t,n=new Map),s.forEach(s=>{let i=n.get(s);const a=e[s];if(!!a!=!!i){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,s);if(!t)return;const{video:a,source:o}=t;i=new Ko(this.appPeersManager,this.instance,o),this.containers.set(i.container,i),this.setElementDisplay(i,this.instance.pinnedSource),n.set(s,i),i.setParticipant(e,s,a),this.container.prepend(i.container)}else n.delete(s),i.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(i.container),i.destroy());this._onLengthChange()}else i&&i.updateParticipant(e)}))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.containers.forEach(e=>{e.destroy()})}}class Wo{constructor(e){this.onOpenProfileClick=()=>{const e=ut.b.getPopup(rr);e&&e.hide(),a.default.dispatchEvent("history_focus",{peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.appGroupCallsManager.editParticipant(this.instance.id,this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>{ln({peerId:this.targetPeerId,title:new Lt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Lt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},Fe.a)}}];const{listenerSetter:t}=e;this.appChatsManager=e.appChatsManager,this.appPeersManager=e.appPeersManager,this.appGroupCallsManager=e.appGroupCallsManager,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=Ce(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(te.a)(e.onContextElement,e=>{const t=Object(Me.a)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==s&&s.append(this.element);const i=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=this.instance.getParticipantByPeerId(i),this.participant.pFlags.self||(this.canManageCall=this.appChatsManager.hasRights(this.chatId,"manage_call"),this.buttons.forEach(e=>{e.element.classList.toggle("hide",!e.verify(i))}),Object(c.a)(e),Object(te.e)(e.touches?e.touches[0]:e,this.element,"right"),Object(te.d)(this.element))},t),t.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=this.appPeersManager.getPeerId(t.peer);this.targetPeerId===e&&Object(te.c)()}});let s=document.body;Object(Te.a)(document.body,()=>{const e=Object(Te.d)();s=e?ut.b.getPopup(rr).getContainer():document.body,e||Object(te.c)()},t)}}class qo{constructor(e){Object(w.g)(this,e);const t=new T.b(void 0);t.container.classList.add("group-call-participants-scrollable");const s=this.container=document.createElement("div");s.classList.add("group-call-participants");const i=this.sortedList=new Vo(this.instance),{instance:n,listenerSetter:o}=this;this.contextMenu=new Wo(Object.assign(Object.assign({},e),{onContextElement:i.list,listenerSetter:o,instance:n})),this.groupCallParticipantsVideo=new Go(Object.assign(Object.assign({},e),{appendTo:t.container,displayPinned:!1})),t.append(i.list),s.append(t.container),e.appendTo.append(s),o.add(a.default)("group_call_participant",({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)});new yt({scrollable:t,getPromise:()=>this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants:e,isEnd:t})=>(e.forEach(e=>{this.updateParticipant(e)}),t))});this.setInstance(n)}updateParticipant(e){const t=this.appPeersManager.getPeerId(e.peer),s=this.sortedList.has(t);e.pFlags.left?s&&this.sortedList.delete(t):s?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){e.participants.forEach(e=>{this.updateParticipant(e)})}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class Qo{constructor(e){this.appendTo=e,this.descriptionIntl=new x.default.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let s,i;t===Oo.a.CONNECTING?s="VoiceChat.Status.Connecting":(s="VoiceChat.Status.Members",i=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:s,args:i}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class $o{constructor(e){this.appendTo=e,this.peerTitle=new Lt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?g(s,J.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var Yo=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}));function Xo(e,t,s){const i=e+"-button",n=document.createElement("div");n.classList.add(i,"call-button","rp-overflow"),s.icon&&n.classList.add("tgico-"+s.icon),s.noRipple||Object(se.ripple)(n),s.isDanger&&n.classList.add(i+"-red"),s.isConfirm&&n.classList.add(i+"-green"),s.callback&&Object(l.b)(n,s.callback,{listenerSetter:t});let a=n;if(s.text){const e=document.createElement("div");e.classList.add(i+"-container","call-button-container");const t="string"==typeof s.text?Object(x.i18n)(s.text):s.text;t.classList.add(i+"-text","call-button-text"),e.append(n,t),a=e}return a}class Jo extends B.a{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},Object(w.g)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add("movable-element"),this.addResizeHandlers(),this.setSwipeHandler(),b.b.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove("movable-element"),this.handlers&&this.handlers.forEach(e=>{e.remove()})}destroy(){b.b.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map(e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add("movable-element-resize-handler","movable-element-resize-handler-side-"+e),this.element.append(t),t})}setSwipeHandler(){let e,t,s,i,n;const a=this.swipeHandler=new Vt({element:this.element,onSwipe:(a,o,r)=>{if(a*=-1,o*=-1,n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,i=Math.abs(a)*(e?1:-1),o=n.includes("e")?Ct.a.width-t:s+t;this.width=Math.min(o,s+i)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,s=Math.abs(o)*(t?1:-1),a=n.includes("s")?Ct.a.height-e:i+e;this.height=Math.min(a,i+s)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+s-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+i-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const s=Object(Me.a)(t,"movable-element-resize-handler");return s?(n=s.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,s=this.width,i=this.height}})}setPositionToCenter(){this.top=Ct.a.height/2-this.height/2,this.left=Ct.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(I.a)(this.width,this.minWidth,Ct.a.width),this.height=Object(I.a)(this.height,this.minHeight,Ct.a.height)}fixPosition(){this.top=Object(I.a)(this.top,0,Ct.a.height-this.height),this.left=Object(I.a)(this.left,0,Ct.a.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:s,height:i}=this;return{top:e,left:t,width:s,height:i}}set state(e){const{top:t,left:s,width:i,height:n}=e;this.top=t,this.left=s,this.width=i,this.height=n,this.onResize()}}var Zo,er,tr,sr=function(e,t,s,i){if("a"===s&&!i)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===s?i:"a"===s?i.call(e):i?i.value:t.get(e)},ir=function(e,t,s,i,n){if("m"===i)throw new TypeError("Private method is not writable");if("a"===i&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===i?n.call(e,s):n?n.value=s:t.set(e,s),s};class nr{constructor(e){Zo.set(this,void 0),Object(w.g)(this,e),this.toggleMovable(!ue.IS_TOUCH_SUPPORTED),this.listenerSetter.add(b.b)("changeScreen",(e,t)=>{t!==b.a.mobile&&e!==b.a.mobile||this.toggleMovable(!ue.IS_TOUCH_SUPPORTED)})}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return sr(this,Zo,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=ir(this,Zo,new Jo(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),ir(this,Zo,void 0,"f")}}}function ar(e){const t=er;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}Zo=new WeakMap,function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(er||(er={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(tr||(tr={}));let or={width:420,height:640};class rr extends ut.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Te.e)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.onVideoClick=()=>{const e=Object(bt.a)([this.btnVideo],!0);this.instance.toggleVideoSharing().finally(()=>{e()})},this.onScreenClick=()=>{const e=Object(bt.a)([this.btnScreen],!0);this.instance.toggleScreenSharing().finally(()=>{e()})},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{const e=e=>{this.instance.hangUp(e)};this.appChatsManager.hasRights(this.instance.chatId,"manage_call")?new gt("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=Object(Te.d)(),{btnFullScreen:t,btnExitFullScreen:s}=this,i=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),s&&s.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==i&&(E.a.checkAnimations(e),a.default.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=Object(Te.d)(),s=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,i=(t||!!(s&&s.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;i&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach(e=>{e.style.opacity="0"}),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",i),this.btnInvite.classList.toggle("hide",i),this.btnShowColumn.classList.toggle("hide",!i),a&&a.forEach(e=>{e.style.opacity=""})},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},Object(w.g)(this,e),this.videosCount=0,this.container.classList.add("group-call","night");const t=this.instance=this.appGroupCallsManager.groupCall,{listenerSetter:s}=this;if(!re.IS_APPLE_MOBILE){const e=this.btnFullScreen=H("fullscreen"),t=this.btnFullScreen2=H("fullscreen group-call-cfs"),i=this.btnExitFullScreen=H("smallscreen");Object(l.b)(e,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(t,this.onFullScreenClick,{listenerSetter:s}),Object(l.b)(i,()=>{Object(Te.b)()},{listenerSetter:s}),Object(Te.a)(this.container,this.onFullScreenChange,s)}this.btnInvite=H("adduser");const i=this.btnShowColumn=H("rightpanel group-call-only-big");Object(l.b)(i,this.toggleRightColumn,{listenerSetter:s});const n=document.createElement("div");n.classList.add("group-call-header-info"),this.title.classList.add("group-call-header-title");const o=document.createElement("div");o.classList.add("group-call-header-subtitle"),n.append(this.title,o),this.header.classList.add("group-call-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const r=this.header.cloneNode(!1),c=n.cloneNode(!1),d=this.title.cloneNode(!1);c.append(d);const h=H("rightpanel");r.append(...[h,c,this.btnFullScreen2].filter(Boolean)),Object(l.b)(h,this.toggleRightColumn,{listenerSetter:s}),this.body.prepend(r);const p=new T.b(void 0);p.container.classList.add("group-call-big-video-container"),this.container.append(p.container),this.groupCallTitle=new $o(this.title),this.groupCallDescription=new Qo(o),this.groupCallBodyHeaderDescription=new Qo(d),this.constructButtons(),this.groupCallParticipantsVideo=new Go(Object.assign({appendTo:p.container,instance:t,listenerSetter:s,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()}},e)),this.groupCallParticipants=new qo(Object.assign({appendTo:this.body,instance:t,listenerSetter:s},e)),this.movablePanel=new nr({listenerSetter:s,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!(Object(Me.a)(t,"chatlist")||Object(Me.a)(t,"group-call-button")||Object(Me.a)(t,"btn-icon")||Object(Me.a)(t,"group-call-participants-video-container")||Object(Te.d)())}},onResize:()=>this.toggleBigLayout(),previousState:or}),s.add(t)("state",()=>{this.updateInstance()}),s.add(a.default)("group_call_update",e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()}),s.add(t)("pinned",()=>{this.setHasPinned()}),s.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",()=>{const{movablePanel:e}=this;or=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()}),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add("group-call-buttons");const t=Xo.bind(null,"group-call",this.listenerSetter),s=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),i=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});i.classList.toggle("hide",!Yo);const n=t({noRipple:!0,callback:Object(gs.a)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Ho;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Yo);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(s,i,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===Oo.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Te.b)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const s=function(e,t){const s=tr;return t.pFlags.can_self_unmute?t.pFlags.muted?s.MUTED:s.UNMUTED:s.HAND}(0,e);this.container.dataset.micState=s===tr.HAND?"hand":s===tr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(s)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var lr,cr=s(166);!function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(lr||(lr={}));var dr=lr;class hr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let s;if(this.state=t,t===dr.CONNECTED){s=document.createElement("span"),s.classList.add("call-description-duration");const t=()=>{s.innerText=(""+e.duration).toHHMMSS(!0)};this.interval=window.setInterval(t,1e3),t()}else{let i;switch(t){case dr.PENDING:i=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case dr.REQUESTING:i="Call.StatusRequesting";break;case dr.EXCHANGING_KEYS:i="VoipExchangingKeys";break;case dr.CLOSED:i=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:i="Call.StatusConnecting"}s=Object(x.i18n)(i),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}Object(k.a)(this.container,s),this.container.parentElement||this.appendTo.append(this.container)}}class pr extends Uo{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}class ur{constructor(e,t,s,i){this.appGroupCallsManager=e,this.appPeersManager=t,this.appChatsManager=s,this.appAvatarsManager=i,this.onState=()=>{this.updateInstance(this.instance)};const n=this.listenerSetter=new R.a;n.add(a.default)("call_instance",({instance:e,hasCurrent:t})=>{t||this.updateInstance(e)}),n.add(a.default)("group_call_instance",e=>{this.updateInstance(e)}),n.add(a.default)("group_call_update",e=>{const t=this.appGroupCallsManager.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)}),n.add(a.default)("group_call_amplitude",({amplitudes:e,type:t})=>{const{weave:s}=this;if(!e.length||!s)return;let i=0;for(let t=0;ti?n:i}s.setAmplitude(i)})}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0),this.instance!==e&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new R.a,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof cr.a?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)));const t=this.instance.isMuted;let s=e instanceof cr.a?e.state:function(e,t){switch(e){case dr.CLOSING:case dr.CLOSED:return Oo.a.CLOSED;case dr.CONNECTED:return t?Oo.a.MUTED:Oo.a.UNMUTED;default:return Oo.a.CONNECTING}}(e.connectionState,t);const{weave:i}=this;i.componentDidMount();const n=s===Oo.a.CLOSED;document.body.classList.contains("is-calling")&&!n||(n&&i.setAmplitude(0),Object(Jt.a)(document.body,"is-calling",!n,250,n?()=>{i.componentWillUnmount(),this.clearCurrentInstance()}:void 0)),n||(i.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!t))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof cr.a)return this.groupCallTitle.update(e);Object(k.a)(this.center,new Lt.a({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header","topbar-call-container");const s=document.createElement("div");s.classList.add("topbar-call-left");const i=this.groupCallMicrophoneIconMini=new pr,n=H();n.append(i.container),s.append(n);const a=Object(gs.a)(()=>{this.instance.toggleMuted()},600,!0);Object(l.b)(n,e=>{Object(c.a)(e),a()},{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add("topbar-call-center"),this.groupCallTitle=new $o(o),this.groupCallDescription=new Qo(s),this.callDescription=new hr(s);const r=document.createElement("div");r.classList.add("topbar-call-right");const d=H("endcall_filled");r.append(d),Object(l.b)(d,e=>{Object(c.a)(e);const{instance:t}=this;t&&(t instanceof cr.a?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))},{listenerSetter:e}),Object(l.b)(t,()=>{if(this.instance instanceof cr.a){if(ut.b.getPopup(rr))return;new rr({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}},{listenerSetter:e}),t.append(s,o,r);const h=this.weave=new _o,p=h.render("topbar-call-weave");t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var mr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const gr="chat",br=ue.IS_TOUCH_SUPPORTED?"touchstart":"mousemove";const vr=new class{constructor(){this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.backgroundPromises={},this.onHashChange=()=>{const e=location.hash,t=e.split("?"),s=this.parseUriParams(e,t);if(this.log("hashchange",e,t[0],s),s.tgaddr){j.a.replaceState();const{onclick:e}=J.b.wrapUrl(s.tgaddr);if(e){const t=document.createElement("a");t.href=s.tgaddr,window[e](t)}}else switch(t[0]){case"#/im":{const e=s.p;let t=void 0!==s.post?v.a.generateMessageId(+s.post):void 0;switch(e[0]){case"@":this.openUsername({userName:e,lastMsgId:t});break;default:this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}}},this.setSettings=()=>{document.documentElement.style.setProperty("--messages-text-size",a.default.settings.messagesTextSize+"px"),document.body.classList.toggle("animation-level-0",!a.default.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",a.default.settings.animationsEnabled),this.chatsSelectTabDebounced=dt(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ht.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.default.settings.animationsEnabled?250:0,!1,!0),le.a.setLoop(a.default.settings.stickers.loop),E.a.checkAnimations(!1);for(const e of this.chats)e.setAutoDownloadMedia();x.default.setTimeFormat(a.default.settings.timeFormat)},this.onDocumentPaste=(e,t)=>{const s=Ra();if(this.canDrag()||s){if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&Object(c.a)(e)}Object(me.d)(e).then(e=>{if(e.length){if(s)return void s.addFiles(e);const i=this.chat.input;i.willAttachType=t||(m.has(e[0].type)?"media":"document"),new Ua(this.chat,e,i.willAttachType)}})}},ti.a.attach(),Dt.a.start(),this.log=Object(X.b)("IM",X.a.Log|X.a.Warn|X.a.Debug|X.a.Error),this.selectTab(0),window.addEventListener("blur",()=>{E.a.checkAnimations(!0),this.offline=a.default.idle.isIDLE=!0,this.updateStatus(),clearInterval(this.updateStatusInterval),a.default.dispatchEvent("idle",a.default.idle.isIDLE),window.addEventListener("focus",()=>{this.offline=a.default.idle.isIDLE=!1,this.updateStatus(),this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),E.a.checkAnimations(!1),a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0})}),window.addEventListener(br,()=>{this.updateStatusInterval=window.setInterval(()=>this.updateStatus(),5e4),this.updateStatus(),this.offline=a.default.idle.isIDLE=!1,a.default.dispatchEvent("idle",a.default.idle.isIDLE)},{once:!0,passive:!0}),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(b.b.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),j.a.onHashChange=this.onHashChange,this.setSettings(),a.default.addEventListener("settings_updated",this.setSettings),Object(Ts.a)(()=>{E.a.setOnlyOnePlayableGroup("lock"),E.a.checkAnimations(!0)},()=>{E.a.setOnlyOnePlayableGroup(""),E.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&Yt.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)}),a.default.addEventListener("history_focus",e=>{let{peerId:t,threadId:s,mid:i,startParam:n}=e;s&&(s=v.a.generateMessageId(s)),i&&(i=v.a.generateMessageId(i)),this.setInnerPeer({peerId:t,lastMsgId:i,type:s?"discussion":void 0,threadId:s,startParam:n})}),a.default.addEventListener("peer_changing",e=>{this.saveChatPosition(e)}),a.default.addEventListener("theme_change",()=>{this.applyCurrentTheme()}),a.default.addEventListener("choosing_sticker",e=>{this.setChoosingStickerTyping(!e)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{var s;const n=this.chat;if(!n||n.peerId!==e||a.default.overlaysActive||b.b.activeScreen===b.a.mobile&&1!==this.tabId)return;const o=t.find(e=>"sendMessageEmojiInteraction"===e.action._);if("sendMessageEmojiInteraction"===(null===(s=null==o?void 0:o.action)||void 0===s?void 0:s._)){const t=o.action,s=n.bubbles.bubbles[v.a.generateMessageId(o.action.msg_id)];if(s&&ua(s,n.bubbles.scrollable.container)){const n=s.querySelector(".media-sticker-wrapper");JSON.parse(t.interaction.data).a.forEach(e=>{setTimeout(()=>{Object(l.d)(n)},1e3*e.t)}),i.a.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}),a.default.addEventListener("instance_deactivated",()=>{const e=new ut.b("popup-instance-deactivated",void 0,{overlayClosable:!0}),t=document.createElement("div");t.classList.add("instance-deactivated-container"),e.container.replaceWith(t);const s=document.createElement("div");s.classList.add("header"),s.append(Object(x.i18n)("Deactivated.Title"));const i=document.createElement("div");i.classList.add("subtitle"),i.append(Object(x.i18n)("Deactivated.Subtitle")),t.append(s,i),document.body.classList.add("deactivated"),e.onClose=()=>{document.body.classList.add("deactivated-backwards"),To.a.activateInstance(),setTimeout(()=>{document.body.classList.remove("deactivated","deactivated-backwards")},333)},e.show()}),An.a.get("chatPositions").then(e=>{An.a.setToCache("chatPositions",e||{})}),(pa||vo)&&(this.topbarCall=new ur(xo.a,o.a,G.a,d.a)),To.a.activateInstance();const e=()=>{ko.default.setAuthorized(!0)};setInterval(e,oe.a),e(),this.addAnchorListener({name:"showMaskedAlert",callback:(e,t)=>{const s=t.href,i=t.cloneNode(!0);i.className="anchor-url",i.innerText=s,i.removeAttribute("onclick"),new gt("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[i],buttons:[{langKey:"Open",callback:()=>{i.click()}}]}).show()}}),this.addAnchorListener({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:s}=e;i.a.sendText(this.chat.peerId,"/"+t+(s?"@"+s:""))}}),this.addAnchorListener({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),this.addAnchorListener({name:"addstickers",callback:({pathnameParams:e})=>{const t={_:ha.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:ha.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),vo&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>mr(this,void 0,void 0,(function*(){let s;s="c"===e[0]?{_:ha.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:ha.MESSAGE,domain:e[0],post:e[1],comment:t.comment,start:"start"in t?t.start:void 0},this.processInternalLink(s)}))}),this.addAnchorListener({name:"resolve",protocol:"tg",callback:({uriParams:e})=>{let t;"telegrampassport"===e.domain||(t=this.makeLink(ha.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach(e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ha.JOIN_CHAT,e);this.processInternalLink(t)}})}),this.onHashChange(),this.attachKeydownListener()}get myId(){return a.default.myId}get chat(){return this.chats[this.chats.length-1]}appendEmojiAnimationContainer(e){const t=e===b.a.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",t=>{var s;const n=t.key;if(a.default.isOverlayActive||e.has(n))return;const o=t.target,r=this.chat;if("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===o.tagName){if(!t.altKey||"ArrowUp"!==n&&"ArrowDown"!==n){if("ArrowUp"===n){if(r.input.editMsgId||!r.input.isInputEmpty())return;{const e=i.a.getHistoryStorage(r.peerId,r.threadId).history.slice;if(e.isEnd(Mn.a.Bottom)&&e.length){let s;for(const t of e){const e=r.getMessage(t);if((this.myId===r.peerId?e.fromId===this.myId:e.pFlags.out)&&i.a.canEditMessage(r.getMessage(t),"text")){s=t;break}}s&&(r.input.initMessageEditing(s),Object(c.a)(t))}}}else if("ArrowDown"===n)return}else{const e=i.a.dialogsStorage.getFolderDialogs(a.default.filterId,!0);let t;if(a.default.peerId){const s=e.findIndex(e=>e.peerId===a.default.peerId);if(-1!==s){t=e["ArrowUp"===n?s-1:s+1]}}else"ArrowDown"===n&&(t=e[0]);t&&this.setPeer({peerId:t.peerId})}if((null===(s=null==r?void 0:r.input)||void 0===s?void 0:s.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==o.tagName&&!o.hasAttribute("contenteditable")&&!ue.IS_TOUCH_SUPPORTED&&(!b.b.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),Object(Da.a)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}})}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return mr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case ha.MESSAGE:{const t=e.post?v.a.generateMessageId(+e.post):void 0,s=e.comment?v.a.generateMessageId(+e.comment):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:s,startParam:e.start});break}case ha.PRIVATE_POST:{const t=e.channel.toChatId(),s=t.toPeerId(!0);if(G.a.getChat(t).deleted)try{yield G.a.resolveChannel(t)}catch(e){throw ct({langPackKey:"LinkNotFound"}),e}const i=v.a.generateMessageId(+e.post),n=e.thread?v.a.generateMessageId(+e.thread):void 0;n?this.openThread(s,i,n):this.setInnerPeer({peerId:s,lastMsgId:i,threadId:n});break}case ha.STICKER_SET:new Ri({id:e.set}).show();break;case ha.JOIN_CHAT:ht.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new ma(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&<(Object(x.i18n)("InviteExpired"))});break;case ha.VOICE_CHAT:vo&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;default:this.log.warn("Not supported internal link:",e)}}))}addAnchorListener(e){window[(e.protocol?e.protocol+"_":"")+e.name]=t=>{Object(c.a)(null);const s=t.href;let i,n;e.noPathnameParams||(i=new URL(t.href).pathname.split("/").slice(1)),e.noUriParams||(n=this.parseUriParams(s));const a=e.callback({pathnameParams:i,uriParams:n},t);return void 0===a&&a}}parseUriParams(e,t=e.split("?")){const s={};return t[1]?(t[1].split("&").forEach(e=>{s[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])}),s):s}openUsername(e){const{userName:t,lastMsgId:s,threadId:i,commentId:n,startParam:a}=e;return P.a.resolveUsername(t).then(e=>{const t="user"===e._,o=e.id.toPeerId(!t);return i?this.openThread(o,s,i):n?this.openComment(o,s,n):this.setInnerPeer({peerId:o,lastMsgId:s,startParam:a})},e=>{"USERNAME_NOT_OCCUPIED"===e.type?ct({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&ct({langPackKey:"Alert.UserDoesntExists"})})}openThread(e,t,s){return i.a.wrapSingleMessage(e,s).then(()=>{const n=i.a.getMessageByPeer(e,s);return"messageEmpty"===n._?t=void 0:i.a.generateThreadServiceStartMessage(n),this.setInnerPeer({peerId:e,lastMsgId:t,threadId:s,type:"discussion"})})}openComment(e,t,s){return i.a.getDiscussionMessage(e,t).then(e=>this.openThread(e.peerId,s,e.mid))}callUser(e,t){return mr(this,void 0,void 0,(function*(){}))}discardCurrentCall(e){}discardCallConfirmation(e){return mr(this,void 0,void 0,(function*(){}))}discardGroupCallConfirmation(e){return mr(this,void 0,void 0,(function*(){const t=xo.a.groupCall;t&&(yield ln({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Lt.a({peerId:t.chatId.toPeerId(!0)}).element,new Lt.a({peerId:e}).element],button:{langKey:"OK"}}),xo.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return mr(this,void 0,void 0,(function*(){const s=e.toChatId(),i=G.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield xo.a.getGroupCallFull(t))._){if(!i)return void ct({langPackKey:"VoiceChat.Chat.Ended"});yield ln({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{mr(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=xo.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield xo.a.createGroupCall(s)}xo.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.default.getTheme();if("image"===t.background.type||"default"===t.background.type&&t.background.slug){const s=M.AppStateManager.STATE_INIT.settings.themes.find(e=>e.name===t.name);if(!(t.background.blur===s.background.blur&&t.background.slug===s.background.slug))return this.getBackground(t.background.slug).then(t=>this.setBackground(t,e),()=>(t.background=Object(w.a)(s.background),this.setBackground("",!0)))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=he.a.cacheStorage.getFile("backgrounds/"+e).then(e=>URL.createObjectURL(e))}setBackground(e,t=!0){const s=this.chats.map(t=>t.setBackground(e));return s[s.length-1].then(()=>{t&&a.default.dispatchEvent("background_change")})}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,s=t.scrollable.scrollTop,i=e.peerId+(e.threadId?"_"+e.threadId:""),n=An.a.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!Object.keys(t.bubbles).length)delete n[i],this.log("deleted chat position");else{const e={mids:Object(w.e)(t.bubbles,"desc"),top:s};n[i]=e,this.log("saved chat position:",e)}An.a.set({chatPositions:n},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),s=An.a.getFromCache("chatPositions");return s&&s[t]}applyHighlightningColor(){let e;const t=a.default.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!ue.IS_TOUCH_SUPPORTED&&e&&(a.default.themeColor=function(e){return Ai(e).slice(0,-2)}(e))}applyCurrentTheme(e,t,s){return this.applyHighlightningColor(),a.default.setTheme(),t&&(this.backgroundPromises[e]=Promise.resolve(t)),this.setCurrentBackground(void 0===s?!!e:s)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Po([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.default.settings.animationsEnabled&&!1!==t&&Object(Ts.b)(Object(kn.a)(400),400);const s=Object(xs.a)(this.prevTab);Object(xs.a)(e)>s&&j.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(Ks.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),ue.IS_TOUCH_SUPPORTED||this.attachDragAndDropListeners(),this.markupTooltip=new Co(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>mr(this,void 0,void 0,(function*(){if(l===s)return;const c=r.dataTransfer.types,d=c.contains?c.contains("Files"):c.indexOf("Files")>=0,h=Ra();if(!d||!this.canDrag()&&!h)return void(n=0);const p=h?o:a,u=h?t:e;if(l&&!u.length){const e=yield Object(me.d)(r,!0),t=d&&!e.length,s=e.filter(e=>m.has(e)).length;this.log("drag files",e),h?(h.appendDrops(p),(e.length||t)&&u.push(new Mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new Mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new Mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),vr.log("drop",e),vr.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(Jt.a)(p,"is-visible",l,200,()=>{l||(u.forEach(e=>{e.destroy()}),u.length=0)}),l?u.forEach(e=>{e.setPath()}):n=0,document.body.classList.toggle("is-dragging",l),s=l}));let n=0;document.body.addEventListener("dragenter",e=>{n++}),document.body.addEventListener("dragover",e=>{i(e,!0),Object(c.a)(e)}),document.body.addEventListener("dragleave",e=>{n--,0===n&&i(e,!1)});const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||a.default.isOverlayActive||!e.canSend("send_media"))}selectTab(e,t){!1===t&&Po([vn.sidebarEl,this.columnEl,Yt.sidebarEl]),document.body.classList.toggle("is-left-column-shown",0===e);const s=this.tabId;this.log("selectTab",e,s);let i=a.default.settings.animationsEnabled?Object(De.a)():Promise.resolve();if(-1!==s&&s!==e&&a.default.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(kn.a)(e),Object(Ts.b)(i,e)}return this.tabId=e,Object(Ks.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!j.a.findItemByType("im"))&&j.a.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}}),a.default.dispatchEvent("im_tab_change",e),i}updateStatus(){return this.myId?(P.a.setUserStatus(this.myId,this.offline),ht.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new So(this,G.a,C.a,Jn,i.a,o.a,r.a,n.default,cs.a,P.a,Lo.a,Je.a,ht.a,Mi.a,Ze.a,An.a,Dt.a,jn,v.a,xo.a);return this.chats.length&&e.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(!0)),this.chats.push(e),e}spliceChats(e,t=!0,s,i){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&a.default.dispatchEvent("peer_changing",this.chat),i||(i=this.chats.splice(e,this.chats.length-e)),a.default.dispatchEvent("chat_changing",{from:n,to:this.chat});for(let e=0;e1&&i.slice(0,-1).forEach(e=>{e.container.remove()}),this.chatsSelectTab(this.chat.container,s),t){a.default.dispatchEvent("peer_changed",this.chat.peerId);const e=Yt.getTab(yo);e&&e.close();Yt.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(Yt.sharedMediaTab.loadSidebarMedia(!0),Yt.sharedMediaTab.fillProfileElements())}i.forEach(e=>{e.beforeDestroy()}),setTimeout(()=>{i.forEach(e=>{e.destroy()})},350)}setPeer(e={},t){var s;this.init&&(this.init(),this.init=null),null!==(s=e.peerId)&&void 0!==s||(e.peerId=Be.c);const{peerId:i,lastMsgId:n}=e,a=this.chat,o=this.chats.indexOf(a);if(i){if(o>0&&a.peerId&&a.peerId!==i){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===i)return void this.spliceChats(0,!0,!0,t);{const s=this.setPeer(e);return this.spliceChats(0,!1,!1,t),s}}}else{if(o>0)return void this.spliceChats(o,void 0,t);if(b.b.activeScreen===b.a.medium)return void this.selectTab(+!this.tabId,t)}if(i===a.peerId&&b.b.activeScreen<=b.a.medium&&document.body.classList.contains("is-left-column-shown"))return this.selectTab(1,t),!1;if(i||b.b.activeScreen!==b.a.mobile){const s=a.setPeer(i,n,e.startParam),o=(null==s?void 0:s.cached)?s.promise:Promise.resolve();i&&o.then(()=>{setTimeout(()=>{setTimeout(()=>{this.chatsSelectTab(this.chat.container)},0),this.selectTab(1,t)},0)})}return i?void 0:(this.selectTab(0,t),!1)}setInnerPeer(e){var t;const{peerId:s}=e;if(s===Be.c||!s)return;const i=null!==(t=e.type)&&void 0!==t?t:e.type="chat",n=this.chats.findIndex(e=>e.peerId===s&&e.type===i);if(-1!==n)return this.spliceChats(n+1),this.setPeer(e);const o=this.chat;let r=o;return o.inited&&(r=this.createNewChat()),i&&(r.setType(i),e.threadId&&(r.threadId=e.threadId)),a.default.dispatchEvent("chat_changing",{from:o,to:r}),this.setPeer(e)}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let s="peer-typing";switch(t.classList.add(s),t.dataset.action=e._,e._){case"sendMessageTypingAction":s+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=s+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":s+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":s+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":s+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=s+"-eye",t.append(e)}}return t.classList.add(s),t}getPeerTyping(e,t){if(!P.a.isBot(e)){const s=n.default.getPeerTypings(e);if(!s||!s.length)return;const i=s[0],a={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},o=e.isUser()?a.private:s.length>1?a.multi:a.chat;let r=i.action;if(s.length>1){const e={};s.forEach(t=>{const s=t.action._;void 0===e[s]&&(e[s]=0),++e[s]}),Object.keys(e).length>1&&(r={_:"sendMessageTypingAction"})}const l=o[r._];if(!l)return;t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===r._||"sendMessageEmojiInteractionSeen"===r._);let c,d=t.firstElementChild;if(d?d.dataset.action!==r._&&d.replaceWith(this.getTypingElement(r)):(d=this.getTypingElement(r),t.prepend(d)),e.isAnyChat()&&(c=[new Lt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(_e.a)(J.b.wrapEmojiText(r.emoticon));c.push(e)}const h=Object(x.i18n)(l,c);return h.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(h):t.append(h),t}}getPeerStatus(e){var t;return mr(this,void 0,void 0,(function*(){let s;if(e){if(e.isAnyChat()){let t=this.getPeerTyping(e);if(t)return t;const i=e.toChatId(),a=yield n.default.getChatFull(i);this.chat.log("chatInfo res:",a);const o=a.participants_count||a.participants&&a.participants.participants&&a.participants.participants.length||1;if(s=n.default.getChatMembersString(i),o<2)return s;const r=yield n.default.getOnlines(i);if(r>1){const e=document.createElement("span");e.append(...Object(x.join)([s,Object(x.i18n)("OnlineCount",[Object(I.d)(r)])],!1)),s=e}return s}{const i=P.a.getUser(e);if(a.default.myId===e)return;if(i){if(s=P.a.getUserStatusString(i.id),!P.a.isBot(e)){let n=this.getPeerTyping(e);if(n||"userStatusOnline"!==(null===(t=i.status)||void 0===t?void 0:t._)||(n=document.createElement("span"),n.classList.add("online"),n.append(s)),n)return n}return s}}}}))}setPeerStatus(e,t,s,i,n){s&&(t.innerHTML=i?"‎":"");const a=t.querySelector(".peer-typing-container");a&&this.getPeerTyping(e,a)||this.getPeerStatus(e).then(e=>{n()&&Object(k.a)(t,e||(i?"‎":""))})}setChoosingStickerTyping(e){i.a.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"})}};de.a&&(de.a.appImManager=vr);var fr=vr;var yr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class wr extends B.a{constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if(Object(c.a)(e),ue.IS_TOUCH_SUPPORTED)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout(()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0},3e3));const s=this.isZooming();let i=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];s&&n.push("media-viewer-movers"),n.find(e=>{try{if(i=Object(Me.a)(t,e),i)return!0}catch(e){return!1}}),i&&(s||"IMG"!==t.tagName&&"image"!==t.tagName)||this.buttons.close.click()},this.onKeyDown=e=>{if(a.default.overlaysActive>1)return;const t=e.key;let s=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):s=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),s&&Object(c.a)(e)},this.onKeyUp=e=>{a.default.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(a.default.overlaysActive>1||Object(Me.a)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&(Object(c.a)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.log=Object(X.b)("AMV"),this.preloader=new ye.a,this.preloaderStreamable=new ye.a({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new ee.a,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add("media-viewer-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const s=document.createElement("div");s.classList.add("media-viewer");const i=this.topbar=document.createElement("div");i.classList.add("media-viewer-topbar","media-viewer-appear");const n=document.createElement("div");n.classList.add("media-viewer-topbar-left"),this.buttons["mobile-close"]=H("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add("media-viewer-author","no-select");const o=document.createElement("div");this.author.avatarEl=new Or,this.author.avatarEl.classList.add("media-viewer-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add("media-viewer-name"),this.author.date=document.createElement("div"),this.author.date.classList.add("media-viewer-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const r=document.createElement("div");r.classList.add("media-viewer-buttons"),t.concat(["download","zoom","close"]).forEach(e=>{const t=H(e,{noRipple:!0});this.buttons[e]=t,r.append(t)}),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=H("zoomout",{noRipple:!0}),this.zoomElements.btnOut.addEventListener("click",()=>this.changeZoom(!1)),this.zoomElements.btnIn=H("zoomin",{noRipple:!0}),this.zoomElements.btnIn.addEventListener("click",()=>this.changeZoom(!0)),this.zoomElements.rangeSelector=new Se({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add("media-viewer-content"),this.content.container=document.createElement("div"),this.content.container.classList.add("media-viewer-container"),this.content.media=document.createElement("div"),this.content.media.classList.add("media-viewer-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),s.append(this.content.main),this.overlaysDiv.append(s),n.append(this.buttons["mobile-close"],this.author.container),i.append(n,r),this.buttons.prev=document.createElement("div"),this.buttons.prev.className="media-viewer-switcher media-viewer-switcher-left",this.buttons.prev.innerHTML='',this.buttons.next=document.createElement("div"),this.buttons.next.className="media-viewer-switcher media-viewer-switcher-right",this.buttons.next.innerHTML='',this.moversContainer=document.createElement("div"),this.moversContainer.classList.add("media-viewer-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}setListeners(){if(this.buttons.download.addEventListener("click",this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach(e=>{e.addEventListener("click",this.close.bind(this))}),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach(([e,t])=>{t.addEventListener("click",t=>{Object(c.a)(t),this.setMoverPromise||this.listLoader.go(e)})}),this.buttons.zoom.addEventListener("click",()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)}),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},ue.IS_TOUCH_SUPPORTED){new Vt({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(Te.d)())return;if(Math.abs(e)/Ct.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/Ct.a.height>.2||t>125)&&(this.buttons.close.click(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Me.a)(e.target,"media-viewer-caption")})}}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const s=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(s),this.zoomElements.rangeSelector.setProgress(s),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const s=-1;this.zoomSwipeHandler=new Vt({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(i,n)=>{[i,n]=[i*s,n*s],this.zoomSwipeX+=i-e,this.zoomSwipeY+=n-t,[e,t]=[i,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(s)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=Ie({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();j.a.removeByType("media"),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then(({onAnimationEnd:e})=>e);return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.default.isOverlayActive=!1,E.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return yr(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const i=this.content.mover;t||(i.innerHTML="");const n=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(i);const o=0!==s,r=a.default.settings.animationsEnabled?o?350:200:0;let l,c;e&&(e instanceof Or||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Me.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Me.a)(e,"profile-avatars-container"),c=l.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==c.left&&(e=l=c=void 0))),e||(e=this.content.media),c||(l=e.parentElement,c=e.getBoundingClientRect());let d=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const s=ua(l,Object(Me.a)(l,"scrollable"),!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(d=!0):(l=(e=this.content.media).parentElement,c=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let p,u,m,g="";if(o?(p=1===s?Ct.a.width:-h.width,u=h.top):(p=c.left,u=c.top),g+=`translate3d(${p}px,${u}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(i.firstElementChild&&i.firstElementChild.classList.contains("media-viewer-aspecter")){m=i.firstElementChild;const e=m.querySelector(".ckin__player");if(e){const t=e.firstElementChild;m.append(t),e.remove()}m.style.cssText||(i.classList.remove("active"),this.setFullAspect(m,h,c),i.offsetLeft,i.classList.add("active"))}else m=document.createElement("div"),m.classList.add("media-viewer-aspecter"),i.prepend(m);m.style.cssText=`width: ${c.width}px; height: ${c.height}px; transform: scale3d(${h.width/c.width}, ${h.height/c.height}, 1);`}i.style.width=h.width+"px",i.style.height=h.height+"px";const b=c.width/h.width,v=c.height/h.height;o||(g+=`scale3d(${b},${v},1) `);let f=window.getComputedStyle(l).getPropertyValue("border-radius");const y=function(e){let t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(f);if(f=y.map(e=>parseInt(e)/b+"px").join(" "),o||(i.style.borderRadius=f),t&&1!==n){const e=Ct.a.width/2-c.width/2,t=Ct.a.height/2-c.height/2,s=c.left-e,i=c.top-t;this.moversContainer.style.transform=`matrix(${b}, 0, 0, ${v}, ${s}, ${i})`}else i.style.transform=g;let w;d&&(i.style.opacity="0");const S=e.classList.contains("is-out"),L=this.setMoverAnimationPromise=Object(ae.a)(),C={onAnimationEnd:L},E=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(E)}),t)return e instanceof SVGSVGElement&&(w=i.querySelector("path"),w&&this.sizeTailPath(w,h,b,r,!1,S,f)),e.classList.contains("media-viewer-media")&&i.classList.add("hiding"),this.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),setTimeout(()=>{i.style.borderRadius=f,i.firstElementChild&&(i.firstElementChild.style.borderRadius=f)},r/2),setTimeout(()=>{i.innerHTML="",i.classList.remove("moving","active","hiding"),i.style.cssText="display: none;",L.resolve()},r),i.classList.remove("opening"),C;{let t,s;if(e instanceof HTMLVideoElement){const t=Array.from(e.parentElement.querySelectorAll("img"));t.length&&(e=t.pop())}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const n=Array.from(e.querySelectorAll("img")).pop();n&&(t=new Image,s=n.src,i.append(t))}else if(e instanceof HTMLImageElement)t=new Image,s=e.src;else if(e instanceof HTMLVideoElement)t=document.createElement("video"),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,s=t+"-mv",{width:n,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+n),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${n} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,s)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,s));const r=o.firstElementChild,l=r.firstElementChild.firstElementChild;if(l instanceof SVGUseElement){let e,t=l.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,(e,t,s,i,o)=>`translate(${t=2!==(t=+t)?n-2/b:2/b}, ${a}) scale(${+i/b}, ${+o/v})`),l.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const s=f.split(" ").map(e=>parseInt(e));e=S?Io(0,0,n-9/b,a,...s):Io(9/b,0,n-9/b,a,...s),w.setAttributeNS(null,"d",e)}const c=o.lastElementChild;c.setAttributeNS(null,"width",""+h.width),c.setAttributeNS(null,"height",""+h.height),i.prepend(o)}m&&(m.style.borderRadius=f,t&&m.append(t)),t=i.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),m||(t.style.width=h.width+"px",t.style.height=h.height+"px"),s&&(yield Object(rs.b)(t,s))),i.style.display="",Object(De.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(De.a)(),i.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,d&&(i.style.opacity=""),m&&this.setFullAspect(m,h,c),setTimeout(()=>{i.style.borderRadius="",i.firstElementChild&&(i.firstElementChild.style.borderRadius="")},0),i.dataset.timeout=""+setTimeout(()=>{i.classList.remove("moving","opening"),m&&(i.querySelector("video"),i.classList.remove("active"),m.style.cssText="",i.offsetLeft),i.classList.add("center","no-transition"),i.classList.add("active"),delete i.dataset.timeout,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),C}))}setFullAspect(e,t,s){const i=t.width/t.height;let{width:n,height:a}=s;i>0?n=a*i:a=n*i,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,s,i,n,a,o){const r=Date.now(),{width:l,height:c}=t;i/=2;const d=o.split(" ").map(e=>parseInt(e)),h=()=>{const t=Date.now()-r;let o=i?t/i:1;o>1&&(o=1),n&&(o=1-o);const p=d.map(e=>e*o);let u;u=a?Io(0,0,l-9/s*o,c,...p):Io(9/s*o,0,l,c,...p),e.setAttributeNS(null,"d",u),t{const a=t?-i.width:s;return e.replace(n,a+"px")});e.style.transform=n,setTimeout(()=>{e.remove()},350)}setNewMover(){const e=document.createElement("div");if(e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover){this.content.mover.parentElement.append(e)}else this.moversContainer.append(e);return this.content.mover=e}updateMediaSource(e,t,s){const i=e.tagName.toLowerCase()===s?e:e.querySelector(s);if(i&&!Object(Me.a)(e,"document")){if(Object(Me.a)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===s)return void(t.classList.contains("manual")&&t.click());t.remove()}}Object(rs.a)(i,t),i.classList.contains("thumbnail")&&i.parentElement.classList.contains("media-container-aspecter")&&i.classList.remove("thumbnail")}}setAuthorInfo(e,t){Object(k.a)(this.author.date,Object(oe.d)(t));const s=e.isPeerId();let i;s?i=new Lt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=J.b.wrapEmojiText(e),i.classList.add("peer-title")),Object(k.a)(this.author.nameEl,i);let n=this.author.avatarEl;this.author.avatarEl=n.cloneNode(),s?this.author.avatarEl.removeAttribute("peer-title"):this.author.avatarEl.setAttribute("peer-title",""+e),this.author.avatarEl.setAttribute("peer",""+(e||Be.c)),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],d=[],h){return yr(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const p="document"===e._,u=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,d,o),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout(()=>{this.listLoader.load(!0)},0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const m=this.content.media,g=!n||n===m;g&&(n=m),this.target={element:n};const v=++this.tempId;m.firstElementChild&&(m.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),ue.IS_TOUCH_SUPPORTED||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),a.default.isOverlayActive=!0,E.a.checkAnimations(!0),re.IS_MOBILE_SAFARI||j.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const f=this.content.mover,y=Ct.a.width;let w=0;const S=Ct.a.height;S<1e6&&!b.b.isMobile&&(w=120);const L=S-120-w;let I=Promise.resolve();const M=r.a.setAttachmentSize(e,m,y,L,!b.b.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(g){const t=he.a.getCacheContext(e,M.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(I=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),m.append(s))}const P=!(!p||!e.supportsStreaming),T=P?this.preloaderStreamable:this.preloader;let k;if(u){const t=h&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,o=f.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==v&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),T&&T.detach()},{once:!0}),this.addEventListener("setMoverAfter",()=>{s.src="",s.load()},{once:!0}),re.IS_SAFARI&&(s.autoplay=!0),"gif"===e.type&&(s.muted=!0,s.autoplay=!0,s.loop=!0),a.append(s);const r=new Promise(e=>{s.addEventListener("canplay",e,{once:!0})}),l=()=>{"gif"!==e.type&&(s.dataset.ckin="default",s.dataset.overlay="1",Promise.all([r,i]).then(()=>{if(this.tempId!==v)return;(this.videoPlayer=new Oe(s,!0,P)).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(P){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{T.detach(),s.parentElement.classList.remove("is-buffering")},{once:!0})};s.addEventListener("waiting",()=>{const t=s.networkState===s.NETWORK_LOADING,i=s.readyState{Object(c.a)(e)}),e()}this.lazyLoadQueue.unshift({load:()=>{const o=he.a.getCacheContext(e),r=P?Promise.resolve():C.a.downloadDoc(e);return P||i.then(()=>{o.url||T.attach(f,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==v)return void this.log.warn("media viewer changed video");if(t){const e=fe.setSingleMedia(s,h);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}const e=o.url;n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(rs.a)(s,e),this.updateMediaSource(n,e,"video"),l()}),r}})});k=I.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=he.a.getCacheContext(e,M.type),i=p?C.a.downloadDoc(e):r.a.preloadPhoto(e,M);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==v)return void this.log.warn("media viewer changed photo");const t=s.url;if(n instanceof SVGSVGElement){if(this.updateMediaSource(n,t,"img"),this.updateMediaSource(f,t,"img"),b.b.isMobile){const e=f.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,i="IMG"===(null===(e=s.firstElementChild)||void 0===e?void 0:e.tagName)?s.firstElementChild:null;if(!i||i.src!==t){let e=new Image;e.classList.add("thumbnail"),Object(rs.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(De.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(f),this.preloader.setManual()}),i}})});k=I.then(t)}return this.setMoverPromise=k.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var Sr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Lr extends wr{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||Lr.isMediaCompatibleForDocumentViewer(a)))return{element:null,mid:s,peerId:n}}}),["delete","forward"]),this.onPrevClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,-1)},this.onNextClick=e=>{this.openMedia(this.getMessageByPeer(e.peerId,e.mid),e.element,1)},this.onDeleteClick=()=>{const e=this.target;new Ns(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Hs({[e.peerId]:[e.mid]},()=>this.close())},this.onAuthorClick=e=>{const{mid:t,peerId:s}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const i=this.searchContext.threadId,n=this.getMessageByPeer(s,t);this.close(e).then(()=>{if(b.b.isMobile){const e=Yt.getTab(Qt);e&&e.close()}fr.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:i?"discussion":void 0,threadId:i})})}},this.onDownloadClick=()=>{const{peerId:e,mid:t}=this.target,s=this.getMessageByPeer(e,t);if(s.media.photo)r.a.savePhotoFile(s.media.photo,fr.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&C.a.saveDocFile(e,fr.chat.bubbles.lazyLoadQueue.queueId)}},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add("media-viewer-caption");const t=()=>{e&&clearTimeout(e),e=window.setTimeout(()=>{e=void 0,this.content.caption.classList.remove("is-focused")},800)};this.content.caption.addEventListener("touchstart",()=>{b.b.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))});new T.b(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),Object(l.b)(this.buttons.delete,this.onDeleteClick);const s=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(s),this.setListeners()}get searchContext(){return this.listLoader.searchContext}setListeners(){super.setListeners(),this.buttons.forward.addEventListener("click",this.onForwardClick),this.author.container.addEventListener("click",this.onAuthorClick);const e=t=>{if(t.target instanceof HTMLAnchorElement){const s=t.target.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return Object(c.a)(t),this.close().then(()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),t.target.click()}),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?i.a.getScheduledMessageByPeer(e,t):i.a.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let s="";t&&(s=J.b.wrapRichText(t,{entities:e.totalEntities})),g(this.content.caption.firstElementChild,s),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,s=0,n=!1,a=[],o=[]){const r=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return Sr(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const l=e.mid,c=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,d=i.a.getMediaFromMessage(e),h="messageService"===e._||!i.a.canForward(e);[this.buttons.forward,this.btnMenuForward.element].forEach(e=>{e.classList.toggle("hide",h)}),this.wholeDiv.classList.toggle("no-forwards",h);const p=h;[this.buttons.download,this.btnMenuDownload.element].forEach(e=>{e.classList.toggle("hide",p)});const u=i.a.canDeleteMessage(e);[this.buttons.delete,this.btnMenuDelete.element].forEach(e=>{e.classList.toggle("hide",!u)}),this.setCaption(e);const m=r._openMedia.call(this,d,e.date,c,s,t,n,a,o,e);return this.target.mid=l,this.target.peerId=e.peerId,m}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||m.has(e.mime_type)}}class Cr extends S{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,s)=>{var i;if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const n=(null==e?void 0:e.photoId)||(null===(i=this.current)||void 0===i?void 0:i.photoId);return r.a.getUserPhotos(this.peerId,n,s).then(e=>{const t=e.photos.map(e=>({element:null,photoId:e}));return{count:e.count,items:t}})}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var Er=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Ir extends wr{constructor(e){super(new Cr({peerId:e}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{r.a.savePhotoFile(r.a.getPhoto(this.target.photoId),fr.chat.bubbles.lazyLoadQueue.queueId)},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,s=0,i,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return Er(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=r.a.getPhoto(e),l=a._openMedia.call(this,o,o.date,this.peerId,s,t,!1,i,n);return this.target.photoId=o.id,l}))}}var Mr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};const Pr=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[peer="'+e+'"]')).forEach(e=>{e.update()})};function Tr(e,t,s,a,o,l){return Mr(this,void 0,void 0,(function*(){let c=yield n.default.getFullPhoto(t);if(!s()||!c)return;const d=()=>Array.from(e.querySelectorAll("img")).find(e=>!e.classList.contains("emoji"))?e:null;if(t.isAnyChat()){const e=!!a,n="inputMessagesFilterChatPhotos";if(!a&&(a=yield i.a.getSearch({peerId:t,inputFilter:{_:n},maxId:0,limit:1}).then(e=>e.history[0]),!s()))return;if(a){a.action.photo.id!==c.id&&(e||(a=i.a.generateFakeAvatarMessage(t,c)));const s=e=>e.map(e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId}));return void(new Lr).setSearchContext({peerId:t,inputFilter:{_:n}}).openMedia(a,d(),void 0,void 0,o?s(o):void 0,l?s(l):void 0)}}if(c){!Object(w.f)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new Ir(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.default.addEventListener("avatar_update",Pr),a.default.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||Pr(e)});const kr=new Map,xr=new Set;class Or extends HTMLElement{constructor(){super(...arguments),this.isDialog=!1,this.addedToQueue=!1}connectedCallback(){if(this.isDialog="1"===this.getAttribute("dialog"),""===this.getAttribute("clickable")){this.setAttribute("clickable","set");let e=!1;Object(l.b)(this,t=>Mr(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield Tr(this,this.peerId,()=>this.peerId===s),e=!1})))}}disconnectedCallback(){const e=kr.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||kr.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}static get observedAttributes(){return["peer","dialog","peer-title"]}attributeChangedCallback(e,t,s){if("peer"===e){const e=(s||"").toPeerId()||Be.c;if(this.peerId===e)return;this.peerId=o.a.getPeerMigratedTo(e)||e;const i=(t||"").toPeerId()||Be.c;if(i){const e=kr.get(i);e&&(e.delete(this),e.size||kr.delete(i))}this.update()}else"peer-title"===e?this.peerTitle=s:"dialog"===e&&(this.isDialog="1"===s)}r(e=!1){const t=d.a.putPhoto(this,this.peerId,this.isDialog,this.peerTitle,e),s=t?t.loadPromise:Promise.resolve();return this.loadPromises&&(t&&t.cached&&this.loadPromises.push(s),s.finally(()=>{this.loadPromises=void 0})),t}update(){if(this.lazyLoadQueue){if(!xr.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=kr.get(this.peerId);return e||(e=new Set,kr.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(xr.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}xr.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=kr.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);kr.delete(this.peerId);for(let t=0,s=e.length;t{let e=i.a.getDialogOnly(this.selectedId);e&&i.a.editPeerFolders([e.peerId],+!e.folder_id)},this.onPinClick=()=>{i.a.toggleDialogPin(this.selectedId,this.filterId).catch(e=>{"PINNED_DIALOGS_TOO_MUCH"===e.type&&(this.filterId>=1?ct({langPackKey:"PinFolderLimitReached"}):new gt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new Xi(vn).open()}}],descriptionLangKey:"PinToTopLimitReached2",descriptionLangArgs:[Object(x.i18n)("Chats",[a.default.config.pinned_dialogs_count_max])]}).show())})},this.onUnmuteClick=()=>{i.a.mutePeer(this.selectedId,!1)},this.onMuteClick=()=>{i.a.mutePeer(this.selectedId,!0)},this.onUnreadClick=()=>{const e=i.a.getDialogOnly(this.selectedId);e&&(e.unread_count?(i.a.readHistory(this.selectedId,e.top_message),i.a.markDialogUnread(this.selectedId,!0)):i.a.markDialogUnread(this.selectedId))},this.onDeleteClick=()=>{new At(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(ft.a)(e.target,"LI")}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),this.filterId=qr.filterId,this.selectedId=t.dataset.peerId.toPeerId(),this.dialog=i.a.getDialogOnly(this.selectedId),this.buttons.forEach(e=>{const t=e.verify();e.element.classList.toggle("hide",!t)}),this.buttons[this.buttons.length-1].element.lastChild.replaceWith(Object(x.i18n)(o.a.getDeleteButtonText(this.selectedId))),t.classList.add("menu-open"),Object(te.e)(e,this.element),Object(te.d)(this.element,()=>{t.classList.remove("menu-open"),this.selectedId=this.dialog=this.filterId=void 0})}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>!i.a.isDialogUnread(this.dialog)},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>i.a.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>{var e;return!(this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>{var e;return this.filterId>1?i.a.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>this.selectedId!==a.default.myId&&!Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.default.myId&&Dt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.selectedId!==a.default.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.selectedId!==a.default.myId},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!0}],this.element=Ce(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var Fr,_r=s(147);class Dr{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{hn.a.get("dc").then(e=>{e||(e=dn.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.default.connectionStatus["NET-"+e],s=t&&t.status===_r.a.Connected;this.connecting&&s&&ti.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===_r.a.TimedOut,this.connecting=!s,this.retryAt=t&&t.retryAt,de.b&&this.log("connecting",this.connecting),this.setState()})},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,Object(k.a)(this.statusEl,Object(x.i18n)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{const e=Dr.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ht.a.forceReconnect());this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,s=()=>{const s=Date.now();e.innerText=""+Math.round((t-s)/1e3),s>t&&clearInterval(i)},i=setInterval(s,1e3);s();const n=this.getA("ConnectionStatus.Reconnect",()=>ht.a.forceReconnectTimeout());this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");de.b&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame(()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout);this.setStateTimeout=window.setTimeout(()=>{Object(Jt.a)(this.statusContainer,"is-shown",this.connecting||this.updating,200),this.setStateTimeout=0,de.b&&this.log("setState: isShown:",this.connecting||this.updating)},e)})},this.log=Object(X.b)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=Object(U.a)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new ye.a({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),e.prepend(this.statusContainer),a.default.addEventListener("connection_status_change",e=>{console.log(e),this.setConnectionStatus()}),a.default.addEventListener("state_synchronizing",e=>{e||(this.updating=!0,de.b&&this.log("updating",this.updating),this.setState())}),a.default.addEventListener("state_synchronized",e=>{de.b&&this.log("state_synchronized",e),e||(this.updating=!1,de.b&&this.log("updating",this.updating),this.setState())}),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,Dr.CHANGE_STATE_DELAY+1e3)}getA(e,t){const s=document.createElement("a");return s.classList.add("force-reconnect"),s.append(Object(x.i18n)(e)),s.addEventListener("click",e=>{Object(c.a)(e),t()}),s}}function jr(e,t,s,i,n,a,o,r){if("number"==typeof a)a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]||e[t]}e.beginPath(),e.moveTo(t+a.tl,s),e.lineTo(t+i-a.tr,s),e.quadraticCurveTo(t+i,s,t+i,s+a.tr),e.lineTo(t+i,s+n-a.br),e.quadraticCurveTo(t+i,s+n,t+i-a.br,s+n),e.lineTo(t+a.bl,s+n),e.quadraticCurveTo(t,s+n,t,s+n-a.bl),e.lineTo(t,s+a.tl),e.quadraticCurveTo(t,s,t+a.tl,s),e.closePath(),o&&e.fill(),r&&e.stroke()}Dr.CHANGE_STATE_DELAY=1e3,function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(Fr||(Fr={}));const Br=window.devicePixelRatio,Rr=20*Br,Ur=2.5*Br,Hr=2*Br,Nr=1*Br;function zr(e=!1){const t=document.createElement("canvas");t.width=t.height=Rr;const s=t.getContext("2d"),i=(Rr-(3*Hr+2*Ur))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=Date.now(),r=(l=(o-n)%1e3,c=0,d=1e3,-1/2*(Math.cos(Math.PI*l/d)-1)+c);var l,c,d;s.clearRect(0,0,Rr,Rr),s.fillStyle=e&&!b.b.isMobile?Do.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=r>=.5?e%2?2-2*r:2*(r-.5):e%2?2*r:1-2*r;let n=4+8*t;n*=Br;jr(s,i+e*Hr+e*Ur,(Rr-n)/2,Hr,n,Nr,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(os.a)(o),o()},setActive:t=>{e=t,o()}}}var Vr=function(e,t,s,i){return new(s||(s=Promise))((function(n,a){function o(e){try{l(i.next(e))}catch(e){a(e)}}function r(e){try{l(i.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?n(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}l((i=i.apply(e,t||[])).next())}))};class Kr extends As{constructor(e,t,s){super({getIndex:e=>i.a.getDialogOnly(e.id)[this.indexKey],onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onSort:(e,t)=>{const s=e.dom.listEl.parentElement!==this.list;Os(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Wr.addListDialog({dialog:e.id,loadPromises:s,isBatch:t});return e.dom=i,(null==s?void 0:s.length)&&(e.loadPromises=s,Promise.all(s).finally(()=>{delete e.loadPromises})),e},updateElementWith:De.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Gr{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.scroll=null,this.log=Object(X.b)("DIALOGS",X.a.Log|X.a.Error|X.a.Warn|X.a.Debug),this.contextMenu=new Ar,this.sortedLists={},this.scrollables={},this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.offsets={top:0,bottom:0},this.initedListeners=!1,this.loadedDialogsAtLeastOnce=!1,this.onTabChange=()=>{this.scroll=this.scrollables[this.filterId],this.scroll.loadedAll.top=!0,this.scroll.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsPromise=void 0,this.sortedList=this.sortedLists[this.filterId],this.onChatsScroll()},this._onListLengthChange=()=>{if(!this.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId>0)return;const e=this.chatList,t=e.childElementCount,s=e.parentElement.parentElement,i=e.parentElement.nextElementSibling,n=!!i.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;s.classList.add("with-contacts");const a=new pn({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),P.a.getContactsPeerIds(void 0,void 0,"online").then(e=>{let t=!1;const s=()=>{t&&a.container.classList.toggle("hide",!i.list.childElementCount),this.updateContactsLength(!0)},i=new _s({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=Ct.a.height/60|0;e.splice(0,t).filter(this.verifyPeerIdForContacts).forEach(e=>{i.add(e)}),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>{if(e.isAnyChat())return;const t=this.verifyPeerIdForContacts(e),s=i.has(e);!s&&t?i.add(e):s&&!t&&i.delete(e)};const n=i.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,s()}),i.append(a.container)},this.verifyPeerIdForContacts=e=>e.isContact()&&!i.a.getDialogOnly(e),this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout(()=>{this.sliceTimeout=void 0,this.chatList.childElementCount&&!this.processContact&&Object(De.c)(()=>{const e=performance.now(),t=this.scroll.scrollTop,s=this.chatList.firstElementChild,i=this.scroll.container.getBoundingClientRect(),n=s.getBoundingClientRect(),a=Array.from(this.scroll.splitUp.children);let o=this.scroll.splitUp.offsetTop;o&&t{const t=e.dataset.peerId.toPeerId();this.deleteDialog(t)}),this.setOffsets(),this.scroll.scrollTop=c.offsetTop-h,this.log("slice time",performance.now()-e)})},200)},this.onChatsScrollTop=()=>this.onChatsScroll("top"),this.onChatsScroll=(e="bottom")=>this.scroll.loadedAll[e]?(this.loadContacts&&this.loadContacts(),Promise.resolve()):this.loadDialogsPromise?this.loadDialogsPromise:(this.log("onChatsScroll",e),this.loadDialogs(e)),this.chatsPreloader=Object(te.f)(null,!0),this.allUnreadCount=this.folders.menu.querySelector(".badge"),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=dt(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),ue.IS_TOUCH_SUPPORTED&&Bs({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e>0?t+1:t-1)}}),this.allChatsIntlElement=new x.default.IntlElement({key:"FilterAllChatsShort"}),this.setFilterId(0),this.addFilter({id:this.filterId,title:"",titleEl:this.allChatsIntlElement.element,orderIndex:0}),this.sortedList=this.sortedLists[this.filterId],this.scroll=this.scrollables[this.filterId],a.default.addEventListener("state_cleared",()=>{M.default.getState().then(e=>{this.loadedDialogsAtLeastOnce=!1,P.a.clear(),G.a.clear();const t=i.a.filtersStorage.filters;for(const e in t)a.default.dispatchEvent("updateDialogFilter",{_:"updateDialogFilter",id:+e});i.a.clear(),this.sortedList.clear(),this.onTabChange(),this.onStateLoaded(e)})});const t=new T.a(this.folders.menuScrollContainer);e.prepend(this.folders.menuScrollContainer);const s=Object(Z.a)(this.folders.menu,this.folders.container,(e,t)=>{e=+t.dataset.filterId||0,this.filterId!==e&&(this.sortedLists[e].clear(),this.setFilterId(e),this.onTabChange())},()=>{for(const e in this.sortedLists)+e!==this.filterId&&this.sortedLists[e].clear()},void 0,t);this.folders.menu.firstElementChild.click(),i.a.construct(),M.default.getState().then(e=>this.onStateLoaded(e)),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new Dr(this.chatsContainer),this.chatsContainer.append(e),setTimeout(()=>{le.a.loadLottieWorkers()},200)}get chatList(){return this.sortedList.list}setFilterId(e){this.filterId=e,this.indexKey=i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(this.filterId):"index",a.default.filterId=e}setOnlineStatus(e,t){const s=e.classList.contains("is-online");!s&&t&&e.classList.add("is-online"),Object(Jt.a)(e,"is-visible",t,250,t?void 0:()=>{e.classList.remove("is-online")},t&&!s?2:0)}initListeners(){a.default.addEventListener("user_update",e=>{var t;const s=e.toPeerId(),i=this.getDialogDom(s);if(i&&!P.a.isBot(e)&&s!==a.default.myId){const s="userStatusOnline"===(null===(t=P.a.getUser(e).status)||void 0===t?void 0:t._);this.setOnlineStatus(i.avatarEl,s)}}),a.default.addEventListener("chat_update",e=>{const t=e.toPeerId(!0),s=i.a.getDialogOnly(t);s&&this.processDialogForCallStatus(s)}),a.default.addEventListener("folder_unread",e=>{this.setFilterUnreadCount(e.id)}),a.default.addEventListener("contacts_update",e=>{this.processContact&&this.processContact(e.toPeerId())}),a.default.addEventListener("dialog_flush",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setLastMessage(t,void 0,void 0,void 0,void 0,void 0,!0),this.validateDialogForFilter(t),this.setFiltersUnreadCount())}),a.default.addEventListener("dialogs_multiupdate",e=>{for(const t in e){const s=e[t];this.updateDialog(s),this.processContact&&this.processContact(t.toPeerId()),this.validateDialogForFilter(s)}}),a.default.addEventListener("dialog_drop",({peerId:e})=>{this.deleteDialog(e),this.processContact&&this.processContact(e)}),a.default.addEventListener("dialog_unread",({peerId:e})=>{const t=i.a.getDialogOnly(e);t&&(this.setUnreadMessages(t),this.validateDialogForFilter(t))}),a.default.addEventListener("dialog_notify_settings",e=>{this.setUnreadMessages(e),this.setFiltersUnreadCount()}),a.default.addEventListener("dialog_draft",({dialog:e,drop:t,peerId:s})=>{t?this.sortedList.delete(s):this.updateDialog(e),this.processContact&&this.processContact(s)}),a.default.addEventListener("peer_changed",e=>{for(const t of this.lastActiveElements)t.dataset.peerId.toPeerId()!==e&&this.setDialogActive(t,!1);Array.from(document.querySelectorAll(`[data-autonomous="0"] li[data-peer-id="${e}"]`)).forEach(e=>{this.setDialogActive(e,!0)})}),a.default.addEventListener("filter_update",e=>{if(!this.filtersRendered[e.id])return void this.addFilter(e);if(e.id===this.filterId){const e=i.a.dialogsStorage.getCachedDialogs(!0);this.validateListForFilter();for(let t=0,s=e.length;t{const t=this.filtersRendered[e.id];t&&(this.folders.menu.firstElementChild.click(),t.container.remove(),t.menu.remove(),delete this.sortedLists[e.id],delete this.scrollables[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange())}),a.default.addEventListener("filter_order",e=>{const t=this.folders.menu;e.forEach(e=>{const s=i.a.filtersStorage.getFilter(e),n=this.filtersRendered[e];this.sortedLists[e].indexKey=i.a.dialogsStorage.getDialogIndexKey(e),Os(n.menu,t,s.orderIndex),Os(n.container,this.folders.container,s.orderIndex)}),this.indexKey=i.a.dialogsStorage.getDialogIndexKey(this.filterId)}),a.default.addEventListener("peer_typings",({peerId:e,typings:t})=>{const s=i.a.getDialogOnly(e);s&&(t.length?this.setTyping(s):this.unsetTyping(s))})}setDialogActive(e,t){const s=e.dialogDom;e.classList.toggle("active",t),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Vr(this,void 0,void 0,(function*(){Dt.a.getNotifyPeerTypeSettings(),this.initedListeners||(this.initListeners(),this.initedListeners=!0);const t=i.a.filtersStorage.getDialogFilters().then(e=>{for(const t of e)this.addFilter(t)});return e.filters&&Object.keys(e.filters).length&&(yield t,this.showFiltersPromise&&(yield this.showFiltersPromise)),M.default.storagesResults.dialogs.length&&Mi.a.addMissedDialogs(),this.onChatsScroll().then(()=>{i.a.fillConversations()})}))}getOffsetIndex(e){return{index:this.scroll.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){if(void 0!==e.migratedTo||!this.testDialogForFilter(e))return!1;const t=this.getOffsetIndex("top"),s=this.getOffsetIndex("bottom");if(!t.index&&!s.index)return!0;const i=e[this.indexKey];return(!t.index||i<=t.index)&&(!s.index||i>=s.index)}deleteDialog(e){this.sortedList.delete(e)}updateDialog(e){if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e.peerId);if(!this.sortedList.has(e.peerId))return void this.sortedList.add(e.peerId);const t=this.getDialogDom(e.peerId);t&&(this.setLastMessage(e,void 0,t,void 0,void 0,void 0,!0),this.sortedList.update(e.peerId))}setFilterUnreadCount(e){var t;const s=0===e?this.allUnreadCount:null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!s)return;const n=i.a.dialogsStorage.getFolder(e),a=0===e||!!n.dialogs.find(e=>(e.unread_count||e.pFlags.unread_mark)&&!Dt.a.isPeerLocalMuted(e.peerId,!0));s.classList.toggle("badge-gray",!a);const o=n.unreadDialogsCount;s.innerText=o?""+o:""}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e);this.setFilterUnreadCount(0)}validateListForFilter(){const e=i.a.filtersStorage.getFilter(this.filterId)||null;this.sortedList.getAll().forEach(t=>{const s=i.a.getDialogOnly(t.id);this.testDialogForFilter(s,e)||this.deleteDialog(t.id)})}validateDialogForFilter(e,t){this.getDialogDom(e.peerId)&&(this.testDialogForFilter(e,t)||this.deleteDialog(e.peerId))}testDialogForFilter(e,t=i.a.filtersStorage.getFilter(this.filterId)){return!(!e||t&&!i.a.filtersStorage.testDialogForFilter(e,t)||!t&&this.filterId!==e.folder_id)}generateScrollable(e,t){const s=new T.b(null,"CL",500);s.container.addEventListener("scroll",this.onChatsRegularScroll),s.container.dataset.filterId=""+t,s.onScrolledTop=this.onChatsScrollTop,s.onScrolledBottom=this.onChatsScroll,s.setVirtualContainer(e);const n=new Kr(e,i.a.dialogsStorage?i.a.dialogsStorage.getDialogIndexKey(t):"index",this.onListLengthChange);return this.scrollables[t]=s,this.sortedLists[t]=n,s}addFilter(e){if(this.filtersRendered[e.id])return;const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const s=document.createElement("span"),i=document.createElement("span");i.classList.add("text-super"),e.titleEl?i.append(e.titleEl):i.innerHTML=J.a.wrapEmojiText(e.title);const n=document.createElement("div");n.classList.add("badge","badge-20","badge-primary");const a=document.createElement("i");s.append(i,n,a),t.append(s),Object(se.ripple)(t);Os(t,this.folders.menu,e.orderIndex);const o=this.createChatList(),r=this.generateScrollable(o,e.id);r.container.classList.add("tabs-tab","chatlist-parts");const l=document.createElement("div");l.classList.add("chatlist-top");const c=document.createElement("div");c.classList.add("chatlist-bottom"),l.append(o),r.container.append(l,c);const d=r.container;Os(r.container,this.folders.container,e.orderIndex),this.setListClickListener(o,null,!0),this.filtersRendered[e.id]={menu:t,container:d,unread:n,title:i},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){return this.showFiltersPromise||(this.showFiltersPromise=new Promise(e=>{window.setTimeout(()=>{const t=Object.keys(this.filtersRendered).length>1,s=!this.folders.menuScrollContainer.classList.contains("hide");t!==s&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!s&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0,e()},0)})),this.showFiltersPromise}loadDialogs(e){if(this.loadDialogsPromise)return this.loadDialogsPromise;const t=new Promise(s=>Vr(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=Ct.a.height/72*1.25|0,l=0;const{index:c}=this.getOffsetIndex(e);if(c)if("top"===e){const e=i.a.dialogsStorage.getFolderDialogs(a,!0),t=e.findIndex(e=>e[o]<=c),s=Math.max(0,t-r);r=t-s,l=e[s][o]+1}else l=c;try{const s=i.a.getConversations("",l,r,a,!0);if(!s.cached&&!n.childElementCount){n.parentElement.append(this.chatsPreloader)}const c=yield s.promise;if(this.loadDialogsPromise!==t)return;if("bottom"===e?c.isEnd&&(this.scroll.loadedAll[e]=!0):c.isTopEnd&&(this.scroll.loadedAll[e]=!0),this.loadedDialogsAtLeastOnce=!0,c.dialogs.length){const t="top"===e?c.dialogs.slice().reverse():c.dialogs,s=[],n=[],a=e=>{n.push(e)};t.forEach(e=>{if(!i.a.getDialogOnly(e.peerId))return;const t=this.sortedList.add(e.peerId,!0,a,!1);t.loadPromises&&s.push(...t.loadPromises)}),yield Promise.all(s).finally(),n.forEach(e=>e())}else this.onListLengthChange();const d=c.dialogs["top"===e?0:c.dialogs.length-1];d&&(this.offsets[e]=d[o]),this.log.debug("getDialogs "+r+" dialogs by offset:",l,c,n.childElementCount),setTimeout(()=>{this.scroll.onScroll()},0)}catch(e){this.log.error(e)}this.chatsPreloader.parentElement&&this.chatsPreloader.remove(),s()}))).finally(()=>{this.loadDialogsPromise=void 0});return this.loadDialogsPromise=t}generateEmptyPlaceholder(e){const t="empty-placeholder",s=document.createElement("div");s.classList.add(t,t+"-"+e.classNameType);const i=document.createElement("div");i.classList.add(t+"-header"),Object(x._i18n)(i,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&Object(x._i18n)(n,e.subtitle,e.subtitleArgs),s.append(i,n),{container:s,header:i,subtitle:n}}checkIfPlaceholderNeeded(){if(1===this.filterId)return;const e=this.chatList,t=e.parentElement;let s=Array.from(t.children).find(e=>e.matches(".empty-placeholder"));const n=this.scroll.loadedAll.bottom&&!e.childElementCount;if(n&&s)return;if(!n)return void(s&&(t.classList.remove("with-placeholder"),s.remove()));let a,o;if(this.filterId){a=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:o="folder"}),s=a.container,s.prepend(function({emoji:e,width:t,height:s}){const i=document.createElement("div"),n=cs.a.getAnimatedEmojiSticker(e);return n?Cs({doc:n,div:i,loop:!1,play:!0,width:t,height:s,emoji:e}).then(()=>{}):i.classList.add("media-sticker-wrapper"),{container:i}}({emoji:"📂",width:128,height:128}).container);const e=Object(U.a)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});Object(l.b)(e,()=>{new $i(vn).open(i.a.filtersStorage.getFilter(this.filterId))}),s.append(e)}else{a=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:o="dialogs"}),s=a.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new x.default.IntlElement({element:a.subtitle}),Promise.all([this.updateContactsLength(!1),Object(rs.b)(e,"assets/img/EmptyChats.svg"),Object(De.d)()]).then(([e])=>{s.classList.add("visible"),t.classList.toggle("has-contacts",!!e)}),s.prepend(e)}t.append(s),t.classList.add("with-placeholder"),t.dataset.placeholderType=o}updateContactsLength(e){return this.updateContactsLengthPromise?this.updateContactsLengthPromise:this.updateContactsLengthPromise=P.a.getContacts().then(t=>{const s=this.emptyDialogsPlaceholderSubtitle;if(s){let e,i;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",i=[Object(x.i18n)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",i=[]),s.compareAndUpdate({key:e,args:i})}if(e){this.chatList.parentElement.classList.toggle("has-contacts",!!t.length)}return this.updateContactsLengthPromise=void 0,t.length})}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,s=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),s.innerHTML="",this.loadContacts=void 0,this.processContact=void 0}setOffsets(){const e=this.chatList,t=this.getDialogFromElement(e.firstElementChild),s=this.getDialogFromElement(e.lastElementChild),i=this.indexKey;this.offsets.top=t[i],this.offsets.bottom=s[i]}getDialogFromElement(e){return i.a.getDialogOnly(e.dataset.peerId.toPeerId())}setListClickListener(e,t,s=!1,n=!1,a=!1){let o;const r=(a?fr.setInnerPeer:fr.setPeer).bind(fr);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(ft.a)(s,"LI");if(i){if(n){const e=o===i;o&&!e&&o.classList.remove("active"),i&&(i.classList.add("active"),o=i,this.lastActiveElements.add(i))}if(i){t&&t();const e=i.dataset.peerId.toPeerId(),s=+i.dataset.mid||void 0;r({peerId:e,lastMsgId:s})}else r()}},{capture:!0}),de.b&&e.addEventListener("dblclick",e=>{const t=Object(ft.a)(e.target,"LI");if(t){const e=t.dataset.peerId.toPeerId();this.log("debug dialog:",i.a.getDialogByPeerId(e))}}),s&&Object(te.a)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessage(e,t,s,n,l,c=!1,d=!1){if(!s&&!(s=this.getDialogDom(e.peerId)))return;let h;if(t||(e.draft&&"draftMessage"===e.draft._&&(h=e.draft),t=i.a.getMessageByPeer(e.peerId,e.top_message)),"messageEmpty"===t._)return s.lastMessageSpan.innerHTML="",s.lastTimeSpan.innerHTML="",delete s.listEl.dataset.mid,void(d&&this.setUnreadMessages(e,s,c));const p=e.peerId;{let e;if(!t.deleted&&!h){const s=i.a.getMediaFromMessage(t);if(s&&("photo"===s._||["video","gif"].includes(s.type))){const i=r.a.choosePhotoSize(s,20,20);if("photoSizeEmpty"!==i._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),Ss({photo:s,message:t,container:e,withoutPreloader:!0,size:i,loadPromises:l}),"video"===s.type)){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}const c=!!e&&!!(null==t?void 0:t.message);let d;if(d=n&&t.message?i.a.wrapMessageForReply(t,void 0,void 0,!1,n,c):h?i.a.wrapMessageForReply(h):t.deleted?document.createDocumentFragment():i.a.wrapMessageForReply(t,void 0,void 0,!1,void 0,c),e&&d.prepend(e),Object(k.a)(s.lastMessageSpan,d),h){const e=document.createElement("b");e.classList.add("danger"),e.append(Object(x.i18n)("Draft"),": "),s.lastMessageSpan.prepend(e)}else if(p.isAnyChat()&&p!==t.fromId&&!t.action){const e=o.a.getPeer(t.fromId);if(e&&e.id){const i=document.createElement("b");e.id===a.default.myId?i.append(Object(x.i18n)("FromYou")):i.append(new Lt.a({peerId:t.fromId,onlyFirstName:!0}).element),i.append(": "),s.lastMessageSpan.prepend(i)}}}if(!t.deleted||h){const e=h?Math.max(h.date,t.date||0):t.date;Object(k.a)(s.lastTimeSpan,Object(oe.c)(new Date(1e3*e)))}else s.lastTimeSpan.textContent="";null!==d&&(d?this.setUnreadMessages(e,s,c):s.listEl.dataset.mid=t.mid)}setUnreadMessages(e,t=this.getDialogDom(e.peerId),s=!1){var n;if(!t)return;if(!s){const s=Dt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(Jt.a)(t.listEl,"is-muted",s,200)}let o;if("draftMessage"!==(null===(n=e.draft)||void 0===n?void 0:n._)){const t=i.a.getMessageByPeer(e.peerId,e.top_message);!t.deleted&&t.pFlags.out&&t.peerId!==a.default.myId&&(o=t)}!function(e,t,s){let i;if((null==t?void 0:t.pFlags.out)&&(i=t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!i)return void(e.textContent="");const n="tgico-"+i,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(t.statusSpan,o);const r=i.a.filtersStorage.getFilter(this.filterId);let l;l=r?-1!==r.pinnedPeerIds.indexOf(e.peerId):!!e.pFlags.pinned;const c=i.a.isDialogUnread(e),d=l||c,h=Object(ds.a)(t.unreadBadge);d&&!h&&t.subtitleEl.append(t.unreadBadge);const p=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),u=t.mentionsBadge&&Object(ds.a)(t.mentionsBadge);p&&(t.mentionsBadge||(t.mentionsBadge=document.createElement("div"),t.mentionsBadge.className="dialog-subtitle-badge badge badge-24 mention mention-badge",t.mentionsBadge.innerText="@",t.subtitleEl.insertBefore(t.mentionsBadge,t.lastMessageSpan.nextSibling)));const m=s?0:200;if(Object(Jt.a)(t.unreadBadge,"is-visible",d,m,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(Jt.a)(t.mentionsBadge,"is-visible",p,m,p?void 0:()=>{t.mentionsBadge.remove(),delete t.mentionsBadge},u?0:2),!d)return;l?t.unreadBadge.classList.add("tgico-chatspinned","tgico"):t.unreadBadge.classList.remove("tgico-chatspinned","tgico");let g=!0,b=!1;e.unread_mentions_count&&1===e.unread_count?(t.unreadBadge.innerText="@",b=!0):c?t.unreadBadge.innerText=""+(e.unread_count||" "):(t.unreadBadge.innerText="",g=!1),t.unreadBadge.classList.toggle("unread",g),t.unreadBadge.classList.toggle("mention",b)}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialog(e){if("object"!=typeof e){const t=i.a.getDialogOnly(e);if(!t){const t=e||Be.c;return{peerId:t,peer:o.a.getOutputPeer(t),pFlags:{}}}return t}return e}setCallStatus(e,t){let{callIcon:s,listEl:i}=e;if(!s&&t){const{canvas:t,startAnimation:n}=e.callIcon=s=zr(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(Jt.a)(e.callIcon.canvas,"is-visible",t,200,t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},t?2:0)}addListDialog(e){const t=this.getDialog(e.dialog);e.autonomous=!1;const s=this.addDialogNew(e);if(s){const{peerId:i}=t;Dt.a.isPeerLocalMuted(i,!0)&&s.dom.listEl.classList.add("is-muted"),i.isUser()||this.processDialogForCallStatus(t,s.dom),this.setLastMessage(t,void 0,s.dom,void 0,e.loadPromises,e.isBatch,!0)}return s}processDialogForCallStatus(e,t){if(!vo)return;if(t||(t=this.getDialogDom(e.peerId)),!t)return;const s=G.a.getChat(e.peerId.toChatId());this.setCallStatus(t,!(!s.pFlags.call_active||!s.pFlags.call_not_empty))}addDialogAndSetLastMessage(e){const{peerId:t,message:s,query:n}=e,a=Wr.addDialogNew(Object.assign(Object.assign(Object.assign({},e),i.a.getMessageSenderPeerIdOrName(s)),{dialog:this.getDialog(t)}));return this.setLastMessage(a.dialog,s,a.dom,n),s.peerId!==t&&(a.dom.listEl.dataset.peerId=""+s.peerId),a}addDialogNew(e){return this.addDialog(e.dialog,e.container,e.drawStatus,e.rippleEnabled,e.onlyFirstName,e.meAsSaved,e.append,e.avatarSize,e.autonomous,e.lazyLoadQueue,e.loadPromises,e.fromName)}addDialog(e,t,s=!0,i=!0,n=!1,r=!0,l=!0,c=54,d=!!t,h,p,u){var m,g,b;const v=this.getDialog(e),f=v.peerId,y=new Or;if(y.loadPromises=p,y.lazyLoadQueue=h,y.setAttribute("dialog",r?"1":"0"),void 0!==u&&y.setAttribute("peer-title",u),y.setAttribute("peer",""+f),y.classList.add("dialog-avatar","avatar-"+c),s&&f!==a.default.myId&&f.isUser()){"userStatusOnline"===(null===(m=P.a.getUser(f).status)||void 0===m?void 0:m._)&&this.setOnlineStatus(y,!0)}const w=document.createElement("div");w.classList.add("user-caption");const S=document.createElement("span");S.classList.add("user-title");const L=new Lt.a({peerId:f,fromName:u,dialog:r,onlyFirstName:n,plainText:!1});S.append(L.element),S.classList.add("tgico");const C=o.a.getPeer(f);(null===(g=null==C?void 0:C.pFlags)||void 0===g?void 0:g.verified)&&S.append(Ut());const E=document.createElement("span");E.classList.add("user-last-message"),E.setAttribute("dir","auto");const I=document.createElement("li");I.classList.add("chatlist-chat"),i&&Object(se.ripple)(I),I.append(y,w),I.dataset.peerId=""+f;const M=document.createElement("span");M.classList.add("message-status","sending-status");const T=document.createElement("span");T.classList.add("message-time");const k=document.createElement("div");k.className="dialog-subtitle-badge badge badge-24";const x=document.createElement("p");x.classList.add("dialog-title");const O=document.createElement("span");O.classList.add("dialog-title-details"),O.append(M,T),x.append(S,O);const A=document.createElement("p");A.classList.add("dialog-subtitle"),A.append(E),w.append(x,A);const F={avatarEl:y,captionDiv:w,titleSpan:L.element,titleSpanContainer:S,statusSpan:M,lastTimeSpan:T,unreadBadge:k,lastMessageSpan:E,containerEl:I,listEl:I,subtitleEl:A};if(t){t[l?"append":"prepend"](I)}return d||(I.dialogDom=F,(null===(b=fr.chat)||void 0===b?void 0:b.peerId)===f&&this.setDialogActive(I,!0)),{dom:F,dialog:v}}setTyping(e){const t=this.getDialogDom(e.peerId);if(!t)return;const s=t.lastMessageSpan.querySelector(".peer-typing-container"),i=fr.getPeerTyping(e.peerId,s);!s&&i&&(Object(k.a)(t.lastMessageSpan,i),t.lastMessageSpan.classList.add("user-typing"))}unsetTyping(e){const t=this.getDialogDom(e.peerId);t&&(t.lastMessageSpan.classList.remove("user-typing"),this.setLastMessage(e,null,t,void 0,void 0,void 0,null))}}const Wr=new Gr;de.a.appDialogsManager=Wr;var qr=t.default=Wr},175:function(e,t,s){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(i,n,function(t){return e[t]}.bind(null,n));return i},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";(function(t){var s=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return s&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],s=0;s{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,s)=>{var i=s=>{switch(s.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=s.data.samplePosition,e(s.data.page);break;case"done":this.encoder.removeEventListener("message",i),this.finish()}};this.encoder.addEventListener("message",i),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,s)=>{var i=s=>{"flushed"===s.data.message&&(t.removeEventListener("message",i),this.onpause(),e())};t.addEventListener("message",i),t.postMessage({command:"flush"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var s=i=>{"done"===i.data.message&&(e.removeEventListener("message",s),t())};e.addEventListener("message",s),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,s){return e.set(s,t),t+s.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,s(1))},function(e,t){var s;s=function(){return this}();try{s=s||new Function("return this")()}catch(e){"object"==typeof window&&(s=window)}e.exports=s}])},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return c}));var i=s(6),n=s(66),a=s(1),o=s(15),r=s(72);let l=0;function c(e,t=(()=>Promise.resolve()),s=null,c=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let h=document.createElement("div");h.classList.add("c-ripple");let p;e.classList.contains("rp-square")&&h.classList.add("is-square"),e[c?"prepend":"append"](h);const u=(e,i)=>{const o=Date.now(),r=document.createElement("div"),c=l++,d=1e3*+window.getComputedStyle(h).getPropertyValue("--ripple-duration").replace("s","");p=()=>{let e=Date.now()-o;const t=()=>{n.a.mutate(()=>{r.remove()}),s&&s(c)};if(er.classList.add("hiding"),Math.max(s-d/2,0)),setTimeout(t,s)}else r.classList.add("hiding"),setTimeout(t,d/2);a.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",p),p=null,g=!1},t&&t(c),window.requestAnimationFrame(()=>{const t=h.getBoundingClientRect();r.classList.add("c-ripple__circle");const s=e-t.left,n=i-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-a/2,l=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=l+"px",h.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==h)&&(d===e||!Object(r.a)(t.target,d));let g=!1;if(a.IS_TOUCH_SUPPORTED){let e=()=>{p&&p()};d.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;let{clientX:s,clientY:i}=t.touches[0];u(s,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(g)return void(g=!1);let{clientX:t,clientY:s}=e;u(t,s),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})},{passive:!0})}},30:function(e,t,s){"use strict";s.d(t,"a",(function(){return a})),s.d(t,"b",(function(){return o})),s.d(t,"c",(function(){return r})),s.d(t,"d",(function(){return l}));var i=s(1),n=s(57);const a=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function o(e,t,s={}){const i=s.listenerSetter?s.listenerSetter.add(e):e.addEventListener.bind(e);s.touchMouseDown=!0,i(a,t,s)}function r(e,t,s){e.removeEventListener(a,t,s)}function l(e){Object(n.a)(e,a)}},34:function(e,t,s){"use strict";var i=s(16),n=s(18);t.a=(e,t={})=>{const s=document.createElement(t.asDiv?"div":"button");return s.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&s.classList.add("rp-square"),Object(n.ripple)(s)),t.onlyMobile&&s.classList.add("only-handhelds"),t.disabled&&s.setAttribute("disabled","true"),t.text&&s.append(Object(i.i18n)(t.text)),s}},35:function(e,t,s){"use strict";s.d(t,"f",(function(){return h})),s.d(t,"g",(function(){return p})),s.d(t,"c",(function(){return g})),s.d(t,"d",(function(){return y})),s.d(t,"e",(function(){return w})),s.d(t,"b",(function(){return C})),s.d(t,"a",(function(){return E}));var i=s(29),n=s(5),a=s(30),o=s(38),r=s(1),l=s(0),c=s(15),d=s(49);function h(e,t=!1){const s='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=s,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",s),e.lastElementChild}function p(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,h(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=h;let u=e=>{let t=b.getBoundingClientRect(),{clientX:s,clientY:i}=e,n=s>=t.right?s-t.right:t.left-s,a=i>=t.bottom?i-t.bottom:t.top-i;(n>=100||a>=100)&&g()};const m=e=>{g()},g=()=>{b&&(b.classList.remove("active"),b.parentElement.classList.remove("menu-open"),f&&f.remove(),b=null,c.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",u),window.removeEventListener("contextmenu",m)),document.removeEventListener(a.a,m),l.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{b&&g()});let b=null,v=null,f=null;function y(e,t){g(),l.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{g()}}),b=e,b.classList.add("active"),b.parentElement.classList.add("menu-open"),f||(f=document.createElement("div"),f.classList.add("btn-menu-overlay"),f.addEventListener(a.a,e=>{Object(n.a)(e),m()})),b.parentElement.insertBefore(f,b),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",u),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(a.a,m),c.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},s,i){let{scrollWidth:n,scrollHeight:a}=s;const r=document.body.getBoundingClientRect(),l=r.width,c=r.height;i=o.b.isMobile?"right":"left";let d="top";const h={x:{left:e,right:e-n},intermediateX:"right"===i?8:l-n-8,y:{top:t,bottom:t-a},intermediateY:t=8},u={top:h.y.top+a+8<=c,bottom:h.y.bottom-8>=8};{let e;e=p[i]?h.x[i]:(i="center",h.intermediateX),s.style.left=e+"px"}{let e;e=u[d]?h.y[d]:(d="center",h.intermediateY),s.style.top=e+"px"}s.className=s.className.replace(/(top|center|bottom)-(left|center|right)/g,""),s.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let S=!1,L=0;function C(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,S=!1},400),S=!0}function E(e,t,s){const i=s?s.add(e):e.addEventListener.bind(e),a=s?s.removeManual.bind(s,e):e.removeEventListener.bind(e);if(l.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let s;const o={capture:!0},r=()=>{clearTimeout(s),a("touchmove",r,o),a("touchend",r,o),a("touchcancel",r,o)};i("touchstart",a=>{a.touches.length>1?r():(i("touchmove",r,o),i("touchend",r,o),i("touchcancel",r,o),s=window.setTimeout(()=>{S?r():(t(a.touches[0]),r(),b&&e.addEventListener("touchend",n.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?s=>{t(s),b&&e.addEventListener("touchend",n.a,{once:!0})}:t)}},46:function(e,t,s){"use strict";s.d(t,"b",(function(){return c})),s.d(t,"a",(function(){return d}));var i=s(1),n=s(37),a=s(83),o=s(77),r=s(5);class l{constructor(e,t="",s=document.createElement("div")){this.el=e,this.container=s,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(n.b)("SCROLL"+(t?"-"+t:""),n.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(o.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(a.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class c extends l{constructor(e,t="",s=300,i){super(e,t),this.onScrollOffset=s,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,s=this.lastScrollTop;this.onScrolledTop&&s<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-s<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends l{constructor(e,t="",s=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=s,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,s){"use strict";var i=s(29),n=s(0),a=s(37),o=s(8),r=s(5),l=s(39),c=s(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(a.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const s=this.navigations.pop();s?(this.manual=!e,this.handleItem(s)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(c.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(o.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const s=this.navigations[t];if(s.type===e)return{item:s,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(l.e)(this.navigations,e)}removeByType(e,t=!1){for(let s=this.navigations.length-1;s>=0;--s){if(this.navigations[s].type===e&&(this.navigations.splice(s,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(17),n=s(31),a=s(18),o=s(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const s=this.input=document.createElement("input");let r;if(s.classList.add("checkbox-field-input"),s.type="checkbox",e.name&&(s.id="input-"+e.name),e.checked&&(s.checked=!0),e.stateKey&&i.default.getState().then(t=>{const a=Object(n.d)(t,e.stateKey);let o;o=e.stateValues?1===e.stateValues.indexOf(a):a,this.setValueSilently(o),s.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[s.checked?1:0]:s.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(o._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(s),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const s=document.createElementNS("http://www.w3.org/2000/svg","svg");s.classList.add("checkbox-box-check"),s.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),s.append(i);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,s),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(a.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,s){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}s.d(t,"a",(function(){return i}))},57:function(e,t,s){"use strict";function i(e,t){const s=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(s)}s.d(t,"a",(function(){return i}))},60:function(e,t,s){"use strict";function i(e,t){return e.closest(t)}s.d(t,"a",(function(){return i}))},66:function(e,t,s){"use strict";var i=s(44),n=s(45),a=s(29),o=s(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(n.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};a.a&&(a.a.sequentialDom=r),t.a=r},79:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(1);function n(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var s=document.createRange();s.selectNodeContents(e),s.collapse(!1);var n=window.getSelection();n.removeAllRanges(),n.addRange(s)}else if(void 0!==document.body.createTextRange){var a=document.body.createTextRange();a.moveToElementText(e),a.collapse(!1),a.select()}}},82:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(0);function n(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},86:function(e,t,s){"use strict";var i=s(29),n=s(33);const a=new class{getState(){return n.a.invokeApi("account.getPassword").then(e=>e)}updateSettings(e={}){return this.getState().then(t=>{let s,i;const a={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};s=e.currentPassword?n.a.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const o=t.new_algo,r=new Uint8Array(o.salt1.length+32);return r.randomize(),r.set(o.salt1,0),o.salt1=r,i=e.newPassword?n.a.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([s,i]).then(e=>(a.password=e[0],a.new_settings.new_algo=o,a.new_settings.new_password_hash=e[1],n.a.invokeApi("account.updatePasswordSettings",a)))})}check(e,t,s={}){return n.a.invokeCrypto("computeSRP",e,t,!1).then(e=>n.a.invokeApi("auth.checkPassword",{password:e},s).then(e=>("auth.authorization"===e._&&n.a.setUser(e.user),e)))}confirmPasswordEmail(e){return n.a.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return n.a.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return n.a.invokeApi("account.cancelPasswordEmail")}};i.a.passwordManager=a,t.a=a}}]); +//# sourceMappingURL=14.e0b3ee5569e2564c790f.chunk.js.map \ No newline at end of file diff --git a/public/14.e0b3ee5569e2564c790f.chunk.js.map b/public/14.e0b3ee5569e2564c790f.chunk.js.map new file mode 100644 index 000000000..606e7306c --- /dev/null +++ b/public/14.e0b3ee5569e2564c790f.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/passwordInputField.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/components/monkeys/tracking.ts","webpack:///./src/components/codeInputField.ts","webpack:///./src/environment/mediaMimeTypesSupport.ts","webpack:///./src/helpers/dom/setInnerHTML.ts","webpack:///./src/helpers/filterChatPhotosMessages.ts","webpack:///./src/helpers/listLoader.ts","webpack:///./src/helpers/searchListLoader.ts","webpack:///./src/components/appSearch.ts","webpack:///./src/components/inputSearch.ts","webpack:///./src/components/buttonIcon.ts","webpack:///./src/components/sliderTab.ts","webpack:///./src/components/slider.ts","webpack:///./src/components/avatarEdit.ts","webpack:///./src/components/buttonCorner.ts","webpack:///./src/components/sidebarLeft/tabs/newGroup.ts","webpack:///./src/components/appMediaPlaybackController.ts","webpack:///./src/helpers/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/components/audio.ts","webpack:///./src/components/divAndCaption.ts","webpack:///./src/components/chat/replyContainer.ts","webpack:///./src/components/groupedLayout.ts","webpack:///./src/components/editPeer.ts","webpack:///./src/components/radioForm.ts","webpack:///./src/components/row.ts","webpack:///./src/helpers/clipboard.ts","webpack:///./src/components/radioField.ts","webpack:///./src/components/toast.ts","webpack:///./src/helpers/schedulers/debounce.ts","webpack:///./src/components/usernameInputField.ts","webpack:///./src/components/popups/peer.ts","webpack:///./src/components/sidebarRight/tabs/chatType.ts","webpack:///./src/helpers/scrollableLoader.ts","webpack:///./src/components/appSelectPeers.ts","webpack:///./src/components/popups/pickUser.ts","webpack:///./src/components/sidebarRight/tabs/userPermissions.ts","webpack:///./src/components/sidebarRight/tabs/groupPermissions.ts","webpack:///./src/components/popups/deleteDialog.ts","webpack:///./src/components/sidebarRight/tabs/editChat.ts","webpack:///./src/components/sidebarRight/tabs/editContact.ts","webpack:///./src/components/sidebarLeft/tabs/addMembers.ts","webpack:///./src/environment/parallaxSupport.ts","webpack:///./src/components/generateVerifiedIcon.ts","webpack:///./src/components/swipeHandler.ts","webpack:///./src/components/peerProfileAvatars.ts","webpack:///./src/components/peerProfile.ts","webpack:///./src/components/sidebarRight/tabs/sharedMedia.ts","webpack:///./src/components/sidebarRight/index.ts","webpack:///./src/components/sidebarRight/tabs/pollResults.ts","webpack:///./src/components/poll.ts","webpack:///./src/components/wrappers.ts","webpack:///./src/helpers/dom/positionElementByIndex.ts","webpack:///./src/helpers/sortedList.ts","webpack:///./src/components/sortedUserList.ts","webpack:///./src/helpers/dom/handleHorizontalSwipe.ts","webpack:///./src/helpers/dom/handleTabSwipe.ts","webpack:///./src/components/popups/forward.ts","webpack:///./src/components/popups/deleteMessages.ts","webpack:///./src/components/popups/sendNow.ts","webpack:///./src/helpers/dom/cancelSelection.ts","webpack:///./src/components/chat/selection.ts","webpack:///./src/helpers/dom/getSelectedText.ts","webpack:///./src/components/appSearchSuper..ts","webpack:///./src/helpers/dom/lockTouchScroll.ts","webpack:///./src/lib/appManagers/appPrivacyManager.ts","webpack:///./src/components/privacySection.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack:///./src/helpers/dom/canFocus.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/email.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack:///./src/components/sidebarLeft/tabs/2fa/index.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack:///./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack:///./src/components/sidebarLeft/tabs/activeSessions.ts","webpack:///./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack:///./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack:///./src/helpers/color.ts","webpack:///./src/helpers/highlightningColor.ts","webpack:///./src/components/colorPicker.ts","webpack:///./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack:///./src/components/sidebarLeft/tabs/background.ts","webpack:///./src/helpers/averageColor.ts","webpack:///./src/components/popups/stickers.ts","webpack:///./src/helpers/eachMinute.ts","webpack:///./src/helpers/eachTimeout.ts","webpack:///./src/environment/geolocationSupport.ts","webpack:///./src/components/sidebarLeft/tabs/generalSettings.ts","webpack:///./src/components/sidebarLeft/tabs/editProfile.ts","webpack:///./src/components/sidebarLeft/tabs/includedChats.ts","webpack:///./src/components/sidebarLeft/tabs/editFolder.ts","webpack:///./src/components/sidebarLeft/tabs/chatFolders.ts","webpack:///./src/components/sidebarLeft/tabs/notifications.ts","webpack:///./src/components/sidebarLeft/tabs/language.ts","webpack:///./src/components/sidebarLeft/tabs/settings.ts","webpack:///./src/components/sidebarLeft/tabs/newChannel.ts","webpack:///./src/components/popups/createContact.ts","webpack:///./src/components/sidebarLeft/tabs/contacts.ts","webpack:///./src/components/sidebarLeft/tabs/archivedTab.ts","webpack:///./src/components/confirmationPopup.ts","webpack:///./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack:///./src/components/sidebarLeft/index.ts","webpack:///./src/components/chat/bubbleGroups.ts","webpack:///./src/components/popups/datePicker.ts","webpack:///./src/components/stickyIntersector.ts","webpack:///./src/components/chat/replies.ts","webpack:///./src/components/chat/messageRender.ts","webpack:///./src/helpers/dom/getElementByPoint.ts","webpack:///./src/helpers/dom/reflowScrollableElement.ts","webpack:///./src/lib/appManagers/appEmojiManager.ts","webpack:///./src/components/emoticonsDropdown/tabs/emoji.ts","webpack:///./src/components/gifsMasonry.ts","webpack:///./src/components/emoticonsDropdown/tabs/gifs.ts","webpack:///./src/components/emoticonsDropdown/tabs/stickers.ts","webpack:///./src/lib/appManagers/appInlineBotsManager.ts","webpack:///./src/components/sidebarRight/tabs/gifs.ts","webpack:///./src/components/sidebarRight/tabs/stickers.ts","webpack:///./src/helpers/dropdownHover.ts","webpack:///./src/components/emoticonsDropdown/index.ts","webpack:///./src/environment/webrtcSupport.ts","webpack:///./src/environment/callSupport.ts","webpack:///./src/lib/appManagers/internalLink.ts","webpack:///./src/helpers/dom/getVisibleRect.ts","webpack:///./src/components/popups/joinChatInvite.ts","webpack:///./src/components/chat/bubbles.ts","webpack:///./src/lib/mtproto/constants.ts","webpack:///./src/components/popups/unpinMessage.ts","webpack:///./src/helpers/dom/isSelectionEmpty.ts","webpack:///./src/components/popups/reportMessagesConfirm.ts","webpack:///./src/components/popups/reportMessages.ts","webpack:///./src/components/popups/sponsored.ts","webpack:///./src/components/chat/contextMenu.ts","webpack:///./src/components/chat/sendContextMenu.ts","webpack:///./src/components/popups/createPoll.ts","webpack:///./src/helpers/getGifDuration.ts","webpack:///./src/components/popups/newMedia.ts","webpack:///./src/helpers/dom/attachListNavigation.ts","webpack:///./src/components/chat/autocompleteHelper.ts","webpack:///./src/components/chat/stickersHelper.ts","webpack:///./src/components/popups/schedule.ts","webpack:///./src/helpers/dom/getRichValueWithCaret.ts","webpack:///./src/components/chat/emojiHelper.ts","webpack:///./src/components/chat/autocompletePeerHelper.ts","webpack:///./src/components/chat/commandsHelper.ts","webpack:///./src/components/chat/autocompleteHelperController.ts","webpack:///./src/components/chat/mentionsHelper.ts","webpack:///./src/components/chat/replyKeyboard.ts","webpack:///./src/components/chat/inlineHelper.ts","webpack:///./src/components/chat/input.ts","webpack:///./src/helpers/dom/setCaretAt.ts","webpack:///./src/components/chat/pinnedContainer.ts","webpack:///./src/components/chat/audio.ts","webpack:///./src/components/chat/pinnedMessageBorder.ts","webpack:///./src/components/chat/pinnedMessage.ts","webpack:///./src/helpers/dom/handleScrollSideEvent.ts","webpack:///./src/environment/groupCallSupport.ts","webpack:///./src/components/chat/topbar.ts","webpack:///./src/components/sidebarRight/tabs/search.ts","webpack:///./src/components/chat/search.ts","webpack:///./src/components/chat/chat.ts","webpack:///./src/components/chat/markupTooltip.ts","webpack:///./src/helpers/dom/getSelectedNodes.ts","webpack:///./src/helpers/generatePathData.ts","webpack:///./src/components/chat/dragAndDrop.ts","webpack:///./src/helpers/dom/disableTransition.ts","webpack:///./src/components/lineBlobDrawable.ts","webpack:///./src/components/topbarWeave.ts","webpack:///./src/helpers/dom/customProperties.ts","webpack:///./src/lib/rlottie/rlottieIcon.ts","webpack:///./src/components/superIcon.ts","webpack:///./src/components/groupCall/microphoneIcon.ts","webpack:///./src/components/groupCall/participantMutedIcon.ts","webpack:///./src/components/groupCall/index.ts","webpack:///./src/components/groupCall/participantStatus.ts","webpack:///./src/components/groupCall/participantsList.ts","webpack:///./src/components/groupCall/participantVideo.ts","webpack:///./src/components/call/videoCanvasBlur.ts","webpack:///./src/components/groupCall/participantVideos.ts","webpack:///./src/components/groupCall/participants.ts","webpack:///./src/components/groupCall/description.ts","webpack:///./src/components/groupCall/title.ts","webpack:///./src/environment/screenSharingSupport.ts","webpack:///./src/components/call/button.ts","webpack:///./src/components/movableElement.ts","webpack:///./src/helpers/movablePanel.ts","webpack:///./src/lib/calls/callState.ts","webpack:///./src/components/call/description.ts","webpack:///./src/components/groupCall/microphoneIconMini.ts","webpack:///./src/components/topbarCall.ts","webpack:///./src/lib/appManagers/appImManager.ts","webpack:///./src/components/appMediaViewerBase.ts","webpack:///./src/helpers/fillPropertyValue.ts","webpack:///./src/components/appMediaViewer.ts","webpack:///./src/helpers/avatarListLoader.ts","webpack:///./src/components/appMediaViewerAvatar.ts","webpack:///./src/components/avatar.ts","webpack:///./src/components/dialogsContextMenu.ts","webpack:///./src/components/sendingStatus.ts","webpack:///./src/components/connectionStatus.ts","webpack:///./src/helpers/roundRect.ts","webpack:///./src/components/groupCallActiveIcon.ts","webpack:///./src/helpers/easing/easeInOutSine.ts","webpack:///./src/lib/appManagers/appDialogsManager.ts","webpack:///./public/recorder.min.js","webpack:///./src/components/ripple.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/lib/mtproto/passwordManager.ts"],"names":["PasswordInputField","options","super","plainText","passwordVisible","onVisibilityClick","e","this","toggleVisible","classList","toggle","input","type","onVisibilityClickAdditional","setAttribute","name","autocomplete","stealthy","document","createElement","add","tabIndex","parentElement","prepend","insertBefore","cloneNode","nextSibling","container","append","addEventListener","TelInputField","label","pasted","lastValue","telEl","HTMLInputElement","inputMode","pixelRatio","window","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","remove","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","replace","code","dataset","onInput","key","test","metaKey","ctrlKey","shiftKey","preventDefault","PasswordMonkey","passwordInputField","size","needFrame","loadPromise","loadAnimationAsAsset","loop","autoplay","width","height","noCache","then","_animation","animation","currentFrame","direction","setSpeed","pause","setDirection","curFrame","play","waitForFirstFrame","TrackingMonkey","inputField","max","playAnimation","frame","min","round","idleAnimation","stop","canvas","display","Promise","all","CodeInputField","lastLength","slice","onFill","concat","Set","setInnerHTML","elem","html","innerHTML","filterChatPhotosMessages","history","message","idx","arr","action","photo","splice","undefined","count","previous","next","reverse","loadCount","loadWhenLeft","loadedAllUp","loadedAllDown","loadedAll","current","loadPromiseUp","loadPromiseDown","dispatchJump","items","item","pop","push","shift","unshift","load","onJump","older","resolve","anchor","promise","loadMore","result","forEach","processed","processItem","onLoadedMore","backLimit","maxId","mid","incrementMessageId","getSearch","searchContext","peerId","limit","inputFilter","_","next_rate","nextRate","filterMids","onHistoryDelete","msgs","shouldBeDeleted","has","filter","onEmptied","onHistoryMultiappend","obj","folderId","mids","sorted","Array","from","sort","a","b","targets","map","Boolean","onMessageSent","rootScope","storage","isScheduled","getScheduledMessagesStorage","getMessagesStorage","filterMessagesByInputFilter","context","useSearch","reset","removeEventListener","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","setListClickListener","childElementCount","setActive","clear","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","threadId","scrollable","i","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","setTimeout","focus","res","searchGroup","fromId","addDialogAndSetLastMessage","drawStatus","avatarSize","meAsSaved","err","console","error","replaceContent","catch","placeholder","prevValue","timeout","clearTimeout","onClearClick","onClear","searchIcon","clearBtn","icon","slider","destroyable","_constructor","header","closeBtn","noRipple","title","content","addTab","listenerSetter","closeTab","args","init","selectTab","tabs","delete","removeAll","eventListener","dispatchEvent","cleanup","onCloseAfterTimeout","historyTabIds","canHideFirst","onCloseBtnClick","appNavigationController","findItemByType","navigationType","back","id","animate","isNavigation","closingId","onCloseTab","tab","_selectTab","Map","tabsContainer","sidebarEl","querySelector","querySelectorAll","el","get","onOpen","onOpenAfterTimeout","pushItem","onPop","canAnimate","tabConstructor","preserveTab","removeTabFromHistory","find","t","getTab","removeByType","onClose","open","getContext","clearRect","uploadAvatar","isGeoChat","setTitle","avatarEdit","_upload","section","inputWrapper","groupNameInputField","maxLength","groupLocationInputField","canBeEdited","valueCheck","contains","userLocationCoords","userLocationAddress","nextBtn","createChannel","about","geo_point","address","megagroup","chatId","inputFile","editPhoto","peerIds","inviteToChannel","disabled","createChat","toUserId","chatsSection","nameArgs","new","format","startLocating","userId","dom","addDialogNew","dialog","rippleEnabled","lastMessageSpan","getUserStatusString","navigator","geolocation","getCurrentPosition","location","lat","coords","latitude","long","longitude","uri","fetch","response","json","display_name","GeolocationPositionError","SHOULD_USE_SAFARI_FIX","userAgent","match","appMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","_volume","_muted","_playbackRate","seekBackward","details","playingMedia","currentTime","seekOffset","seekForward","duration","seekTo","seekTime","onMediaDocumentLoad","doc","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","appDownloadManager","getCacheContext","src","url","set","onPlay","target","getMessageByMedia","verify","element","listLoader","jumpLength","findIndex","go","setTargets","setMedia","getMediaFromMessage","onPause","onEnded","isTrusted","paused","clean","s","playItem","getMedia","resolveWaitingForLoadMedia","lockedSwitchers","cssText","body","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","volume","muted","playbackRate","autoload","pFlags","is_scheduled","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","loadAvatar","cached","getPeerTitle","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","willBePlayedMedia","prev","addMedia","setSearchContext","wasPlaying","willBePlayed","toggleSwitchers","enabled","attachGrabListeners","onStart","onMove","onEnd","onMouseMove","event","x","pageX","y","pageY","onMouseUp","onMouseDown","button","onTouchMove","touches","clientX","clientY","isTouch","onTouchEnd","onTouchStart","passive","mousedown","events","withTransition","useTransform","vertical","scrub","rect","getBoundingClientRect","seek","setFilled","onScrub","filled","step","setProgress","stepStr","index","indexOf","decimals","_removeListeners","percents","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","hideControls","showControlsTimeout","isShown","controlsLocked","canHideControls","showControls","setHideTimeout","toggleControls","show","relatedTarget","showOnLeaveToClassName","findUpClassName","visible","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","d","volumeSvg","btn","firstElementChild","video","wrapper","setup","parentNode","appendChild","skin","stylePlayer","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","String","toHHMMSS","volumeSelector","leftControls","togglePlay","overlaysActive","good","toggleFullScreen","altKey","onFullScreen","rate","settingsButton","player","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","wrapVoiceMessage","audioEl","out","barHeightMax","mediaSizes","isMobile","minW","maxW","availW","svg","createElementNS","setAttributeNS","timeDiv","waveform","Uint8Array","valueCount","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","rects","children","audio","lastIndex","ceil","node","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","imgs","wrapped","wrapPhoto","boxWidth","boxHeight","loadPromises","withoutPreloader","lazyLoadQueue","images","thumb","full","img","attach","noAutoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","reject","playListener","download","setDownloadFunction","capture","isConnected","customElements","define","DivAndCaption","fill","border","subtitle","wrapReplyDivAndCaption","subtitleEl","mediaEl","wrapEmojiText","isRound","mediaChildren","middleware","textContent","wrapMessageForReply","webpage","chat","bubbles","getMiddleware","wrapSticker","div","group","CHAT_ANIMATION_GROUP","choosePhotoSize","noBlur","child","isMediaSet","RectPart","maxWidth","minWidth","spacing","maxHeight","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","sides","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","ratio","cropRatios","attempts","multiHeight","offset","sum","pushAttempt","lineCounts","heights","first","second","third","fourth","optimalAttempt","optimalDiff","attempt","counts","lineCount","totalHeight","minLineHeight","bad1","bad2","line","diff","optimalCounts","optimalHeights","rowCount","row","colCount","lineHeight","col","_disabled","isChanged","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","toggleAttribute","withoutAvatar","avatarElem","doNotEditAvatar","unlockOnSuccess","RadioForm","radios","form","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","select","execCommand","removeChild","fallbackCopyTextToClipboard","stateKey","appStateManager","getState","state","setByKey","main","langKey","Event","toastEl","toast","toastNew","langPackKey","debounce","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","_resolve","_reject","checkUsernameDebounced","checkUsername","getValue","originalValue","setState","Neutral","isUsernameValid","setError","invalidText","head","username","checkUsernamePromise","invokeApi","channel","getChannelInput","toChatId","available","Valid","availableText","takenText","isValidToChange","overlayClosable","avatarEl","noTitle","titleLangArgs","fragment","createDocumentFragment","descriptionLangKey","description","p","descriptionLangArgs","checkboxes","o","withRipple","callback","original","nextElementSibling","isBroadcast","random","privateRow","publicRow","privateSection","publicSection","getChat","linkRow","chatFull","exported_invite","link","btnRevoke","toggleDisability","getChatInviteLink","caption","noDelimiter","changed","linkInputField","applyBtn","migrateChat","channelId","updateUsername","close","setOriginalValue","toggleNoForwards","onChatUpdate","noforwards","loading","loaded","getPromise","checkForTriggers","chatsContainer","selected","offsetIndex","loadedWhat","renderedPeerIds","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","includes","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","splitUp","notRendered","filterPeerTypeBy","isPeerId","getPeer","deleted","method","innerContainer","topContainer","selectedContainer","selectedScrollable","li","click","sectionNameLangPackKey","noShadow","findUpAttribute","checkbox","debouncedInput","generateDelimiter","appendTo","getResultsPromise","onFirstRender","testSelfSearch","dialogs","archived","pageCount","windowSize","tempId","getTempId","getConversations","newOffsetIndex","findAndSplice","chatRightsAction","filterByRights","renderSaved","isEnd","getMoreDialogs","contacts","getMoreContacts","isUser","canSendToUser","hasRights","isGlobalSearch","getContactsPeerIds","searchContacts","searchResult","resultPeerIds","my_results","results","channelParticipants","getChannelParticipants","q","participants","participant","getParticipantPeerId","promises","getMoreChannelParticipants","isNonContactUser","containerEl","isAnyChat","getChatMembersString","scroll","insertAdjacentElement","scrollIntoViewNew","offsetWidth","onAnimationEnd","settings","animationsEnabled","values","forceDirection","Static","closable","getSelected","onSelect","hide","peerTypes","destroyListener","rights","takeOut","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","btnDelete","kickFromChannel","v","flags","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","combineParticipantBannedRights","info","mainFlag","restriction","until_date","flag","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","generateContentElement","findUpTag","setSubtitle","bannedRights","cantWhat","getPeerId","peer","listEl","update","needAdd","new_participant","view_messages","user_id","prev_participant","exceptionsCount","setLength","loader","setLoader","isChannel","migrateFrom","migrateTo","onScroll","getDialogType","peerTitleElement","callbackLeave","flush","leave","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","textArgs","getChatFull","chatUpdateListeners","addChatUpdateListener","chatNameInputField","descriptionInputField","editPeer","chatTypeRow","setChatTypeSubtitle","permissionsRow","setPermissionsLength","reduce","acc","editTitle","editAbout","race","removeAttribute","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","_init","isNew","isContact","nameInputField","lastNameInputField","user","getUser","setDraftValue","first_name","last_name","notificationsCheckboxField","mutePeer","isMuted","notify_settings","profileNameDiv","profileSubtitleDiv","phoneRow","phone","formatUserPhone","notificationsRow","isPeerLocalMuted","addContact","deleteContacts","sel","skippable","attachToPromise","removeLoader","ret","isPrivacy","selectedPeerIds","addInitial","generateVerifiedIcon","use","use2","getEvent","attachGlobalListenerTo","RESET_GLOBAL","cursor","listenerOptions","hadMove","xDown","yDown","handleMove","setCursorTo","onReset","handleStart","_e","verifyTouchTarget","xUp","yUp","xDiff","yDiff","onFirstSwipe","onSwipeResult","onSwipe","loadCallbacks","photoId","avatar","BASE_CLASS","getPhoto","Image","draggable","loadCallback","putAvatar","avatars","intersectionObserver","observe","gradient","arrowPrevious","arrowNext","checkScrollTop","scrollTop","freeze","clickX","prevTargets","nextTargets","openAvatarViewer","toRight","right","distance","offsetLeft","cancelNextClick","lastDiffX","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","IntersectionObserver","entries","entry","isIntersecting","loadNearestToTarget","getUserPhotos","photos","Number","MAX_SAFE_INTEGER","m","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","unobserve","setText","setPeerStatus","needClear","bio","tagName","getProfileByPeerId","notifications","setMoreDetails","self","setPeerStatusInterval","setInterval","setMoreDetailsTimeout","oldAvatars","setPeer","cleaned","cleanupHTML","setAvatar","getPeerUsername","verified","override","getProfile","userFull","rAbout","wrapRichText","canSetNext","historiesStorage","newCloseBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","editBtn","transitionLastItem","secondTitle","profile","onAdditionalScroll","searchSuper","nav","isSharedMedia","transition","cleanScrollPositions","isHeavyAnimationInProgress","toggleEditBtn","msgIdsByPeer","renderNewMessages","deleteDeletedMessages","mediaTabs","onChangeTab","mediaTab","btnAddMembers","showConfirmation","onError","addChatUser","filtered","filterMessagesByType","usedFromHistory","performSearchResult","selection","isSelecting","toggleByElement","canViewMembers","loadMutex","peerChanged","setQuery","historyStorage","fillProfileElements","single","justLoad","getElementById","isColumnProportionSet","to","medium","mobile","toggleSidebar","setColumnProportion","sharedMediaTab","proportion","scrollWidth","previousElementSibling","documentElement","enable","active","willChange","animationPromise","appSidebarRight","resultsDiv","poll","getPoll","quiz","rQuestion","voters","total_voters","roundPercents","hr","answer","answers","answerEl","answerTitle","answerPercents","minHeight","getVotes","option","votesList","votes","vote","showMore","lastElementChild","next_offset","down","lineTotalLength","minIndex","minRemainder","k","remainder","maxRemainder","pollElement","isClosed","closed","performResults","chosenIndexes","prevQuizHint","hideQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","setMaxLength","resizePolls","onHide","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","getTotalLength","pollId","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","strokeWidth","radius","circumference","PI","period","closeTime","serverTimeOffset","quizInterval","time","Date","now","timeLeft","color","stroke","strokeDashoffset","strokeDasharray","clearInterval","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","isTabExists","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","solution","solution_entities","toggleHint","textEl","entities","bubblesContainer","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","initQuizHint","timeEl","setResults","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","cb","getPercentValue","iterate","fullTime","times","votersCount","multiplier","roundVideoCircumference","wrapVideo","withTail","isOut","noInfo","onlyPreview","noPlayButton","isAlbumItem","canAutoplay","autoPlay","gifs","videos","spanTime","spanPlay","needPlayButton","mime_type","photoRes","divRound","halfSize","ctx","globalVideo","setPeerPromise","isInDOM","onPaused","onFrame","drawImage","detached","foreignObject","getAttributeNS","gotThumb","getThumb","poster","aspecter","isUpload","downloaded","attachMethod","renderDeferred","detach","isFulfilled","animationIntersector","addAnimation","loadPhotoThumbFunc","loadFunc","setManual","queueId","renderImageFromUrl","render","wrapDocument","audioElement","extSplitted","split","ext","isArray","toLowerCase","docDiv","icoDiv","descriptionParts","nameDiv","_downloadDiv","save","saveDocFile","downloading","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","canAttachPreloader","renderPromise","sequentialDom","mutateElement","mutate","onlyThumb","emoji","withThumb","needUpscale","stickerType","sticker","loadLottieWorkers","toneIndex","haveThumbCached","stickerCachedThumbs","afterRender","getPathFromPhotoPathSize","stickerThumbConverted","getPreviewURLFromThumb","webpWorkerController","convert","getThumbURL","loadAnimationWorker","animationData","saveLottiePreview","data","sendInteractionThrottled","preloadAnimatedEmojiStickerAnimation","getAnimation","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","animationDiv","assumeType","frameNo","maxFrame","vibrate","generateRandomSigned","bubble","randomOffsetX","randomOffsetY","stableOffsetX","setPosition","emojiAnimationContainer","throttle","firstTime","setTyping","msg_id","getServerMessageId","emoticon","interaction","JSON","stringify","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","animated","lottieLoader","blob","URL","createObjectURL","getStickerSet","stickerSet","documents","wrapReply","replyContainer","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","groupId","attachmentDiv","getMidsByAlbum","getMessage","album","positionElementByIndex","pos","prevPos","whichChild","updateElementWith","updateListWith","onSort","canUpdate","_updateList","batch","updateBatch","base","onElementCreate","noScheduler","onDelete","getIndex","onUpdate","getUserStatusForSort","onListLengthChange","status","willChangeLength","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","peerIdMids","overrideOnSelect","setInnerPeer","initMessagesForward","onConfirm","revoke","deleteScheduledMessages","deleteMessages","titleArgs","isMegagroup","canRevoke","sendScheduledMessages","cancelSelection","getSelection","empty","removeAllRanges","accumulateMapSet","selectedMids","doNotAnimate","onCancelSelection","toggleSelection","listenElement","selectedText","toString","createRange","verifyTouchLongPress","getElementFromTarget","getElementsBetween","last","firstRect","lastRect","isHigher","parent","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","targetLookupClassName","verifyTarget","seen","selecting","firstTarget","processElement","checkBetween","seenSet","isSelected","isMidSelected","seenLength","findUpAsChild","elementsBetween","toggleByMid","canceledSelection","verifyMouseMoveTarget","removeManual","documentListenerOptions","hasCheckbox","getCheckboxInputFromElement","isElementShouldBeSelected","appendCheckbox","forceSelection","cantForward","cantDelete","cantSend","appMessagesManager","getMessageFromStorage","canForward","canDeleteMessage","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","forwards","onToggleSelection","updateContainer","toggleElementCheckbox","unselect","config","forwarded_count_max","toggleMid","updateElementSelection","contentTab","selectionCountEl","selectionGotoBtn","selectionForwardBtn","selectionDeleteBtn","navScrollableContainer","selectionContainer","btnCancel","attachClickOptions","keys","fromPeerId","isPrivate","transitionElement","opacity","recording","canSelectBubble","isGroupedBubbleSelected","getMidsByMid","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","isGrouped","groupedCheckboxInput","attachTo","onGotoClick","onForwardClick","onSelectClick","onClearSelectionClick","onDeleteClick","onContextMenu","cancelBubble","withSelection","prevTabId","urlsToRevoke","nextRates","loadedChats","firstLoad","log","logger","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","onTransitionStart","onTransitionEnd","searchContextMenu","navScrollable","tabsMenu","menuTab","span","unlockScroll","prevId","lockers","lockTouchScroll","searchGroupMedia","horizontalMenu","tabContent","skipScroll","newMediaTab","fromMediaTab","offsetTop","scrollHeight","rect2","onMediaClick","targetClassName","copySearchContext","openMedia","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","lock","unlockAndRefresh","setLastMessage","elemsToAppend","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","hash","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","sharedMediaDiv","processCallback","processEmptyFilter","processPhotoVideoFilter","processDocumentFilter","processUrlFilter","monthContainer","getMonthContainerByTimestamp","afterPerforming","inputMessagesFilterEmpty","showMembersCount","participants_count","regExp","RegExp","cleanSearchText","titleSpan","formatPhoneNumber","arg","globalContacts","intlElement","IntlElement","isShort","minDate","renderRecentSearch","recent","recentSearch","getTopPeers","peers","people","onlyFirstName","renderParticipants","membersList","LOAD_COUNT","loadMembers","loadChats","logStr","used","slicedLength","ids","filters","counters","getSearchCounters","firstMediaTab","counter","membersTab","toLoad","loadType","timestamp","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","IntlDateElement","haveTimestamps","goFirst","revokeObjectURL","newInputFilter","maxDate","PrivacyType","appPrivacyManager","privacy","addMultipleEventsListeners","updatePrivacy","rules","inputKey","privacyRules","saveApiUsers","users","saveApiChats","chats","apiUpdatesManager","processLocalUpdate","inputRule","rule","assign","privacyKey","types","allowPeers","disallowPeers","onRadioChange","captions","captionElement","radioSection","exceptions","Everybody","Nobody","radioRows","Contacts","skipTypes","noExceptions","generateSection","exceptionTexts","exception","_peerIds","newPeerIds","generateStr","splitPeersByType","getPrivacy","getPrivacyRulesDetails","setRadio","chatKey","usersKey","splitted","getUserInput","setPrivacy","phoneSection","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","canFocus","isFirstInput","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","disable","cancelPasswordEmail","resendPasswordEmail","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","hint","currentPassword","plainPassword","newPassword","symbols","isCancel","onSkipClick","saveHint","monkey","verifyInput","has_password","labelText","getStateInterval","_state","check","auth","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","Session","app_name","app_version","ip","date_active","date_created","midtitle","device_model","system_version","platform","authorizations","session","btnTerminate","otherSection","privacyTab","updateActiveSessions","onTerminateClick","menuElement","btnAdd","toggleBlock","bot","blocked","getBlocked","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRow","email_unconfirmed_pattern","activeSessionsRow","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","updatePrivacyRow","disallowLength","allowLength","sensitive_can_change","sensitive_enabled","sensitiveRow","_enabled","deleteButton","clearAllDrafts","auths","rgbaToHsla","g","l","hslaToRgba","hue2rgb","hexaToRgba","hexa","parseInt","rgbaToHexa","rgba","hslaStringToHexa","hsla","alpha","val","endsWith","hslaStringToRgba","highlightningColor","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","box","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","hexaToHsla","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","rgbaArray","hex","hsl","getCurrentColor","maxX","maxY","posX","posY","lightnessX","lightnessY","_applyColor","updateColorPicker","colorPicker","background","theme","pushToState","applyCurrentTheme","onColorChange","applyColor","getTheme","gridSection","grid","backgroundColor","uploadTempId","clicked","onUploadClick","file","access_hash","dc_id","file_reference","saveDoc","wallpaper","slug","upload","addNotifyListener","_wallpaper","newDoc","newCacheContext","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","themes","blurCheckboxField","blur","onGridClick","saveToCache","cacheStorage","_tempId","onReady","imageUrl","naturalWidth","naturalHeight","pixel","pixels","getImageData","pixelsLength","outPixel","Uint8ClampedArray","averageColor","uploadButton","colorButton","resetButton","invokeApiHashable","accountWallpapers","wallpapers","gridContainer","pattern","stickerSetInput","onStickersClick","fileId","sendMessageWithDocument","h6","setOnlyOnePlayableGroup","stickersDiv","stickersFooter","loadStickerSet","installed_date","toggleStickerSet","esgSticker","eachMinute","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","initialValue","minValue","valueDiv","range","messagesTextSize","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","str","toLocaleTimeString","hour","minute","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","gifsCheckboxField","videosCheckboxField","suggestCheckboxField","bigCheckboxField","loopCheckboxField","stickerSets","renderStickerSet","getAllStickers","allStickers","sets","firstNameInputField","bioInputField","usernameInputField","setProfileUrl","profileUrlContainer","profileUrlAnchor","updateProfile","uploadProfilePhoto","getSelf","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","cmp","pinnedPeerIds","pinned_peers","other","otherLegacy","getInputPeerById","editFolderTab","setFilter","filtersStorage","getDialogFilters","dialogsStorage","getFolderDialogs","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","non_contacts","groups","broadcasts","bots","selectedPeers","includePeerIds","excludePeerIds","addedInitial","_add","hasOwnProperty","originalFilter","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","categories","includedFlagsContainer","excludedFlagsContainer","include","include_peers","createDialogFilter","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","loadAnimationPromise","wrapDraftText","ul","renderMore","_length","onEditOpen","exclude_peers","onCreateOpen","filtersRendered","dialogFilter","folder","channels","isAnyGroup","filterId","getFilter","orderIndex","createFolderBtn","foldersSection","suggestedSection","onFiltersContainerUpdate","renderFolder","getSuggestedFilters","order","suggestedFilters","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","invokeApiCacheable","lang_pack","languages","language","lang_code","native_name","getLangPack","getCacheLangPack","langPack","logOut","phoneDiv","buttonsDiv","edit","folders","general","fillElements","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","withConfirm","btnConfirm","importContact","telInputField","lockWithPromise","validate","country_code","inputSearch","openContacts","sortedUserList","createList","renderPage","sortedLists","chatList","generateScrollable","scrollables","wasFilterId","setFilterId","onTabChange","confirmationPopup","isLocationWatched","errorCategory","retryBtn","locatedPeers","dialogSize","parseDistance","peopleSection","sortedList","btnMakeVisible","makeButton","btnMakeInvisible","btnCreateGroup","startWatching","stopWatching","distanceUnit","latestLocationSaved","accuracy","getLocated","updates","orderedPeers","groupsCounter","usersCounter","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","lat1","long1","lat2","long2","asin","sqrt","cos","fakeGradientDelimiter","delimiter","appSidebarLeft","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","filteredButtons","openUsername","userName","sessionStorage","kz_version","isMainDomain","toolsBtn","btnMenuFooter","rel","stopPropagation","suffix","versionFull","newBtnMenu","updateBtn","reload","initSearch","archivedCount","unreadDialogsCount","requestPeer","checkUpdateInterval","ok","hasUpdate","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","getAttribute","peopleContainer","hideNewBtnMenuTimeout","onFocus","clearRecentSearchBtn","releaseSinglePeer","detailsMap","newGroupDiff","updateGroup","viaBotId","fwdFromId","removeBubble","insertObject","foundBubble","foundAtIndex","foundMidOnSameTimestamp","_timestamp","_mid","bubbleGroup","insertIndex","initDate","onPick","noButtons","selectedDate","onPrevClick","selectedMonth","setMonth","getMonth","minMonth","prevBtn","onNextClick","maxMonth","onDateClick","selectedEl","setTimeTitle","setFullYear","getDate","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","number","setMinutes","getMinutes","getHours","popupCenterer","timeOptions","sendDate","dateOptions","day","weekday","firstDate","weekStartDate","getDay","renderElement","dayIndex","clonedDate","showOverflowMonths","lines","StickyIntersector","handler","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","root","elementsObserver","sentinel","headerSentinel","addSentinel","disconnect","updated","postKey","replies","leftPart","recent_repliers","getHistoryStorage","channel_id","isUnread","read_max_id","max_id","readMaxId","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","setTime","bubbleContainer","messageDiv","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","fwd_from","postViewsSpan","channelViews","edit_date","edit_hide","pinned","timeSpan","inner","clonedArgs","renderReplies","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","reply_to_mid","replyToPeerId","reply_to","reply_to_peer_id","appPeersManager","originalPeerTitle","originalMessage","wrapSingleMessage","needUpdate","replyMid","getElementByPoint","verticalSide","horizontalSide","floor","elementFromPoint","reflowScrollableElement","EMOJI_LANG_PACK","keywords","version","langCode","langPackCode","keywordLangPacks","indexedLangPacks","getKeywordsPromises","storageKey","stateStorage","pack","from_version","keywordsDifference","packKeywords","keyword","emoticons","getEmojiKeywords","lastRequestedLangCode","getRecentEmojis","indexObject","emojis","indexEmojis","search","POPULAR_EMOJI","getRecentEmojisPromise","recentEmoji","fixEmoji","appEmojiManager","loadedURLs","appendEmoji","unify","spanEmoji","kek","wrapSingleEmoji","getEmojiFromElement","nodeType","nodeValue","closeScrollTop","onContentClick","onEmojiSelected","divs","Emoji","category","titleDiv","itemsDiv","unified","menu","emojiScroll","hasRecent","activeId","menuOnClick","stickyIntersector","setMenuActive","recentItemsDiv","observeStickyHeaderChanges","scrollPromise","processInvisibleDiv","intersector","isVisible","getAnimations","checkAnimation","processVisibleDiv","gifWidth","gifHeight","willUseWidth","calcImageInBox","gifsContainer","masonry","EMOTICONSSTICKERGROUP","addLazyLoadQueueRepeat","regularLazyLoadQueue","animatedDivs","checkAnimationContainer","renderSticker","observeAnimatedDiv","recentStickers","queueCategoryPush","categoryDiv","categoryTitle","superStickerRenderer","recentDiv","stickers","categoryPush","menuWrapper","menuScroll","getRecentStickers","pushRecentSticker","inlineResults","setHash","geo","accuracy_radius","botId","getGeoInput","stopTime","noErrorBox","botResults","queryId","query_id","savePhoto","generateQId","resultId","topPeers","botPeerId","topPeer","rating","setKeyValueToStorage","startParam","startBot","bot_inline_placeholder","peerData","setDraft","callbackAnswer","noLinks","noLinebreaks","queryAndResultIds","inlineResult","pushPopularBot","queryID","resultID","send_message","reply_markup","replyMarkup","sendText","inputMedia","sendMessage","getMediaInput","geoPoint","provider","venue_id","venue_type","phone_number","vcard","percent","sendOther","appInlineBotsManager","nextOffset","onGifsClick","gifsDiv","checkAnimations","newSearch","gifBotPeerId","resolveUsername","getInlineResults","setsDiv","countDiv","stickerDiv","renderFeatured","getFeaturedStickers","coveredSets","filterRendered","renderSet","covered","searchStickerSets","forceClose","inited","onMouseOut","displayTimeout","isActive","toElement","willBeActive","dispatchResultableEvent","onmouseout","onmouseover","tabId","onSelectTabClick","searchButton","deleteBtn","checkRights","tabsEl","tabsElements","canSendStickers","canSendToPeer","canSendGifs","chatInput","savedRange","getGoodRange","lockIntersectionGroup","unlockIntersectionGroup","unlock","refresh","emojiTab","stickersTab","gifsTab","0","1","2","messageInput","HIDE_EMOJI_TAB","INIT_TAB_ID","getVisible","clearVisible","rangeCount","activeElement","getRangeAt","jumpedTo","stuck","which","scrollLeft","clearDraft","emoticonsDropdown","INTERNAL_LINK_TYPE","getVisibleRect","overflowElement","lookForSticky","overflowRect","overflowTop","overflowBottom","sticky","overflow","horizontal","visualViewport","windowHeight","innerWidth","innerHeight","chatInvite","request_needed","processUpdateMessage","putPhoto","peopleCount","IGNORE_ACTIONS","SERVICE_AS_REGULAR","TEST_SCROLL","appStickersManager","appUsersManager","appPhotosManager","appProfileManager","appDraftsManager","appMessagesIdsManager","appChatsManager","unreadOut","skippedMids","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","loadedTopTimes","loadedBottomTimes","messagesQueuePromise","messagesQueue","messagesQueueOnRender","messagesQueueOnRenderAdditional","firstUnreadBubble","replyFollowHistory","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","onBubblesClick","chatInner","onDatePick","contactDiv","appImManager","callDiv","callUser","spoiler","showDuration","useRafs","spoilerTimeout","bubbleMid","reply_to_top_id","lastMsgId","saved_from_msg_id","openThread","filterMessages","getDiscussionMessage","via","peerIdStr","savedFrom","messageId","documentDiv","SINGLE_MEDIA_CLASSNAME","isSingleMedia","isMediaCompatibleForDocumentViewer","parents","hasAspecter","albumItem","getMidsByMessage","isReplyClick","replyToMid","reply_to_msg_id","distanceToEnd","getDistanceToEnd","lastScrollDirection","topbar","pinnedMessage","setCorrectIndex","setStickyDateManually","requestHistory","setMessageId","setScroll","bubbleGroups","changeBubbleMid","setBubblePosition","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","repliesElement","grouped_id","newPoll","safeRenderMessage","scrollToBubbleIfLast","getGroupedBubble","updatePosition","deleteEmptyDateGroups","deletedMids","renderedId","renderMaxId","groupedMessagesStorage","MAX","replyAfter","shouldReply","canSend","_target","initMessageReply","highlightBubble","renderNewMessagesByIds","msgIds","setUnreadCount","updateUnreadByDialog","finishPeerChange","isScrolledDown","setMessagesQueuePromise","performHistoryResult","postViewsElements","different","postViews","unreadedObserver","onUnreadedInViewport","viewsObserver","sendViewCountersDebounced","sponsoredMessage","random_id","apiManager","invokeApiSingle","incrementMessageViews","wasHeight","offsetHeight","resizing","skip","scrolled","part","rAF","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","timestamps","lastVisible","dateMessage","visibleRect","previousStickyDate","needReflow","readUnreaded","readPromise","idle","focusPromise","bubblesMaxId","readContents","isMentionUnread","readHistory","bad","getHistoryTopPromise","getHistoryBottomPromise","getHistory","setLoaded","onScrolledTop","loadMoreHistory","readOutboxMaxId","msgId","permanent","emptyPlaceholderMid","deleteSelectedMids","replyTo","getLastBubble","setPaddingTo","isPaddingNeeded","clientHeight","paddingTop","scrollToBubbleEnd","lastDateGroup","getLastDateGroup","forceDuration","fallbackToElementStartWhenCentering","isChangingHeight","margin","axis","getNormalSize","scrollToBubble","lastElem","lastTime","firstTimestamp","datasetKey","today","bubbleContent","serviceMsg","bubblesToo","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","samePeer","chatType","topMessage","pinnedMessages","isTarget","savedPosition","getChatSavedPosition","getReadMaxIdIfUnread","isJump","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","getBubbleByPoint","oldChatInner","lockGroup","lastScrollTop","unlockGroup","fromUp","followingUnread","mountedByLastMsgId","findNextMountedBubbleByMsgId","afterSetPromise","needFetchInterval","isFetchIntervalNeeded","getNewHistory","isBottomEnd","Bottom","onScrolledAllDown","getDialogOnly","unread_mark","markDialogUnread","canWrite","queue","setUnreadDelimiter","local","getDateContainerByMessage","addBubble","additionalCallback","multipleRender","albumMustBeRenderedFull","our","contentWrapper","wasClassNames","classNames","transitionDelay","originalMid","unread","chat_id","wrapMessageActionTextNew","renderMessagesQueue","is_single","messageMessage","messageMedia","getAlbumText","richText","canHaveTail","isStandaloneMedia","needToSetHTML","emojiEntities","strLength","curr","big","forward","containerDiv","rowDiv","buttonEl","same_peer","checkSwitchReturn","switchInlineQuery","column","callbackButtonClick","messageWithReplies","getMessageWithReplies","withReplies","fwdFrom","nameContainer","processingWebPage","noAutoDownloadMedia","previewResizer","preview","quote","mediaSize","quoteTextDiv","site_name","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","texts","wrapPoll","needName","titleVia","isForwardFromChannel","from_id","isHidden","from_name","getPeerColorById","goto","generateTail","renderMessage","isBackLimit","previousScrollHeightMinusTop","needReflowScroll","processLocalMessageRender","firstSlice","lastSlice","Top","newScrollTop","getScheduledMessages","additionMsgIds","isAdditionRender","animateAsLadder","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","delay","lastMsDelay","topRes","middleRes","bottomRes","delays","listElements","getGreetingSticker","channel_post","generateMessageId","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","renderEmptyPlaceholder","addOffset","service","generateLocalMessageId","peer_id","getOutputPeer","saveMessages","side","checkPlaceholders","cacheSeconds","sponsoredMessages","generateLocalFirstMessage","bot_info","checkIfEmptyPlaceholderNeeded","getRenderedLength","realLoadCount","Both","resultPromise","isFirstMessageRender","processResult","historyResult","serviceStartMessageId","threadsServiceMessagesIdsStorage","sup","processPromise","waitPromise","safeCount","mustBeCount","unpin","canUnpin","canPinMessage","oneSide","silent","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","reportMessages","STICKER_EMOJI","preloadStickerPromise","preloadAnimatedEmojiSticker","buttonsEl","marginTop","appPollsManager","appDocsManager","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","isTargetAGroupedItem","isSelectable","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","groupedItem","noForwards","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","hasTarget","isGoodType","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","onSubmitClick","send","radioLabel","isEmpty","isInputEmpty","questions","appendMoreField","correctAnswers","optionInputFields","labelOptions","weakMap","questionInputField","sendSilent","setPeerId","dd","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","onEscape","getFilledAnswers","getRichValue","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","replyToMsgId","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","placeCaretAtEnd","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendAlbum","startsWith","source","objectURL","videoWidth","videoHeight","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onload","isPhoto","isAudio","finish","onerror","mimeType","foundPhotos","foundVideos","foundFiles","n","firstType","appendGroupCheckboxField","appendMediaCheckboxField","albumContainer","appendMediaToContainer","onRender","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","scrollTo","hadTarget","fastSmoothScroll","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","property","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","hidden","onVisible","listType","navigationItem","noBlurOnPop","removeItem","attachNavigation","controller","addHelper","fromController","hideOtherHelpers","onChangeScreen","getStickersByEmoticon","ready","getMinDate","getMaxDate","canSendWhenOnline","btnSendWhenOnline","getRichValueWithCaret","field","withEntities","selNode","selOffset","startOffset","startContainer","endContainer","endOffset","possibleChildrenFocusOffset","childNodes","alt","getRichElementValue","caretPos","substr","combineSameEntities","firstChar","getBothEmojiKeywords","searchEmojis","listElement","BASE","BASE_CLASS_LIST_ELEMENT","getReadyToSend","botInfos","ignoreCase","commands","botInfo","botCommand","command","found","helpers","toggleListNavigation","preserveHelper","insertAtCaret","topMsgId","trimmed","getMentions","onBodyTouchStart","btnHover","attachButtonListener","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","sendInlineResult","_checkQuery","gifsMasonry","isGallery","gallery","noCommands","separator","dcId","dataURL","switch_pm","btnSwitchToPM","switchToPM","checkQuery","appWebPagesManager","serverTimeManager","appNotificationsManager","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","setKeepAlive","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","richValue","markdownEntities","parseMarkdown","mergeEntities","parseEntities","urlEntities","getWebPagePromise","webPage","saveWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","getEmojiEntityFromEmoji","onBtnSendClick","forwarding","releaseMediaPlayback","setSingleMedia","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","recordTimeEl","needReturn","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","tail","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","onGoDownClick","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","attachMenuButtons","fileInput","accept","attachMenu","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","onFakeInput","draft","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","touchMouseDown","onstop","ondataavailable","typedArray","dataBlob","Blob","decode","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","pinnedControlBtn","originalChat","pinnedMessageContainer","neededFakeContainer","getNeededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","borderRadius","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","br","isStartButtonNeeded","unread_count","hasMentions","unread_mentions_count","no_webpage","syncDraft","helperToo","clearInput","fromUpdate","getDraft","rMessage","setInputValue","inputFake","updateMessageInput","isAnonymousSending","compareAndUpdate","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","isSendShortcutPressed","setStart","collapse","addRange","readAllHistory","commandsMap","bold","italic","underline","strikethrough","monospace","saveExecuted","executed","haveThisType","isCollapsed","tag","commonAncestorContainer","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","newValue","hadEntities","insertLength","addEntities","caretEntity","insertCaretAtIndex","caret","originalNode","previousSibling","newNode","createTextNode","setStartAfter","insertNode","setCaretAt","_value","foundHelper","suggest","checkEmoticon","checkInlineAutocomplete","needPlaceholder","inlineMatch","btnPreloader","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","hideCaptionCheckboxField","replyFragment","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","usingFullAlbum","albumMids","newReply","intl","peerTitleEl","_message","callerFunc","replyParent","oldReply","haveReply","floating","divAndCaption","CLASSNAME_BASE","btnClose","wrapperUtils","attachOnCloseEvent","needClose","isFloating","setFloating","setUtilsWidth","prevEl","nextEl","attachClick","toggleEl","volumeProgressLineContainer","tunnel","progressWrapper","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","defs","mark","AnimatedSuper","animateFirst","currentIndex","clearRow","DURATION","reflow","clearRows","previousIndex","fromTop","ignorePrevious","setNewRow","previousRow","AnimatedCounter","previousNumber","animatedSuper","decimal","previousDecimalNumber","getRow","EMPTY_INDEX","previousByDecimal","decimalNumber","getDecimal","hideLeft","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","locked","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","debug","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","lastY","isDown","deltaY","handleScrollSideEvent","refreshPosition","setScrollDownListener","handleFollowingPinnedMessage","isLast","setCount","writeTo","writeMediaTo","appGroupCallsManager","verifyButtons","isMenuOpen","btnMore","menuButtons","getDeleteButtonText","buttonsToVerify","verifyVideoChatButton","currentGroupCall","groupCall","getChatTyped","call_active","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","onResize","resize","setUtilsRAF","chatUtils","chatAudio","btnBack","chatInfoContainer","chatInfo","person","avatarElement","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","followPinnedMessage","getSearchContext","activeScreen","onBtnBackClick","isFirstChat","getChannelFull","channelFull","linked_chat_id","getCachedFullChat","onCallClick","chatContextMenuHintWasShown","contactPeerId","attachClickEvent","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","destroy","wasPeerId","newPinnedMessage","appSearch","beginSearch","btnPickDate","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","backgroundEl","Log","Warn","Debug","_item","backgroundImage","contextMenu","constructUtils","constructPeerHelpers","constructPinnedHelpers","constructDiscussionHelpers","constructScheduledHelpers","searchTab","setAutoDownloadMedia","setLoadMutex","loadSidebarMedia","autoDownload","setPrefix","wasAlreadyUsed","addedListener","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","hideTimeout","nodes","getSelectedNodes","currentMarkups","closest","activeButtons","getActiveMarkupButton","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","containerRect","isFirstShow","setMouseUpEvent","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","generatePathData","tl","tr","bl","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","amplitude","speedScale","paint","pinnedTop","progressToPinned","beginPath","moveTo","lineTo","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","closePath","stateId","createGradient","shader","fillStyle","getGradientFromType","x0","y0","createLinearGradient","MUTED_BY_ADMIN","addColorStop","UNMUTED","MUTED","CONNECTING","dt","handleDevicePixelRatioChanged","setSize","forceUpdate","handleResize","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","raf","draw","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","globalAlpha","setCurrentState","states","matchMedia","setAmplitude","setCanvasSize","cache","computedStyle","getProperty","getComputedStyle","getPropertyValue","playPart","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","skipAnimation","startFrame","endFrame","frameCount","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","getItem","invoke","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","propertyValue","hexToRgb","getColorByMutedState","generateEqualParts","clearMutedStateModifier","withIcons","icons","iconClassName","element2","actionClassName","instance","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","mutedState","peerTitle","groupCallParticipantMutedIcon","groupCallParticipantStatus","renderFrame","callVideoCanvasBlur","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","displayPinned","shouldDisplay","shouldDisplayElement","isPinned","setPinned","hasAnyVideo","some","participantElements","participantVideo","getVideoElementFromParticipantByType","setParticipant","_onLengthChange","onOpenProfileClick","popup","getPopup","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getParticipantByPeerId","getContainer","groupCallParticipantsVideo","getGroupCallParticipants","descriptionIntl","mediaDevices","_className","buttonDiv","isConfirm","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","handlers","swipeHandler","resizeHandlerClassName","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setCursor","_width","_height","toggleMovable","movable","movableOptions","setPositionToCenter","destroyElements","raise_hand_rating","withoutOverlay","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","onFullScreenChange","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","setThemeColor","movablePanel","isBig","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","CLOSED","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CALL_STATE","interval","connectionState","CONNECTED","PENDING","REQUESTING","EXCHANGING_KEYS","connectedAt","appAvatarsManager","onState","hasCurrent","amplitudes","weave","currentDescription","instanceListenerSetter","clearCurrentInstance","callDescription","CLOSING","convertCallStateToGroupState","componentDidMount","componentWillUnmount","groupCallMicrophoneIconMini","interlocutorUserId","CLASS_NAME","throttledMuteClick","weaveContainer","FOCUS_EVENT_NAME","columnEl","offline","updateStatusInterval","backgroundPromises","onHashChange","parseUriParams","tgaddr","replaceState","onclick","wrapUrl","postId","post","setSettings","chatsSelectTabDebounced","setLoop","setTimeFormat","timeFormat","onDocumentPaste","attachType","newMediaPopup","canDrag","DragEvent","_types","dataTransfer","addFiles","isIDLE","updateStatus","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","saveChatPosition","choosing","setChoosingStickerTyping","typings","typing","stickerWrapper","parse","singleInstance","activateInstance","setToCache","topbarCall","setAuthorized","telegramMeWebManager","addAnchorListener","uriParams","hashtag","pathnameParams","STICKER_SET","protocol","makeLink","VOICE_CHAT","PRIVATE_POST","thread","comment","MESSAGE","domain","attachKeydownListener","screen","IGNORE_KEYS","isOverlayActive","goodMid","nextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","saveApiChat","noPathnameParams","pathname","noUriParams","openComment","generateThreadServiceStartMessage","getGroupCallFull","discardCurrentCall","call","saveGroupCall","createGroupCall","broadcastEvent","STATE_INIT","getBackground","setBackground","getFile","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","prevTab","prevIdx","attachDragAndDropListeners","handleSelection","drops","mediaDrops","mount","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","appendDrops","drop","setPath","transitionTime","setUserStatus","fromIndex","justReturn","spliced","chatFrom","beforeDestroy","chatIndex","spliceChats","existingIndex","oldChat","setType","dot","eye","getPeerTypings","langPackKeys","private","multi","mapa","typingElement","getTypingElement","descriptionElement","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","topButtons","author","preloaderStreamable","isFirstOpen","pageEl","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","highlightSwitchersTimeout","wholeDiv","isZooming","mover","ctrlKeyDown","changeZoom","onKeyUp","onWheel","scrollingUp","MEDIA_VIEWER_CLASSNAME","overlaysDiv","mainDiv","topbarLeft","onlyMobile","authorRight","zoom","setNewMover","onDownloadClick","moveLength","setMoverPromise","evt","zoomValue","videoPlayer","lockControls","zoomSwipeHandler","lastDiffY","addProgress","btnMenuToggle","setMoverToTarget","appMediaViewer","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","isVideo","useContainerAsTarget","moveTheMover","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","updateMediaSource","cancellablePromise","attachPromise","haveImage","captionTimeout","isForDocument","onAuthorClick","savePhotoFile","setCaptionTimeout","btnMenuForward","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","onCaptionClick","cantForwardMessage","cantDownloadMessage","setCaption","_openMedia","onAvatarUpdate","removeFromAvatarsCache","getFullPhoto","getTarget","hadMessage","isAvatarCached","believeMe","isDialog","addedToQueue","oldValue","newPeerId","getPeerMigratedTo","onArchiveClick","selectedId","editPeerFolders","folder_id","toggleDialogPin","pinned_dialogs_count_max","onUnmuteClick","onUnreadClick","top_message","isDialogUnread","SENDING_STATUS","hadConnect","connecting","timedOut","updating","setConnectionStatus","baseDcId","setFirstConnectionTimeout","connectionStatus","online","Connected","forceGetDifference","TimedOut","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","CHANGE_STATE_DELAY","getA","forceReconnect","timerSpan","forceReconnectTimeout","setStateTimeout","statusContainer","constructContainer","roundRect","defaultRadius","quadraticCurveTo","DPR","SIZE","MARGIN","RADIUS","groupCallActiveIcon","START_X","startTime","wasMounted","itemProgress","startAnimation","indexKey","appDialogsManager","addListDialog","isBatch","menuScrollContainer","lastActiveElements","offsets","initedListeners","loadedDialogsAtLeastOnce","loadDialogsPromise","onChatsScroll","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","loadContacts","verifyPeerIdForContacts","processContact","added","onChatsRegularScroll","sliceTimeout","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","changeFiltersAllChatsKey","getDialogIndexKey","hasClassName","getDialogDom","setOnlineStatus","processDialogForCallStatus","setFilterUnreadCount","validateDialogForFilter","setFiltersUnreadCount","updateDialog","setUnreadMessages","setDialogActive","getCachedDialogs","validateListForFilter","onFiltersLengthChange","containerToAppend","renderedFilter","unsetTyping","dialogDom","callIcon","getNotifyPeerTypeSettings","initListeners","renderFiltersPromise","showFiltersPromise","storagesResults","addMissedDialogs","fillConversations","migratedTo","testDialogForFilter","topOffset","getOffsetIndex","bottomOffset","isDialogMustBeInViewport","unreadSpan","getFolder","foundUnmuted","getAll","sortedDialogList","clientWidth","wasShowing","currentOffsetIndex","needIndex","getConversationsResult","isTopEnd","callbacks","cccc","offsetDialog","classNameType","subtitleArgs","placeholderContainer","generateEmptyPlaceholder","wrapLocalSticker","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","firstDialog","getDialogFromElement","lastDialog","withContext","openInner","lastActiveListElement","setPeerFunc","sameElement","getDialogByPeerId","lastMessage","highlightWord","setUnread","draftMessage","lastTimeSpan","playIcon","withoutMediaType","sender","senderBold","setStatusMessage","disableAnimationIfRippleFound","setSendingStatus","statusSpan","hasUnreadBadge","isUnreadBadgeMounted","unreadBadge","hasMentionsBadge","isMentionBadgeMounted","mentionsBadge","transitionDuration","isMention","originalDialog","getDialog","setCallStatus","call_not_empty","getMessageSenderPeerIdOrName","addDialog","fromName","_dialog","captionDiv","titleSpanContainer","titleP","rightSpan","oldTypingElement","newTypingElement","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","create","default","prototype","AudioContext","webkitAudioContext","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","getUserMedia","WebAssembly","clearStream","stream","getTracks","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","postMessage","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","createGain","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","createMediaStreamSource","loadWorker","Worker","initWorker","streamPage","storePage","recordedPages","samplePosition","page","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","gain","setTargetAtTime","onstart","destroyWorker","Function","rippleClickId","attachListenerTo","drawRipple","clickId","elapsedTime","touchStartFired","clickY","isRippleUnneeded","touchEnd","CLICK_EVENT_NAME","detachClickEvent","simulateClickEvent","rippleSquare","putPreloader","returnDiv","setButtonLoader","diffX","diffY","closeBtnMenu","menuOverlay","openedMenuOnClose","openBtnMenu","positionMenu","menuWidth","menuHeight","windowWidth","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","onCancel","ScrollableBase","logPrefix","onScrollMeasure","needCheckAfterAnimation","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","ScrollableX","splitCount","scrollHorizontally","deltaX","navigations","manual","currentHash","isPossibleSwipe","pushState","handleItem","scrollRestoration","backByItem","noHistory","origin","CheckboxField","stateValue","stateValues","checkSvg","bg","withHover","simulateEvent","kind","scheduleFlush","do","read","write","ignoreTouchCheck","selectNodeContents","createTextRange","textRange","moveToElementText","TouchEvent","currentHashPromise","newHashPromise","password","new_settings","invokeCrypto","newAlgo","new_algo","salt1","randomize","hashes","new_password_hash","inputCheckPassword","setUser"],"mappings":"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","file":"14.e0b3ee5569e2564c790f.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// import { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class PasswordInputField extends InputField {\r\n public passwordVisible = false;\r\n public toggleVisible: HTMLElement;\r\n public onVisibilityClickAdditional: () => void;\r\n\r\n constructor(options: InputFieldOptions = {}) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'password';\r\n input.setAttribute('required', '');\r\n input.name = 'notsearch_password';\r\n input.autocomplete = 'off';\r\n\r\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\r\n input.setAttribute('readonly', '');\r\n input.addEventListener('focus', () => {\r\n input.removeAttribute('readonly');\r\n }, {once: true});\r\n } */\r\n\r\n // * https://stackoverflow.com/a/35949954/6758968\r\n const stealthy = document.createElement('input');\r\n stealthy.classList.add('stealthy');\r\n stealthy.tabIndex = -1;\r\n stealthy.type = 'password';\r\n input.parentElement.prepend(stealthy);\r\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\r\n\r\n const toggleVisible = this.toggleVisible = document.createElement('span');\r\n toggleVisible.classList.add('toggle-visible', 'tgico');\r\n\r\n this.container.classList.add('input-field-password');\r\n this.container.append(toggleVisible);\r\n\r\n toggleVisible.addEventListener('click', this.onVisibilityClick);\r\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\r\n }\r\n\r\n public onVisibilityClick = (e: Event) => {\r\n cancelEvent(e);\r\n this.passwordVisible = !this.passwordVisible;\r\n\r\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\r\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\r\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport lottieLoader, { LottieLoader } from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\nimport PasswordInputField from \"../passwordInputField\";\r\n\r\nexport default class PasswordMonkey {\r\n public container: HTMLElement;\r\n public animation: RLottiePlayer;\r\n public needFrame = 0;\r\n protected loadPromise: ReturnType;\r\n\r\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size,\r\n noCache: true\r\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\r\n }, 'TwoFactorSetupMonkeyPeek').then(_animation => {\r\n //return;\r\n this.animation = _animation;\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, this.needFrame);\r\n\r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n } \r\n });\r\n\r\n this.passwordInputField.onVisibilityClickAdditional = () => {\r\n if(this.passwordInputField.passwordVisible) {\r\n this.animation.setDirection(1);\r\n this.animation.curFrame = 0;\r\n this.needFrame = 16;\r\n this.animation.play();\r\n } else {\r\n this.animation.setDirection(-1);\r\n this.animation.curFrame = 16;\r\n this.needFrame = 0;\r\n this.animation.play();\r\n }\r\n };\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n });\r\n }\r\n\r\n public remove() {\r\n if(this.animation) {\r\n this.animation.remove();\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField from \"../inputField\";\r\nimport lottieLoader from \"../../lib/rlottie/lottieLoader\";\r\nimport RLottiePlayer from \"../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class TrackingMonkey {\r\n public container: HTMLElement;\r\n\r\n protected max = 45;\r\n protected needFrame = 0;\r\n\r\n protected animation: RLottiePlayer;\r\n protected idleAnimation: RLottiePlayer;\r\n\r\n protected loadPromise: Promise;\r\n\r\n constructor(protected inputField: InputField, protected size: number) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('media-sticker-wrapper');\r\n\r\n const input = inputField.input;\r\n\r\n input.addEventListener('blur', () => {\r\n this.playAnimation(0);\r\n });\r\n\r\n input.addEventListener('input', (e) => {\r\n this.playAnimation(inputField.value.length);\r\n });\r\n\r\n /* codeInput.addEventListener('focus', () => {\r\n playAnimation(Math.max(codeInput.value.length, 1));\r\n }); */\r\n }\r\n\r\n // 1st symbol = frame 15\r\n // end symbol = frame 165\r\n public playAnimation(length: number) {\r\n if(!this.animation) return;\r\n\r\n length = Math.min(length, 30);\r\n let frame: number;\r\n if(length) {\r\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\r\n\r\n if(this.idleAnimation) {\r\n this.idleAnimation.stop(true);\r\n this.idleAnimation.canvas.style.display = 'none';\r\n }\r\n \r\n this.animation.canvas.style.display = '';\r\n } else {\r\n /* const cb = (frameNo: number) => {\r\n if(frameNo <= 1) { */\r\n /* idleAnimation.play();\r\n idleAnimation.canvas.style.display = '';\r\n animation.canvas.style.display = 'none'; */\r\n /* animation.removeListener('enterFrame', cb);\r\n }\r\n };\r\n animation.addListener('enterFrame', cb); */\r\n \r\n frame = 0;\r\n }\r\n //animation.playSegments([1, 2]);\r\n\r\n const direction = this.needFrame > frame ? -1 : 1;\r\n //console.log('keydown', length, frame, direction);\r\n\r\n this.animation.setDirection(direction);\r\n if(this.needFrame !== 0 && frame === 0) {\r\n this.animation.setSpeed(7);\r\n }\r\n /* let diff = Math.abs(needFrame - frame * direction);\r\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\r\n this.needFrame = frame;\r\n \r\n this.animation.play();\r\n\r\n /* animation.goToAndStop(15, true); */\r\n //animation.goToAndStop(length / max * );\r\n }\r\n\r\n public load() {\r\n if(this.loadPromise) return this.loadPromise;\r\n return this.loadPromise = Promise.all([\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: true,\r\n autoplay: true,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyIdle').then(animation => {\r\n this.idleAnimation = animation;\r\n\r\n // ! animationIntersector will stop animation instantly\r\n if(!this.inputField.value.length) {\r\n animation.play();\r\n }\r\n\r\n return lottieLoader.waitForFirstFrame(animation);\r\n }),\r\n\r\n lottieLoader.loadAnimationAsAsset({\r\n container: this.container,\r\n loop: false,\r\n autoplay: false,\r\n width: this.size,\r\n height: this.size\r\n }, 'TwoFactorSetupMonkeyTracking').then(_animation => {\r\n this.animation = _animation;\r\n\r\n if(!this.inputField.value.length) {\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n\r\n this.animation.addEventListener('enterFrame', currentFrame => {\r\n //console.log('enterFrame', currentFrame, needFrame);\r\n //let currentFrame = Math.round(e.currentTime);\r\n \r\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\r\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\r\n this.animation.setSpeed(1);\r\n this.animation.pause();\r\n }\r\n\r\n if(currentFrame === 0 && this.needFrame === 0) {\r\n //animation.curFrame = 0;\r\n \r\n if(this.idleAnimation) {\r\n this.idleAnimation.canvas.style.display = '';\r\n this.idleAnimation.play();\r\n this.animation.canvas.style.display = 'none';\r\n }\r\n }\r\n });\r\n //console.log(animation.getDuration(), animation.getDuration(true));\r\n\r\n return lottieLoader.waitForFirstFrame(_animation);\r\n })\r\n ]);\r\n }\r\n\r\n public remove() {\r\n if(this.animation) this.animation.remove();\r\n if(this.idleAnimation) this.idleAnimation.remove();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport InputField, { InputFieldOptions } from \"./inputField\";\r\n\r\nexport default class CodeInputField extends InputField {\r\n constructor(options: InputFieldOptions & {\r\n length: number,\r\n onFill: (code: string) => void\r\n }) {\r\n super({\r\n plainText: true,\r\n ...options\r\n });\r\n\r\n const input = this.input as HTMLInputElement;\r\n input.type = 'tel';\r\n input.setAttribute('required', '');\r\n input.autocomplete = 'off';\r\n\r\n let lastLength = 0;\r\n this.input.addEventListener('input', (e) => {\r\n this.input.classList.remove('error');\r\n this.setLabel();\r\n \r\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\r\n this.setValueSilently(value);\r\n \r\n const length = this.value.length;\r\n if(length === options.length) { // submit code\r\n options.onFill(this.value);\r\n } else if(length === lastLength) {\r\n return;\r\n }\r\n \r\n lastLength = length;\r\n });\r\n }\r\n}\r\n","import IMAGE_MIME_TYPES_SUPPORTED from \"./imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"./videoMimeTypesSupport\";\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function setInnerHTML(elem: Element, html: string) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, MessageAction } from \"../layer\";\nimport type { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport { forEachReverse } from \"./array\";\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"./array\";\nimport { safeAssign } from \"./object\";\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n \n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.loadedAllUp = this.loadedAllDown = loadedAll;\n this.loadPromiseUp = this.loadPromiseDown = null;\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n this.previous.push(this.current, ...items);\n } else {\n items = this.previous.splice(this.previous.length + length, -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n this.next.unshift(...items, this.current);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older && this.loadedAllDown) return Promise.resolve();\n else if(!older && this.loadedAllUp) return Promise.resolve();\n\n if(older && this.loadPromiseDown) return this.loadPromiseDown;\n else if(!older && this.loadPromiseUp) return this.loadPromiseUp;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n const promise = this.loadMore(anchor, older, this.loadCount).then(result => {\n if((older && this.loadPromiseDown !== promise) || (!older && this.loadPromiseUp !== promise)) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n if(older) this.loadedAllDown = true;\n else this.loadedAllUp = true;\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n\n if(older) {\n if(this.reverse) this.previous.unshift(processed);\n else this.next.push(processed);\n } else {\n if(this.reverse) this.next.push(processed);\n else this.previous.unshift(processed);\n }\n });\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { MediaSearchContext } from \"../components/appMediaPlaybackController\";\nimport type { SearchSuperContext } from \"../components/appSearchSuper.\";\nimport type { Message } from \"../layer\";\nimport appMessagesIdsManager from \"../lib/appManagers/appMessagesIdsManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { forEachReverse } from \"./array\";\nimport filterChatPhotosMessages from \"./filterChatPhotosMessages\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n constructor(options: Omit, 'loadMore'> & {onEmptied?: () => void} = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = this.current?.mid;\n\n if(anchor) maxId = anchor.mid;\n if(!older) maxId = appMessagesIdsManager.incrementMessageId(maxId, 1);\n\n return appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then(value => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: (message) => {\n const filtered = this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n }\n\n protected filterMids(mids: number[]) {\n const storage = this.searchContext.isScheduled ? \n appMessagesManager.getScheduledMessagesStorage(this.searchContext.peerId) : \n appMessagesManager.getMessagesStorage(this.searchContext.peerId);\n const filtered = appMessagesManager.filterMessagesByInputFilter(this.searchContext.inputFilter._, mids, storage, mids.length) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = (obj: {\n [peerId: string]: Set;\n }) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n const mids = obj[this.searchContext.peerId];\n if(!mids) {\n return;\n }\n\n const sorted = Array.from(mids).sort((a, b) => a - b);\n const filtered = this.filterMids(sorted);\n const targets = filtered.map(message => this.processItem(message)).filter(Boolean);\n if(targets.length) {\n this.next.push(...targets);\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend({\n [message.peerId]: new Set([message.mid])\n });\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(!this.searchContext.useSearch) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\r\nimport Scrollable from \"./scrollable\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport InputSearch from \"./inputSearch\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nexport class SearchGroup {\r\n container: HTMLDivElement;\r\n nameEl: HTMLDivElement;\r\n list: HTMLUListElement;\r\n\r\n constructor(public name: LangPackKey | boolean, public type: string, private clearable = true, className?: string, clickable = true, public autonomous = true, public onFound?: () => void) {\r\n this.list = appDialogsManager.createChatList();\r\n this.container = document.createElement('div');\r\n if(className) this.container.className = className;\r\n \r\n if(name) {\r\n this.nameEl = document.createElement('div');\r\n this.nameEl.classList.add('search-group__name');\r\n if(typeof(name) === 'string') {\r\n this.nameEl.append(i18n(name));\r\n }\r\n this.container.append(this.nameEl);\r\n }\r\n \r\n this.container.classList.add('search-group', 'search-group-' + type);\r\n this.container.append(this.list);\r\n this.container.style.display = 'none';\r\n\r\n if(clickable) {\r\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\r\n }\r\n }\r\n\r\n clear() {\r\n this.container.style.display = 'none';\r\n\r\n if(this.clearable) {\r\n this.list.innerHTML = '';\r\n }\r\n }\r\n\r\n setActive() {\r\n this.container.style.display = '';\r\n }\r\n\r\n toggle() {\r\n if(this.list.childElementCount) {\r\n this.setActive();\r\n } else {\r\n this.clear();\r\n }\r\n }\r\n}\r\n\r\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\r\n\r\nexport default class AppSearch {\r\n private minMsgId = 0;\r\n private loadedCount = -1;\r\n private foundCount = -1;\r\n\r\n private searchPromise: Promise = null;\r\n private searchTimeout: number = 0;\r\n\r\n private query = '';\r\n\r\n private listsContainer: HTMLDivElement = null;\r\n\r\n private peerId: PeerId; // 0 - means global\r\n private threadId = 0;\r\n\r\n private scrollable: Scrollable;\r\n\r\n constructor(public container: HTMLElement, public searchInput: InputSearch, public searchGroups: {[group in SearchGroupType]: SearchGroup}, public onSearch?: (count: number) => void) {\r\n this.scrollable = new Scrollable(this.container);\r\n this.listsContainer = this.scrollable.container as HTMLDivElement;\r\n for(let i in this.searchGroups) {\r\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\r\n }\r\n\r\n if(this.searchGroups.messages) {\r\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\r\n }\r\n\r\n this.searchInput.onChange = (value) => {\r\n /* if(!value.trim()) {\r\n //this.peerId = 0;\r\n return;\r\n } */\r\n \r\n this.query = value;\r\n this.reset(false);\r\n this.searchMore();\r\n };\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n if(!this.query.trim()) return;\r\n \r\n if(!this.searchTimeout) {\r\n this.searchTimeout = window.setTimeout(() => {\r\n this.searchMore();\r\n this.searchTimeout = 0;\r\n }, 0);\r\n }\r\n };\r\n }\r\n\r\n public reset(all = true) {\r\n if(all) {\r\n this.searchInput.value = '';\r\n this.query = '';\r\n this.peerId = undefined;\r\n this.threadId = 0;\r\n }\r\n\r\n this.minMsgId = 0;\r\n this.loadedCount = -1;\r\n this.foundCount = -1;\r\n\r\n for(let i in this.searchGroups) {\r\n this.searchGroups[i as SearchGroupType].clear();\r\n }\r\n \r\n this.searchPromise = null;\r\n }\r\n\r\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n\r\n if(this.query !== query) {\r\n this.searchInput.inputField.value = query;\r\n }\r\n\r\n this.searchInput.input.focus();\r\n }\r\n\r\n public searchMore() {\r\n if(this.searchPromise) return this.searchPromise;\r\n \r\n const query = this.query;\r\n \r\n if(!query.trim()) {\r\n this.onSearch && this.onSearch(0);\r\n return;\r\n }\r\n \r\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\r\n return Promise.resolve();\r\n }\r\n \r\n const maxId = this.minMsgId || 0;\r\n\r\n return this.searchPromise = appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n query, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n maxId, \r\n limit: 20,\r\n threadId: this.threadId\r\n }).then(res => {\r\n this.searchPromise = null;\r\n \r\n if(this.searchInput.value !== query) {\r\n return;\r\n }\r\n \r\n //console.log('input search result:', this.peerId, query, null, maxId, 20, res);\r\n \r\n const {count, history} = res;\r\n \r\n if(history.length && history[0].mid === this.minMsgId) {\r\n history.shift();\r\n }\r\n \r\n const searchGroup = this.searchGroups.messages;\r\n\r\n history.forEach((message) => {\r\n try {\r\n const peerId = this.peerId ? message.fromId : message.peerId;\r\n appDialogsManager.addDialogAndSetLastMessage({\r\n peerId, \r\n container: this.scrollable/* searchGroup.list */, \r\n drawStatus: false,\r\n avatarSize: 54,\r\n meAsSaved: false,\r\n message,\r\n query\r\n });\r\n } catch(err) {\r\n console.error('[appSearch] render search result', err);\r\n }\r\n });\r\n\r\n searchGroup.toggle();\r\n \r\n this.minMsgId = history.length && history[history.length - 1].mid;\r\n \r\n if(this.loadedCount === -1) {\r\n this.loadedCount = 0;\r\n }\r\n this.loadedCount += history.length;\r\n \r\n if(this.foundCount === -1) {\r\n this.foundCount = count;\r\n\r\n if(searchGroup.nameEl) {\r\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\r\n }\r\n \r\n this.onSearch && this.onSearch(this.foundCount);\r\n }\r\n }).catch(err => {\r\n console.error('search error', err);\r\n this.searchPromise = null;\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { getRichValue } from \"../helpers/dom\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport InputField from \"./inputField\";\r\n\r\nexport default class InputSearch {\r\n public container: HTMLElement;\r\n public input: HTMLElement;\r\n public inputField: InputField;\r\n public clearBtn: HTMLElement;\r\n\r\n public prevValue = '';\r\n public timeout = 0;\r\n public onChange: (value: string) => void;\r\n public onClear: () => void;\r\n\r\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\r\n this.inputField = new InputField({\r\n placeholder,\r\n plainText: true\r\n });\r\n\r\n this.container = this.inputField.container;\r\n this.container.classList.remove('input-field');\r\n this.container.classList.add('input-search');\r\n\r\n this.onChange = onChange;\r\n\r\n this.input = this.inputField.input;\r\n this.input.classList.add('input-search-input');\r\n\r\n const searchIcon = document.createElement('i');\r\n searchIcon.classList.add('tgico', 'tgico-search');\r\n\r\n this.clearBtn = document.createElement('i');\r\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\r\n\r\n this.input.addEventListener('input', this.onInput);\r\n this.clearBtn.addEventListener('click', this.onClearClick);\r\n\r\n this.container.append(searchIcon, this.clearBtn);\r\n }\r\n \r\n onInput = () => {\r\n if(!this.onChange) return;\r\n\r\n let value = this.value;\r\n\r\n //this.input.classList.toggle('is-empty', !value.trim());\r\n\r\n if(value !== this.prevValue) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.timeout = window.setTimeout(() => {\r\n this.onChange(value);\r\n }, 200);\r\n }\r\n };\r\n\r\n onClearClick = () => {\r\n this.value = '';\r\n this.onChange && this.onChange('');\r\n this.onClear && this.onClear();\r\n };\r\n\r\n get value() {\r\n return this.inputField.value;\r\n }\r\n\r\n set value(value: string) {\r\n this.prevValue = value;\r\n clearTimeout(this.timeout);\r\n this.inputField.value = value;\r\n }\r\n\r\n public remove() {\r\n clearTimeout(this.timeout);\r\n this.input.removeEventListener('input', this.onInput);\r\n this.clearBtn.removeEventListener('click', this.onClearClick);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-icon', {\r\n icon: className || undefined, \r\n ...options\r\n });\r\n\r\n return button;\r\n};\r\n\r\nexport default ButtonIcon;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport EventListenerBase from \"../helpers/eventListenerBase\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport Scrollable from \"./scrollable\";\r\nimport SidebarSlider from \"./slider\";\r\n\r\nexport interface SliderTab {\r\n onOpen?: () => void,\r\n onOpenAfterTimeout?: () => void,\r\n onClose?: () => void,\r\n onCloseAfterTimeout?: () => void\r\n}\r\n\r\nexport interface SliderSuperTabConstructable {\r\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTab;\r\n}\r\n\r\nexport default class SliderSuperTab implements SliderTab {\r\n public container: HTMLElement;\r\n\r\n public header: HTMLElement;\r\n public closeBtn: HTMLElement;\r\n public title: HTMLElement;\r\n\r\n public content: HTMLElement;\r\n public scrollable: Scrollable;\r\n\r\n public slider: SidebarSlider;\r\n public destroyable: boolean;\r\n public listenerSetter: ListenerSetter;\r\n\r\n constructor(slider: SidebarSlider, destroyable?: boolean) {\r\n this._constructor(slider, destroyable);\r\n }\r\n\r\n public _constructor(slider: SidebarSlider, destroyable = true): any {\r\n this.slider = slider;\r\n this.destroyable = destroyable;\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\r\n\r\n // * Header\r\n this.header = document.createElement('div');\r\n this.header.classList.add('sidebar-header');\r\n\r\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\r\n this.title = document.createElement('div');\r\n this.title.classList.add('sidebar-header__title');\r\n this.header.append(this.closeBtn, this.title);\r\n\r\n // * Content\r\n this.content = document.createElement('div');\r\n this.content.classList.add('sidebar-content');\r\n\r\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\r\n\r\n this.container.append(this.header, this.content);\r\n\r\n this.slider.addTab(this);\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public close() {\r\n return this.slider.closeTab(this);\r\n }\r\n\r\n public async open(...args: any[]) {\r\n if(this.init) {\r\n try {\r\n const result = this.init();\r\n this.init = null;\r\n\r\n if(result instanceof Promise) {\r\n await result;\r\n }\r\n } catch(err) {\r\n console.error('open tab error', err);\r\n }\r\n }\r\n\r\n this.slider.selectTab(this);\r\n }\r\n\r\n protected init(): Promise | any {\r\n\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\r\n this.slider.tabs.delete(this);\r\n this.container.remove();\r\n }\r\n\r\n if(this.listenerSetter) {\r\n this.listenerSetter.removeAll();\r\n }\r\n }\r\n\r\n protected setTitle(key: LangPackKey) {\r\n this.title.innerHTML = '';\r\n this.title.append(i18n(key));\r\n }\r\n}\r\n\r\nexport class SliderSuperTabEventable extends SliderSuperTab {\r\n public eventListener: EventListenerBase<{\r\n destroy: () => void\r\n }>;\r\n\r\n constructor(slider: SidebarSlider) {\r\n super(slider);\r\n this.eventListener = new EventListenerBase();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.eventListener.dispatchEvent('destroy');\r\n this.eventListener.cleanup();\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n\r\n/* // @ts-ignore\r\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\r\n superConstructor: (...args: any[]) => any;\r\n}\r\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\r\n constructor(slider: SidebarSlider) {\r\n this.superConstructor([slider, true]);\r\n }\r\n}\r\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\r\n\r\n(window as any).lol = SliderSuperEventsTab\r\n\r\nexport {SliderSuperEventsTab}; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { horizontalMenu } from \"./horizontalMenu\";\r\nimport { TransitionSlider } from \"./transition\";\r\nimport appNavigationController, { NavigationItem } from \"./appNavigationController\";\r\nimport SliderSuperTab, { SliderSuperTabConstructable, SliderTab } from \"./sliderTab\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\n\r\nconst TRANSITION_TIME = 250;\r\n\r\nexport type {SliderTab};\r\nexport {SliderSuperTab};\r\n\r\nexport default class SidebarSlider {\r\n protected _selectTab: ReturnType;\r\n public historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\r\n public tabsContainer: HTMLElement;\r\n public sidebarEl: HTMLElement;\r\n public tabs: Map; // * key is any, since right sidebar is ugly now\r\n private canHideFirst = false;\r\n private navigationType: NavigationItem['type']\r\n\r\n constructor(options: {\r\n sidebarEl: SidebarSlider['sidebarEl'],\r\n tabs?: SidebarSlider['tabs'],\r\n canHideFirst?: SidebarSlider['canHideFirst'],\r\n navigationType: SidebarSlider['navigationType']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.tabs) {\r\n this.tabs = new Map();\r\n }\r\n\r\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\r\n this._selectTab = TransitionSlider(this.tabsContainer, 'navigation', TRANSITION_TIME);\r\n if(!this.canHideFirst) {\r\n this._selectTab(0);\r\n }\r\n\r\n Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach(el => {\r\n attachClickEvent(el, this.onCloseBtnClick);\r\n });\r\n }\r\n\r\n public onCloseBtnClick = () => {\r\n const item = appNavigationController.findItemByType(this.navigationType);\r\n if(item) {\r\n appNavigationController.back(this.navigationType);\r\n } else if(this.historyTabIds.length) {\r\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\r\n }\r\n // this.closeTab();\r\n };\r\n\r\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\r\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\r\n return false;\r\n }\r\n\r\n //console.log('sidebar-close-button click:', this.historyTabIDs);\r\n const closingId = this.historyTabIds.pop(); // pop current\r\n this.onCloseTab(closingId, animate, isNavigation);\r\n\r\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\r\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\r\n return true;\r\n };\r\n\r\n public selectTab(id: number | SliderSuperTab): boolean {\r\n /* if(id instanceof SliderSuperTab) {\r\n id = id.id;\r\n } */\r\n\r\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\r\n return false;\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onOpen) {\r\n tab.onOpen();\r\n }\r\n \r\n if(tab.onOpenAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onOpenAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n\r\n //if(!this.canHideFirst || this.historyTabIds.length) {\r\n appNavigationController.pushItem({\r\n type: this.navigationType, \r\n onPop: (canAnimate) => {\r\n this.closeTab(undefined, canAnimate, true);\r\n return true;\r\n }\r\n });\r\n //}\r\n \r\n this.historyTabIds.push(id);\r\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\r\n return true;\r\n }\r\n\r\n public removeTabFromHistory(id: number | SliderSuperTab) {\r\n indexOfAndSplice(this.historyTabIds, id);\r\n this.onCloseTab(id, undefined);\r\n }\r\n\r\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\r\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\r\n const tab = this.historyTabIds[i];\r\n if(tab === preserveTab) continue;\r\n else if(tab instanceof tabConstructor) {\r\n break;\r\n }\r\n\r\n this.removeTabFromHistory(tab);\r\n //appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n }\r\n\r\n public getTab(tabConstructor: SliderSuperTabConstructable) {\r\n return this.historyTabIds.find(t => t instanceof tabConstructor) as SliderSuperTab;\r\n }\r\n\r\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\r\n return !!this.getTab(tabConstructor);\r\n }\r\n\r\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\r\n if(!isNavigation) {\r\n appNavigationController.removeByType(this.navigationType, true);\r\n }\r\n\r\n const tab: SliderTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\r\n if(tab) {\r\n if(tab.onClose) {\r\n tab.onClose();\r\n }\r\n\r\n if(tab.onCloseAfterTimeout) {\r\n setTimeout(() => {\r\n tab.onCloseAfterTimeout();\r\n }, TRANSITION_TIME);\r\n }\r\n }\r\n }\r\n\r\n public addTab(tab: SliderSuperTab) {\r\n if(!tab.container.parentElement) {\r\n this.tabsContainer.append(tab.container);\r\n\r\n if(tab.closeBtn) {\r\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\r\n }\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport type { InputFile } from \"../layer\";\r\nimport PopupAvatar from \"./popups/avatar\";\r\n\r\nexport default class AvatarEdit {\r\n public container: HTMLElement;\r\n private canvas: HTMLCanvasElement;\r\n private icon: HTMLSpanElement;\r\n\r\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('avatar-edit');\r\n\r\n this.canvas = document.createElement('canvas');\r\n this.canvas.classList.add('avatar-edit-canvas');\r\n\r\n this.icon = document.createElement('span');\r\n this.icon.classList.add('tgico', 'tgico-cameraadd');\r\n\r\n this.container.append(this.canvas, this.icon);\r\n\r\n this.container.addEventListener('click', () => {\r\n new PopupAvatar().open(this.canvas, onChange);\r\n });\r\n }\r\n\r\n public clear() {\r\n const ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Button from \"./button\";\r\n\r\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\r\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\r\n return button;\r\n};\r\n\r\nexport default ButtonCorner;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\ninterface OpenStreetMapInterface {\r\n place_id?: number;\r\n license?: string;\r\n osm_type?: string;\r\n osm_id?: number;\r\n lat?: string;\r\n lon?: string;\r\n display_name: string;\r\n address?: object;\r\n boundingbox?: object;\r\n}\r\n\r\nexport default class AppNewGroupTab extends SliderSuperTab {\r\n private avatarEdit: AvatarEdit;\r\n private uploadAvatar: () => Promise = null;\r\n private peerIds: PeerId[];\r\n private isGeoChat: boolean = false;\r\n private nextBtn: HTMLButtonElement;\r\n private groupNameInputField: InputField;\r\n private list: HTMLUListElement;\r\n private groupLocationInputField: InputField;\r\n private userLocationCoords: {lat: number, long: number};\r\n private userLocationAddress: string;\r\n\r\n protected init() {\r\n this.container.classList.add('new-group-container');\r\n this.setTitle('NewGroup');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.groupNameInputField = new InputField({\r\n label: 'CreateGroup.NameHolder',\r\n maxLength: 128\r\n });\r\n\r\n this.groupLocationInputField = new InputField({\r\n label: 'ChatLocation',\r\n name: 'location',\r\n canBeEdited: false\r\n });\r\n\r\n inputWrapper.append(\r\n this.groupNameInputField.container,\r\n this.groupLocationInputField.container\r\n );\r\n\r\n this.groupNameInputField.input.addEventListener('input', () => {\r\n const value = this.groupNameInputField.value;\r\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\r\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\r\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\r\n });\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.groupNameInputField.value;\r\n\r\n if(this.isGeoChat){\r\n if(!this.userLocationAddress || !this.userLocationCoords) return;\r\n appChatsManager.createChannel({\r\n title, \r\n about: '', \r\n geo_point: {\r\n _: 'inputGeoPoint',\r\n ...this.userLocationCoords, \r\n },\r\n address: this.userLocationAddress,\r\n megagroup: true\r\n }).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n\r\n if(this.peerIds.length){\r\n appChatsManager.inviteToChannel(chatId, this.peerIds);\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n } else {\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChat(title, this.peerIds.map(peerId => peerId.toUserId())).then((chatId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(chatId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n appSidebarLeft.selectTab(0);\r\n });\r\n }\r\n });\r\n\r\n const chatsSection = new SettingSection({\r\n name: 'Members',\r\n nameArgs: [this.peerIds.length]\r\n });\r\n\r\n const list = this.list = appDialogsManager.createChatList({\r\n new: true\r\n });\r\n\r\n chatsSection.content.append(list);\r\n\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n\r\n this.content.append(this.nextBtn);\r\n this.scrollable.append(section.container, chatsSection.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.groupNameInputField.value = '';\r\n this.groupLocationInputField.container.classList.add('hide');\r\n this.nextBtn.disabled = false;\r\n }\r\n\r\n public open(peerIds: PeerId[], isGeoChat: boolean = false) {\r\n this.isGeoChat = isGeoChat;\r\n this.peerIds = peerIds;\r\n const result = super.open();\r\n result.then(() => {\r\n if(isGeoChat) {\r\n this.setTitle('NearbyCreateGroup');\r\n this.groupLocationInputField.container.classList.remove('hide');\r\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\r\n this.startLocating();\r\n } else {\r\n this.groupLocationInputField.container.classList.add('hide');\r\n }\r\n\r\n this.peerIds.forEach(userId => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: userId,\r\n container: this.list,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n avatarSize: 48\r\n });\r\n\r\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(userId));\r\n });\r\n });\r\n \r\n return result;\r\n }\r\n\r\n private startLocating(){\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.userLocationCoords = {\r\n lat: location.coords.latitude,\r\n long: location.coords.longitude\r\n };\r\n\r\n let uri = \"https://nominatim.openstreetmap.org/reverse\";\r\n uri += \"?lat=\"+location.coords.latitude;\r\n uri += \"&lon=\"+location.coords.longitude;\r\n uri += \"&format=json\";\r\n uri += \"&addressdetails=1\";\r\n uri += \"&accept-language=en\";\r\n fetch(uri)\r\n .then((response) => response.json())\r\n .then((response: OpenStreetMapInterface) => {\r\n this.userLocationAddress = response.display_name;\r\n this.groupLocationInputField.setValueSilently(response.display_name);\r\n });\r\n }, (error) => {\r\n if(error instanceof GeolocationPositionError) {\r\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\r\n } else {\r\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { IS_APPLE, IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport type { SearchSuperContext } from \"./appSearchSuper.\";\r\nimport { copy, deepEqual } from \"../helpers/object\";\r\nimport { DocumentAttribute, Message, MessageMedia, PhotoSize } from \"../layer\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport I18n from \"../lib/langPack\";\r\nimport SearchListLoader from \"../helpers/searchListLoader\";\r\nimport { onMediaLoad } from \"../helpers/files\";\r\n\r\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\r\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\r\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\r\n\r\nexport type MediaItem = {mid: number, peerId: PeerId};\r\n\r\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\r\n\r\nconst SHOULD_USE_SAFARI_FIX = (() => {\r\n try {\r\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\r\n } catch(err) {\r\n return false;\r\n }\r\n})();\r\n\r\nconst SEEK_OFFSET = 10;\r\n\r\nexport type MediaSearchContext = SearchSuperContext & Partial<{\r\n isScheduled: boolean,\r\n useSearch: boolean\r\n}>;\r\n\r\ntype MediaDetails = {\r\n peerId: PeerId, \r\n mid: number, \r\n docId: DocId, \r\n clean?: boolean,\r\n isScheduled?: boolean, \r\n isSingle?: boolean\r\n};\r\n\r\nclass AppMediaPlaybackController {\r\n private container: HTMLElement;\r\n private media: Map> = new Map();\r\n private scheduled: AppMediaPlaybackController['media'] = new Map();\r\n private mediaDetails: Map = new Map();\r\n private playingMedia: HTMLMediaElement;\r\n\r\n private waitingMediaForLoad: Map>> = new Map();\r\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\r\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\r\n \r\n public willBePlayedMedia: HTMLMediaElement;\r\n private searchContext: MediaSearchContext;\r\n\r\n private listLoader: SearchListLoader;\r\n\r\n public volume: number;\r\n public muted: boolean;\r\n public playbackRate: number;\r\n private _volume = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private lockedSwitchers: boolean;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n //this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\r\n this.container.style.cssText = 'display: none;';\r\n document.body.append(this.container);\r\n\r\n if(navigator.mediaSession) {\r\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\r\n play: this.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\r\n };\r\n\r\n for(const action in actions) {\r\n try {\r\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\r\n } catch(err) {\r\n console.warn('MediaSession action is not supported:', action);\r\n }\r\n }\r\n }\r\n\r\n rootScope.addEventListener('document_downloaded', (doc) => {\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n for(const media of set) {\r\n this.onMediaDocumentLoad(media);\r\n }\r\n }\r\n });\r\n\r\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\r\n const keys = [\r\n 'volume' as const, \r\n 'muted' as const, \r\n 'playbackRate' as const\r\n ];\r\n keys.forEach(key => {\r\n const _key = ('_' + key) as `_${typeof key}`;\r\n properties[key] = {\r\n get: () => this[_key],\r\n set: (value: number | boolean) => {\r\n if(this[_key] === value) {\r\n return;\r\n }\r\n\r\n // @ts-ignore\r\n this[_key] = value;\r\n if(this.playingMedia) {\r\n // @ts-ignore\r\n this.playingMedia[key] = value;\r\n }\r\n\r\n this.dispatchPlaybackParams();\r\n }\r\n };\r\n });\r\n Object.defineProperties(this, properties);\r\n }\r\n\r\n private dispatchPlaybackParams() {\r\n const {volume, muted, playbackRate} = this;\r\n rootScope.dispatchEvent('media_playback_params', {\r\n volume, muted, playbackRate\r\n });\r\n }\r\n\r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekForward = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\r\n }\r\n };\r\n\r\n public seekTo = (details: MediaSessionActionDetails) => {\r\n const media = this.playingMedia;\r\n if(media) {\r\n media.currentTime = details.seekTime;\r\n }\r\n };\r\n\r\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\r\n const {peerId, mid} = message;\r\n\r\n const isScheduled = !!message.pFlags.is_scheduled;\r\n const s = isScheduled ? this.scheduled : this.media;\r\n let storage = s.get(message.peerId);\r\n if(!storage) {\r\n s.set(message.peerId, storage = new Map());\r\n }\r\n\r\n let media = storage.get(mid);\r\n if(media) {\r\n return media;\r\n }\r\n\r\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\r\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\r\n //const source = document.createElement('source');\r\n //source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\r\n\r\n if(doc.type === 'round') {\r\n media.setAttribute('playsinline', 'true');\r\n //media.muted = true;\r\n }\r\n\r\n const details: MediaDetails = {\r\n peerId,\r\n mid,\r\n docId: doc.id,\r\n clean,\r\n isScheduled: message.pFlags.is_scheduled\r\n };\r\n\r\n this.mediaDetails.set(media, details);\r\n\r\n //media.autoplay = true;\r\n media.volume = 1;\r\n //media.append(source);\r\n\r\n this.container.append(media);\r\n\r\n media.addEventListener('play', this.onPlay);\r\n media.addEventListener('pause', this.onPause);\r\n media.addEventListener('ended', this.onEnded);\r\n\r\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\r\n media.addEventListener('timeupdate', () => {\r\n appMessagesManager.readMessages(peerId, [mid]);\r\n }, {once: true});\r\n }\r\n \r\n /* const onError = (e: Event) => {\r\n //console.log('appMediaPlaybackController: video onError', e);\r\n\r\n if(this.nextMid === mid) {\r\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\r\n if(this.nextMid && storage[this.nextMid]) {\r\n storage[this.nextMid].play();\r\n }\r\n });\r\n }\r\n };\r\n\r\n media.addEventListener('error', onError); */\r\n\r\n const deferred = deferredPromise();\r\n if(autoload) {\r\n deferred.resolve();\r\n } else {\r\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n let waitingStorage = w.get(peerId);\r\n if(!waitingStorage) {\r\n w.set(peerId, waitingStorage = new Map());\r\n }\r\n\r\n waitingStorage.set(mid, deferred);\r\n }\r\n\r\n deferred.then(() => {\r\n //media.autoplay = true;\r\n //console.log('will set media url:', media, doc, doc.type, doc.url);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(doc.supportsStreaming || cacheContext.url) {\r\n this.onMediaDocumentLoad(media);\r\n } else {\r\n let set = this.waitingDocumentsForLoad[doc.id];\r\n if(!set) {\r\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\r\n }\r\n\r\n set.add(media);\r\n appDocsManager.downloadDoc(doc);\r\n }\r\n }/* , onError */);\r\n \r\n return media;\r\n }\r\n\r\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\r\n return s?.get(mid);\r\n }\r\n\r\n private onMediaDocumentLoad = (media: HTMLMediaElement) => {\r\n const details = this.mediaDetails.get(media);\r\n const doc = appDocsManager.getDoc(details.docId);\r\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\r\n this.handleSafariStreamable(media);\r\n }\r\n\r\n // setTimeout(() => {\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n media.src = cacheContext.url;\r\n // }, doc.supportsStreaming ? 500e3 : 0);\r\n\r\n const set = this.waitingDocumentsForLoad[doc.id];\r\n if(set) {\r\n set.delete(media);\r\n\r\n if(!set.size) {\r\n delete this.waitingDocumentsForLoad[doc.id];\r\n }\r\n }\r\n };\r\n\r\n // safari подгрузит последний чанк и песня включится,\r\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\r\n private handleSafariStreamable(media: HTMLMediaElement) {\r\n media.addEventListener('play', () => {\r\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\r\n return;\r\n } */\r\n\r\n //media.volume = 0;\r\n const currentTime = media.currentTime;\r\n //this.setSafariBuffering(media, true);\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = media.duration - 1;\r\n\r\n media.addEventListener('progress', () => {\r\n media.currentTime = currentTime;\r\n //media.volume = 1;\r\n //this.setSafariBuffering(media, false);\r\n\r\n if(!media.paused) {\r\n media.play()/* .catch(() => {}) */;\r\n }\r\n }, {once: true});\r\n }, {once: true});\r\n }/* , {once: true} */);\r\n }\r\n\r\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\r\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\r\n const storage = w.get(peerId);\r\n if(!storage) {\r\n return;\r\n }\r\n\r\n const promise = storage.get(mid);\r\n if(promise) {\r\n promise.resolve();\r\n storage.delete(mid);\r\n\r\n if(!storage.size) {\r\n w.delete(peerId);\r\n }\r\n }\r\n }\r\n \r\n /**\r\n * Only for audio\r\n */\r\n public isSafariBuffering(media: HTMLMediaElement) {\r\n /// @ts-ignore\r\n return !!media.safariBuffering;\r\n }\r\n\r\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\r\n // @ts-ignore\r\n media.safariBuffering = value;\r\n }\r\n\r\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\r\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\r\n\r\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\r\n \r\n const artwork: MediaImage[] = [];\r\n\r\n const isVoice = doc.type === 'voice' || doc.type === 'round';\r\n let title = '', artist = '';\r\n\r\n if(doc.thumbs?.length) {\r\n const size = doc.thumbs[doc.thumbs.length - 1];\r\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\r\n const cacheContext = appDownloadManager.getCacheContext(doc, size.type);\r\n\r\n if(cacheContext.url) {\r\n artwork.push({\r\n src: cacheContext.url,\r\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n const download = appPhotosManager.preloadPhoto(doc, size);\r\n download.then(() => {\r\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\r\n return;\r\n }\r\n\r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n } else if(isVoice) {\r\n const peerId = message.fromId || message.peerId;\r\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\r\n if(peerPhoto) {\r\n const result = appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\r\n if(result.cached) {\r\n const url = await result.loadPromise;\r\n artwork.push({\r\n src: url,\r\n sizes: '160x160',\r\n type: 'image/jpeg'\r\n });\r\n } else {\r\n result.loadPromise.then((url) => {\r\n if(this.playingMedia !== playingMedia || !url) {\r\n return;\r\n }\r\n \r\n this.setNewMediadata(message);\r\n });\r\n }\r\n }\r\n\r\n title = appPeersManager.getPeerTitle(peerId, true, false);\r\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\r\n }\r\n\r\n if(!isVoice) {\r\n const attribute = doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\r\n title = attribute && attribute.title || doc.file_name;\r\n artist = attribute && attribute.performer;\r\n }\r\n\r\n if(!artwork.length) {\r\n if(IS_APPLE) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon-precomposed.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n } else {\r\n artwork.push({\r\n src: `assets/img/apple-touch-icon.png`,\r\n sizes: '180x180',\r\n type: 'image/png'\r\n });\r\n }\r\n } else {\r\n [72, 96, 144, 192, 256, 384, 512].forEach(size => {\r\n const sizes = `${size}x${size}`;\r\n artwork.push({\r\n src: `assets/img/android-chrome-${sizes}.png`,\r\n sizes,\r\n type: 'image/png'\r\n });\r\n });\r\n }\r\n }\r\n\r\n const metadata = new MediaMetadata({\r\n title,\r\n artist,\r\n artwork\r\n });\r\n\r\n navigator.mediaSession.metadata = metadata;\r\n }\r\n\r\n private getMessageByMedia(media: HTMLMediaElement) {\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n const message = details.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\r\n return message;\r\n }\r\n\r\n private onPlay = (e?: Event) => {\r\n const media = e.target as HTMLMediaElement;\r\n const details = this.mediaDetails.get(media);\r\n const {peerId, mid} = details;\r\n\r\n //console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\r\n\r\n const message = this.getMessageByMedia(media);\r\n\r\n const previousMedia = this.playingMedia;\r\n if(previousMedia !== media) {\r\n this.stop();\r\n\r\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\r\n if(!this.listLoader.current || !verify(this.listLoader.current)) {\r\n let idx = this.listLoader.previous.findIndex(verify);\r\n let jumpLength: number;\r\n if(idx !== -1) {\r\n jumpLength = -(this.listLoader.previous.length - idx);\r\n } else {\r\n idx = this.listLoader.next.findIndex(verify);\r\n if(idx !== -1) {\r\n jumpLength = idx + 1;\r\n }\r\n }\r\n \r\n if(idx !== -1) {\r\n if(jumpLength) {\r\n this.listLoader.go(jumpLength, false);\r\n }\r\n } else {\r\n this.setTargets({peerId, mid});\r\n }\r\n }\r\n\r\n this.setMedia(media, message);\r\n }\r\n\r\n // audio_pause не успеет сработать без таймаута\r\n setTimeout(() => {\r\n rootScope.dispatchEvent('media_play', {doc: appMessagesManager.getMediaFromMessage(message), message, media});\r\n }, 0);\r\n };\r\n\r\n private onPause = (e?: Event) => {\r\n /* const target = e.target as HTMLMediaElement;\r\n if(!isInDOM(target)) {\r\n this.container.append(target);\r\n target.play();\r\n return;\r\n } */\r\n\r\n rootScope.dispatchEvent('media_pause');\r\n };\r\n\r\n private onEnded = (e?: Event) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n\r\n this.onPause(e);\r\n\r\n //console.log('on media end');\r\n\r\n if(!this.next()) {\r\n this.stop();\r\n rootScope.dispatchEvent('media_stop');\r\n }\r\n };\r\n\r\n public toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.pause();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public play = () => {\r\n return this.toggle(true);\r\n };\r\n\r\n public pause = () => {\r\n return this.toggle(false);\r\n };\r\n\r\n public stop = () => {\r\n const media = this.playingMedia;\r\n if(!media) {\r\n return false;\r\n }\r\n\r\n if(!media.paused) {\r\n media.pause();\r\n }\r\n\r\n media.currentTime = 0;\r\n simulateEvent(media, 'ended');\r\n\r\n const details = this.mediaDetails.get(media);\r\n if(details?.clean) {\r\n media.src = '';\r\n const peerId = details.peerId;\r\n const s = details.isScheduled ? this.scheduled : this.media;\r\n const storage = s.get(peerId);\r\n if(storage) {\r\n storage.delete(details.mid);\r\n \r\n if(!storage.size) {\r\n s.delete(peerId);\r\n }\r\n }\r\n \r\n media.remove();\r\n\r\n this.mediaDetails.delete(media);\r\n }\r\n\r\n this.playingMedia = undefined;\r\n\r\n return true;\r\n };\r\n\r\n public playItem = (item: MediaItem) => {\r\n const {peerId, mid} = item;\r\n const isScheduled = this.searchContext.isScheduled;\r\n const media = this.getMedia(peerId, mid, isScheduled);\r\n\r\n /* if(isSafari) {\r\n media.autoplay = true;\r\n } */\r\n\r\n media.play();\r\n \r\n setTimeout(() => {\r\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\r\n }, 0);\r\n };\r\n\r\n public next = () => {\r\n return !this.lockedSwitchers && this.listLoader.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n if(media && (media.currentTime > 5 || !this.listLoader.previous.length)) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return !this.lockedSwitchers && this.listLoader.go(-1);\r\n };\r\n\r\n public willBePlayed(media: HTMLMediaElement) {\r\n this.willBePlayedMedia = media;\r\n }\r\n\r\n public setSearchContext(context: MediaSearchContext) {\r\n if(deepEqual(this.searchContext, context)) {\r\n return false;\r\n }\r\n\r\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\r\n return true;\r\n }\r\n\r\n public getSearchContext() {\r\n return this.searchContext;\r\n }\r\n\r\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\r\n if(!this.listLoader) {\r\n this.listLoader = new SearchListLoader({\r\n loadCount: 10,\r\n loadWhenLeft: 5,\r\n processItem: (message: Message.message) => {\r\n this.addMedia(message, false);\r\n return {peerId: message.peerId, mid: message.mid};\r\n },\r\n onJump: (item, older) => {\r\n this.playItem(item);\r\n },\r\n onEmptied: () => {\r\n rootScope.dispatchEvent('media_stop');\r\n this.stop();\r\n }\r\n });\r\n } else {\r\n this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.listLoader.load(false);\r\n }\r\n\r\n public setMedia(media: HTMLMediaElement, message: Message.message) {\r\n this.playingMedia = media;\r\n this.playingMedia.volume = this.volume;\r\n this.playingMedia.muted = this.muted;\r\n this.playingMedia.playbackRate = this.playbackRate;\r\n\r\n if('mediaSession' in navigator) {\r\n this.setNewMediadata(message);\r\n }\r\n }\r\n\r\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\r\n const playingMedia = this.playingMedia;\r\n\r\n const wasPlaying = this.pause();\r\n\r\n this.willBePlayed(undefined);\r\n if(media) this.setMedia(media, message);\r\n else this.playingMedia = undefined;\r\n this.toggleSwitchers(false);\r\n\r\n return () => {\r\n this.toggleSwitchers(true);\r\n\r\n if(playingMedia) {\r\n if(this.mediaDetails.get(playingMedia)) {\r\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\r\n } else {\r\n this.next() || this.previous();\r\n }\r\n }\r\n\r\n if(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\r\n this.play();\r\n }\r\n };\r\n }\r\n\r\n public toggleSwitchers(enabled: boolean) {\r\n this.lockedSwitchers = !enabled;\r\n }\r\n}\r\n\r\nconst appMediaPlaybackController = new AppMediaPlaybackController();\r\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\r\nexport default appMediaPlaybackController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\r\n\r\nexport default function attachGrabListeners(element: HTMLElement, \r\n onStart: (position: GrabEvent) => void, \r\n onMove: (position: GrabEvent) => void, \r\n onEnd?: (position: GrabEvent) => void) {\r\n // * Mouse\r\n const onMouseMove = (event: MouseEvent) => {\r\n onMove({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseUp = (event: MouseEvent) => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\r\n };\r\n\r\n const onMouseDown = (event: MouseEvent) => {\r\n if(event.button !== 0) {\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n return;\r\n }\r\n\r\n onStart({x: event.pageX, y: event.pageY, event});\r\n onMouseMove(event);\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp, {once: true});\r\n };\r\n\r\n element.addEventListener('mousedown', onMouseDown, {once: true});\r\n\r\n // * Touch\r\n const onTouchMove = (event: TouchEvent) => {\r\n event.preventDefault();\r\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchEnd = (event: TouchEvent) => {\r\n document.removeEventListener('touchmove', onTouchMove);\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n };\r\n\r\n const onTouchStart = (event: TouchEvent) => {\r\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\r\n onTouchMove(event);\r\n\r\n document.addEventListener('touchmove', onTouchMove, {passive: false});\r\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\r\n };\r\n\r\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\r\n\r\n return () => {\r\n element.removeEventListener('mousedown', onMouseDown);\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n\r\n element.removeEventListener('touchstart', onTouchStart);\r\n document.removeEventListener('touchmove', onTouchMove);\r\n document.removeEventListener('touchend', onTouchEnd);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { clamp } from \"../helpers/number\";\r\nimport attachGrabListeners, { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\r\nimport { safeAssign } from \"../helpers/object\";\r\n\r\nexport default class RangeSelector {\r\n public container: HTMLDivElement;\r\n protected filled: HTMLDivElement;\r\n protected seek: HTMLInputElement;\r\n\r\n public mousedown = false;\r\n protected rect: DOMRect;\r\n protected _removeListeners: () => void;\r\n\r\n private events: Partial<{\r\n //onMouseMove: ProgressLine['onMouseMove'],\r\n onMouseDown: RangeSelector['onMouseDown'],\r\n onMouseUp: RangeSelector['onMouseUp'],\r\n onScrub: (value: number) => void\r\n }> = {};\r\n\r\n protected decimals: number;\r\n\r\n protected step: number;\r\n protected min: number;\r\n protected max: number;\r\n protected withTransition = false;\r\n protected useTransform = false;\r\n protected vertical = false;\r\n\r\n constructor(\r\n options: {\r\n step: RangeSelector['step'],\r\n min: RangeSelector['min'],\r\n max: RangeSelector['max'],\r\n withTransition?: RangeSelector['withTransition'],\r\n useTransform?: RangeSelector['useTransform'],\r\n vertical?: RangeSelector['vertical']\r\n }, \r\n value = 0\r\n ) {\r\n safeAssign(this, options);\r\n\r\n this.container = document.createElement('div');\r\n this.container.classList.add('progress-line');\r\n\r\n // there is no sense in using transition with transform, because it is updating every frame\r\n if(this.useTransform) {\r\n this.container.classList.add('use-transform');\r\n } else if(this.withTransition) {\r\n this.container.classList.add('with-transition');\r\n }\r\n\r\n this.filled = document.createElement('div');\r\n this.filled.classList.add('progress-line__filled');\r\n\r\n const seek = this.seek = document.createElement('input');\r\n seek.classList.add('progress-line__seek');\r\n //seek.setAttribute('max', '0');\r\n seek.type = 'range';\r\n seek.step = '' + this.step;\r\n seek.min = '' + this.min;\r\n seek.max = '' + this.max;\r\n seek.value = '' + value;\r\n\r\n if(value) {\r\n this.setProgress(value);\r\n }\r\n\r\n const stepStr = '' + this.step;\r\n const index = stepStr.indexOf('.');\r\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\r\n\r\n //this.setListeners();\r\n\r\n this.container.append(this.filled, seek);\r\n }\r\n\r\n get value() {\r\n return +this.seek.value;\r\n }\r\n\r\n public setHandlers(events: RangeSelector['events']) {\r\n this.events = events;\r\n }\r\n\r\n protected onMouseMove = (event: GrabEvent) => {\r\n this.scrub(event);\r\n };\r\n\r\n protected onMouseDown = (event: GrabEvent) => {\r\n this.rect = this.container.getBoundingClientRect();\r\n this.mousedown = true;\r\n this.scrub(event);\r\n this.container.classList.add('is-focused');\r\n this.events?.onMouseDown && this.events.onMouseDown(event);\r\n };\r\n\r\n protected onMouseUp = (event: GrabEvent) => {\r\n this.mousedown = false;\r\n this.container.classList.remove('is-focused');\r\n this.events?.onMouseUp && this.events.onMouseUp(event);\r\n };\r\n\r\n public setListeners() {\r\n this.seek.addEventListener('input', this.onInput);\r\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\r\n }\r\n\r\n public onInput = () => {\r\n const value = +this.seek.value;\r\n this.setFilled(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n };\r\n\r\n public setProgress(value: number) {\r\n this.seek.value = '' + value;\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public addProgress(value: number) {\r\n this.seek.value = '' + (+this.seek.value + value);\r\n this.setFilled(+this.seek.value); // clamp\r\n }\r\n\r\n public setFilled(value: number) {\r\n let percents = (value - this.min) / (this.max - this.min);\r\n percents = clamp(percents, 0, 1);\r\n \r\n // using scaleX and width even with vertical because it will be rotated\r\n if(this.useTransform) {\r\n this.filled.style.transform = `scaleX(${percents})`;\r\n } else {\r\n this.filled.style.width = (percents * 100) + '%';\r\n }\r\n }\r\n\r\n protected scrub(event: GrabEvent) {\r\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\r\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\r\n\r\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\r\n\r\n if((value - this.min) < ((this.max - this.min) / 2)) {\r\n value -= this.step / 10;\r\n }\r\n \r\n value = +value.toFixed(this.decimals);\r\n value = clamp(value, this.min, this.max);\r\n\r\n //this.seek.value = '' + value;\r\n //this.onInput();\r\n\r\n this.setProgress(value);\r\n this.events?.onScrub && this.events.onScrub(value);\r\n\r\n return value;\r\n }\r\n\r\n public removeListeners() {\r\n if(this._removeListeners) {\r\n this._removeListeners();\r\n this._removeListeners = null;\r\n }\r\n\r\n this.seek.removeEventListener('input', this.onInput);\r\n \r\n this.events = {};\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport { ripple } from \"./ripple\";\n\nexport type ButtonMenuItemOptions = {\n icon?: string, \n text?: LangPackKey, \n regularText?: string, \n onClick: (e: MouseEvent | TouchEvent) => void | boolean, \n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean\n /* , cancelEvent?: true */\n};\n\nconst ButtonMenuItem = (options: ButtonMenuItemOptions) => {\n if(options.element) return options.element;\n\n const {icon, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item' + (icon ? ' tgico-' + icon : '');\n ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text) : document.createElement('span');\n if(options.regularText) textElement.innerHTML = options.regularText;\n }\n \n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n closeBtnMenu();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n return options.element = el;\n};\n\nconst ButtonMenu = (buttons: ButtonMenuItemOptions[], listenerSetter?: ListenerSetter) => {\n const el = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach(b => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n\n el.append(...items);\n\n return el;\n};\n\nexport default ButtonMenu;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { AttachClickOptions, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport ButtonIcon from \"./buttonIcon\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\r\nimport { closeBtnMenu, openBtnMenu } from \"./misc\";\r\n\r\nconst ButtonMenuToggle = (options: Partial<{noRipple: true, onlyMobile: true, listenerSetter: ListenerSetter, asDiv: boolean}> = {}, direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right', buttons: ButtonMenuItemOptions[], onOpen?: (e: Event) => void) => {\r\n options.asDiv = true;\r\n const button = ButtonIcon('more btn-menu-toggle', options);\r\n\r\n const btnMenu = ButtonMenu(buttons, options.listenerSetter);\r\n btnMenu.classList.add(direction);\r\n ButtonMenuToggleHandler(button, onOpen, options);\r\n button.append(btnMenu);\r\n return button;\r\n};\r\n\r\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\r\nconst ButtonMenuToggleHandler = (el: HTMLElement, onOpen?: (e: Event) => void, options?: AttachClickOptions) => {\r\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\r\n\r\n //console.trace('ButtonMenuToggleHandler attach', el, onOpen, options);\r\n add(CLICK_EVENT_NAME, (e: Event) => {\r\n //console.log('ButtonMenuToggleHandler click', e);\r\n if(!el.classList.contains('btn-menu-toggle')) return false;\r\n\r\n //window.removeEventListener('mousemove', onMouseMove);\r\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\r\n cancelEvent(e);\r\n\r\n if(el.classList.contains('menu-open')) {\r\n closeBtnMenu();\r\n } else {\r\n onOpen && onOpen(e);\r\n openBtnMenu(openedMenu);\r\n }\r\n });\r\n};\r\n\r\nexport { ButtonMenuToggleHandler };\r\nexport default ButtonMenuToggle;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport EventListenerBase from \"../eventListenerBase\";\nimport ListenerSetter from \"../listenerSetter\";\nimport { safeAssign } from \"../object\";\nimport findUpClassName from \"./findUpClassName\";\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected showControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n\n constructor() {\n super(false);\n this.showControlsTimeout = 0;\n }\n \n public setup(options: {\n element: HTMLElement, \n listenerSetter: ListenerSetter, \n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', () => {\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n \n this.hideControls();\n });\n }\n }\n\n public hideControls = () => {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n \n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n \n public showControls = (setHideTimeout = true) => {\n if(this.showControlsTimeout) {\n clearTimeout(this.showControlsTimeout);\n this.showControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.showControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\n\nexport class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000, \n min: 0, \n max: 1, \n withTransition, \n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n //this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n let r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n //console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n //console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n //this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n\nexport class VolumeSelector extends RangeSelector {\n public btn: HTMLElement;\n protected volumeSvg: HTMLElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01, \n min: 0, \n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n //console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n },\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n this.btn = document.createElement('div');\n this.btn.classList.add('player-volume');\n\n this.btn.innerHTML = `\n \n `;\n this.btn.classList.add('btn-icon');\n this.volumeSvg = this.btn.firstElementChild as HTMLElement;\n\n this.btn.append(this.container);\n\n attachClickEvent(this.volumeSvg, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(rootScope)('media_playback_params', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n private setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n if(!volume || muted) {\n d = `M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z`;\n } else if(volume > .5) {\n d = `M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z`;\n } else if(volume > 0 && volume < .25) {\n d = `M7 9v6h4l5 5V4l-5 5H7z`;\n } else {\n d = `M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z`;\n }\n\n try {\n this.volumeSvg.innerHTML = ``;\n } catch(err) {}\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n\nexport default class VideoPlayer extends ControlsHover {\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n constructor(protected video: HTMLVideoElement, play = false, streamable = false, duration?: number) {\n super();\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper, \n listenerSetter: this.listenerSetter, \n canHideControls: () => {\n return !this.video.paused;\n },\n showOnLeaveToClassName: 'media-viewer-caption'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n // this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n //(this.wrapper.querySelector('.toggle') as HTMLButtonElement).click();\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n \n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n \n if(skin === 'default') {\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.innerHTML = String(video.duration | 0).toHHMMSS();\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n listenerSetter.add(button)('click', () => {\n this.togglePlay();\n });\n });\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('click', () => {\n this.togglePlay();\n });\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && code === 'Equal') {\n appMediaPlaybackController.playbackRate += .25;\n } else if(e.altKey && code === 'Minus') {\n appMediaPlaybackController.playbackRate -= .25;\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n \n /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\n }); */\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n listenerSetter.add(fullScreenButton)('click', () => {\n this.toggleFullScreen();\n });\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.innerHTML = String(video.currentTime | 0).toHHMMSS();\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n \n if(video.duration || initDuration) {\n timeDuration.innerHTML = String(Math.round(video.duration || initDuration)).toHHMMSS();\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.innerHTML = String(Math.round(video.duration)).toHHMMSS();\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0] = [0.25, 0.5, 1, 1.25, 1.5, 2].map((rate) => {\n return { \n regularText: rate === 1 ? 'Normal' : '' + rate, \n onClick: () => {\n this.video.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenu(buttons);\n const settingsButton = this.wrapper.querySelector('.settings') as HTMLElement;\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler(settingsButton);\n settingsButton.append(btnMenu);\n }\n \n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n \n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n \n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n \n cancelFullScreen();\n }\n }\n \n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n }\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\nimport { fastRaf } from \"../schedulers\";\nimport throttleWith from \"./throttleWith\";\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport { AnyToVoidFunction } from \"../../types\";\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if (!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\nimport { wrapPhoto } from \"./wrappers\";\nimport ProgressivePreloader from \"./preloader\";\nimport { MediaProgressLine } from \"../lib/mediaPlayer\";\nimport appMediaPlaybackController, { MediaItem, MediaSearchContext } from \"./appMediaPlaybackController\";\nimport { DocumentAttribute, Message } from \"../layer\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../environment/userAgent\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../lib/rootScope\";\nimport './middleEllipsis';\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport ListenerSetter, { Listener } from \"../helpers/listenerSetter\";\nimport noop from \"../helpers/noop\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { joinElementsWith } from \"../lib/langPack\";\nimport { MiddleEllipsisElement } from \"./middleEllipsis\";\nimport htmlToSpan from \"../helpers/dom/htmlToSpan\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport { clamp, formatBytes } from \"../helpers/number\";\nimport throttleWithRaf from \"../helpers/schedulers/throttleWithRaf\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach(mid => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach(elem => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = appMessagesManager.getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n const barWidth = 2;\n const barMargin = 2; //mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; //mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const duration = doc.duration;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.classList.add('audio-waveform');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(svg, timeDiv);\n\n let waveform = (doc.attributes.find(attribute => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n //console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n\t\t\tif(sumI < (barCount + 1) / 2) {\n\t\t\t\tif(maxValue < value) maxValue = value;\n }\n \n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n \n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n svg.insertAdjacentHTML('beforeend', html);\n const rects = Array.from(svg.children) as HTMLElement[];\n\n let progress = audioEl.querySelector('.audio-waveform') as HTMLDivElement;\n \n const onLoad = () => {\n let audio = audioEl.audio;\n\n const onTimeUpdate = () => {\n const lastIndex = audio.currentTime === audio.duration ? 0 : Math.ceil(audio.currentTime / audio.duration * barCount);\n \n //svg.children[lastIndex].setAttributeNS(null, 'fill', '#000');\n //svg.children[lastIndex].classList.add('active'); #Иногда пропускает полоски..\n rects.forEach((node, idx) => node.classList.toggle('active', idx < lastIndex));\n //++lastIndex;\n //console.log('lastIndex:', lastIndex, audio.currentTime);\n //}, duration * 1000 / svg.childElementCount | 0/* 63 * duration / 10 */);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n })\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n \n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n \n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n \n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n \n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nfunction wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(message);\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n \n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(appMessagesManager.wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n if(isVoice) {\n middleEllipsisEl.append(appMessagesManager.wrapSenderToPeer(message));\n } else {\n middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(appMessagesManager.wrapSentTime(message));\n }\n \n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map(s => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map(element => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public render() {\n this.classList.add('audio');\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc: MyDocument = appMessagesManager.getMediaFromMessage(this.message);\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploading = isOutgoing && this.preloader;\n\n const durationStr = String(doc.duration | 0).toHHMMSS();\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploading) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = isVoice ? wrapVoiceMessage(this) : wrapAudio(this);\n \n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n \n const getTimeStr = () => String(audio.currentTime | 0).toHHMMSS() + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID, \n inputFilter: {_: 'inputMessagesFilterEmpty'}, \n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLImageElement[] = [];\n const wrapped = wrapPhoto({\n photo: doc, \n message: null, \n container: toggle, \n boxWidth: 48, \n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach(img => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n onLoad(doc.type !== 'audio' && !this.noAutoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n \n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDocsManager.downloadDoc(doc);\n \n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n this.append(downloadDiv);\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n \n //setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n //}, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(doc.type !== 'audio' && !this.noAutoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploading) {\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n //onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n if(this.isConnected) {\n return;\n }\n \n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n\n this.preloader = null;\n }\n}\n\ncustomElements.define(\"audio-element\", AudioElement);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class DivAndCaption {\r\n public container: HTMLElement;\r\n public border: HTMLElement;\r\n public content: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLElement;\r\n\r\n constructor(protected className: string, public fill?: T) {\r\n this.container = document.createElement('div');\r\n this.container.className = className;\r\n\r\n this.border = document.createElement('div');\r\n this.border.classList.add(className + '-border');\r\n \r\n this.content = document.createElement('div');\r\n this.content.classList.add(className + '-content');\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add(className + '-title');\r\n this.title.setAttribute('dir', 'auto');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add(className + '-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n\r\n this.content.append(this.title, this.subtitle);\r\n this.container.append(this.border, this.content);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport appImManager, { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { wrapPhoto, wrapSticker } from \"../wrappers\";\r\n\r\nconst MEDIA_SIZE = 32;\r\n\r\nexport function wrapReplyDivAndCaption(options: {\r\n title: string | HTMLElement | DocumentFragment,\r\n titleEl: HTMLElement,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleEl: HTMLElement,\r\n message: any,\r\n mediaEl: HTMLElement,\r\n loadPromises?: Promise[]\r\n}) {\r\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises} = options;\r\n if(title !== undefined) {\r\n if(typeof(title) === 'string') {\r\n title = limitSymbols(title, 140);\r\n title = RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n replaceContent(titleEl, title);\r\n }\r\n\r\n if(!loadPromises) {\r\n loadPromises = [];\r\n }\r\n\r\n let media = message && message.media;\r\n let setMedia = false, isRound = false;\r\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\r\n let middleware: () => boolean;\r\n if(media && mediaEl) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message, undefined, undefined, undefined, undefined, true));\r\n\r\n //console.log('wrap reply', media);\r\n\r\n if(media.webpage) {\r\n media = media.webpage;\r\n }\r\n \r\n if(media.photo || (media.document && media.document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(media.document.type) !== -1) */) {\r\n middleware = appImManager.chat.bubbles.getMiddleware();\r\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\r\n\r\n if(media.document?.type === 'sticker') {\r\n setMedia = true;\r\n wrapSticker({\r\n doc: media.document,\r\n div: mediaEl,\r\n lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //onlyThumb: media.document.sticker === 2,\r\n width: MEDIA_SIZE,\r\n height: MEDIA_SIZE,\r\n middleware,\r\n loadPromises\r\n });\r\n } else {\r\n const photo = media.photo || media.document;\r\n\r\n isRound = photo.type === 'round';\r\n\r\n try {\r\n wrapPhoto({\r\n photo,\r\n container: mediaEl,\r\n boxWidth: MEDIA_SIZE,\r\n boxHeight: MEDIA_SIZE,\r\n size: appPhotosManager.choosePhotoSize(photo, MEDIA_SIZE, MEDIA_SIZE),\r\n middleware,\r\n lazyLoadQueue,\r\n noBlur: true,\r\n withoutPreloader: true,\r\n loadPromises\r\n });\r\n setMedia = true;\r\n } catch(err) {\r\n\r\n }\r\n }\r\n }\r\n } else {\r\n if(message) {\r\n subtitleEl.textContent = '';\r\n subtitleEl.append(appMessagesManager.wrapMessageForReply(message));\r\n } else {\r\n if(typeof(subtitle) === 'string') {\r\n subtitle = limitSymbols(subtitle, 140);\r\n subtitle = RichTextProcessor.wrapEmojiText(subtitle);\r\n }\r\n\r\n replaceContent(subtitleEl, subtitle || '');\r\n }\r\n }\r\n\r\n Promise.all(loadPromises).then(() => {\r\n if(middleware && !middleware()) return;\r\n mediaChildren.forEach(child => child.remove());\r\n\r\n if(mediaEl) {\r\n mediaEl.classList.toggle('is-round', isRound);\r\n }\r\n });\r\n\r\n return setMedia;\r\n}\r\n\r\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void> {\r\n private mediaEl: HTMLElement;\r\n\r\n constructor(protected className: string) {\r\n super(className, (title, subtitle = '', message?) => {\r\n if(!this.mediaEl) {\r\n this.mediaEl = document.createElement('div');\r\n this.mediaEl.classList.add(this.className + '-media');\r\n }\r\n\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title,\r\n titleEl: this.title,\r\n subtitle,\r\n subtitleEl: this.subtitle,\r\n mediaEl: this.mediaEl,\r\n message\r\n });\r\n \r\n this.container.classList.toggle('is-media', isMediaSet);\r\n if(isMediaSet) {\r\n this.content.prepend(this.mediaEl);\r\n } else {\r\n this.mediaEl.remove();\r\n }\r\n });\r\n }\r\n}\r\n","/*\r\nThis file is part of Telegram Desktop,\r\nthe official desktop application for the Telegram messaging service.\r\nFor license and copyright information please follow this link:\r\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\r\n*/\r\n\r\nimport { accumulate } from \"../helpers/array\";\r\nimport { clamp } from \"../helpers/number\";\r\n\r\ntype Size = {w: number, h: number};\r\nexport type GroupMediaLayout = {\r\n geometry: {\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number\r\n },\r\n sides: number\r\n};\r\ntype Attempt = {\r\n lineCounts: number[],\r\n heights: number[]\r\n};\r\nexport const RectPart = {\r\n None: 0,\r\n Top: 1,\r\n Right: 2,\r\n Bottom: 4,\r\n Left: 8\r\n};\r\n\r\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\r\nexport class Layouter {\r\n private count: number;\r\n private ratios: number[];\r\n private proportions: string;\r\n private averageRatio: number;\r\n private maxSizeRatio: number;\r\n\r\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\r\n this.count = sizes.length;\r\n this.ratios = Layouter.countRatios(sizes);\r\n this.proportions = Layouter.countProportions(this.ratios);\r\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\r\n this.maxSizeRatio = maxWidth / this.maxHeight;\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n if(!this.count) return [];\r\n //else if(this.count === 1) return this.layoutOne();\r\n\r\n if(this.count >= 5 || this.ratios.find(r => r > 2)) {\r\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\r\n }\r\n\r\n if(this.count === 2) return this.layoutTwo();\r\n else if(this.count === 3) return this.layoutThree();\r\n return this.layoutFour();\r\n }\r\n\r\n private layoutTwo(): ReturnType {\r\n if((this.proportions === \"ww\")\r\n && (this.averageRatio > 1.4 * this.maxSizeRatio)\r\n && (this.ratios[1] - this.ratios[0] < 0.2)) {\r\n return this.layoutTwoTopBottom();\r\n } else if(this.proportions === \"ww\" || this.proportions === \"qq\") {\r\n return this.layoutTwoLeftRightEqual();\r\n }\r\n return this.layoutTwoLeftRight();\r\n }\r\n\r\n private layoutThree(): ReturnType {\r\n //console.log('layoutThree:', this);\r\n if(this.proportions[0] === 'n') {\r\n return this.layoutThreeLeftAndOther();\r\n }\r\n return this.layoutThreeTopAndOther();\r\n }\r\n\r\n private layoutFour(): ReturnType {\r\n if(this.proportions[0] === 'w') {\r\n return this.layoutFourTopAndOther();\r\n }\r\n return this.layoutFourLeftAndOther();\r\n }\r\n\r\n private layoutTwoTopBottom(): ReturnType {\r\n const width = this.maxWidth;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(\r\n width / this.ratios[1],\r\n (this.maxHeight - this.spacing) / 2)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: height + this.spacing, width, height},\r\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRightEqual(): ReturnType {\r\n const width = (this.maxWidth - this.spacing) / 2;\r\n const height = Math.round(Math.min(\r\n width / this.ratios[0],\r\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: width + this.spacing, y: 0, width, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutTwoLeftRight(): ReturnType {\r\n const minimalWidth = Math.round(this.minWidth * 1.5);\r\n const secondWidth = Math.min(\r\n Math.round(Math.max(\r\n 0.4 * (this.maxWidth - this.spacing),\r\n (this.maxWidth - this.spacing) / this.ratios[0]\r\n / (1 / this.ratios[0] + 1 / this.ratios[1]))),\r\n this.maxWidth - this.spacing - minimalWidth);\r\n const firstWidth = this.maxWidth\r\n - secondWidth\r\n - this.spacing;\r\n const height = Math.min(\r\n this.maxHeight,\r\n Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n secondWidth / this.ratios[1])));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\r\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutThreeLeftAndOther(): ReturnType {\r\n const firstHeight = this.maxHeight;\r\n const thirdHeight = Math.round(Math.min(\r\n (this.maxHeight - this.spacing) / 2.,\r\n (this.ratios[1] * (this.maxWidth - this.spacing)\r\n / (this.ratios[2] + this.ratios[1]))));\r\n const secondHeight = firstHeight\r\n - thirdHeight\r\n - this.spacing;\r\n const rightWidth = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - this.spacing) / 2.,\r\n Math.min(\r\n thirdHeight * this.ratios[2],\r\n secondHeight * this.ratios[1]))));\r\n const leftWidth = Math.min(\r\n Math.round(firstHeight * this.ratios[0]),\r\n this.maxWidth - this.spacing - rightWidth);\r\n\r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n \r\n private layoutThreeTopAndOther(): ReturnType {\r\n const firstWidth = this.maxWidth;\r\n const firstHeight = Math.round(Math.min(\r\n firstWidth / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const secondWidth = (this.maxWidth - this.spacing) / 2;\r\n const secondHeight = Math.min(\r\n this.maxHeight - firstHeight - this.spacing,\r\n Math.round(Math.min(\r\n secondWidth / this.ratios[1],\r\n secondWidth / this.ratios[2])));\r\n const thirdWidth = firstWidth - secondWidth - this.spacing;\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourTopAndOther(): ReturnType {\r\n const w = this.maxWidth;\r\n const h0 = Math.round(Math.min(\r\n w / this.ratios[0],\r\n (this.maxHeight - this.spacing) * 0.66));\r\n const h = Math.round(\r\n (this.maxWidth - 2 * this.spacing)\r\n / (this.ratios[1] + this.ratios[2] + this.ratios[3]));\r\n const w0 = Math.max(\r\n this.minWidth,\r\n Math.round(Math.min(\r\n (this.maxWidth - 2 * this.spacing) * 0.4,\r\n h * this.ratios[1])));\r\n const w2 = Math.round(Math.max(\r\n Math.max(\r\n this.minWidth * 1.,\r\n (this.maxWidth - 2 * this.spacing) * 0.33),\r\n h * this.ratios[3]));\r\n const w1 = w - w0 - w2 - 2 * this.spacing;\r\n const h1 = Math.min(\r\n this.maxHeight - h0 - this.spacing,\r\n h);\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w, height: h0},\r\n sides: RectPart.Left | RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\r\n sides: RectPart.Bottom | RectPart.Left\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Bottom,\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\r\n sides: RectPart.Right | RectPart.Bottom\r\n },\r\n ];\r\n }\r\n\r\n private layoutFourLeftAndOther(): ReturnType {\r\n const h = this.maxHeight;\r\n const w0 = Math.round(Math.min(\r\n h * this.ratios[0],\r\n (this.maxWidth - this.spacing) * 0.6));\r\n \r\n const w = Math.round(\r\n (this.maxHeight - 2 * this.spacing)\r\n / (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\r\n );\r\n const h0 = Math.round(w / this.ratios[1]);\r\n const h1 = Math.round(w / this.ratios[2]);\r\n const h2 = h - h0 - h1 - 2 * this.spacing;\r\n const w1 = Math.max(\r\n this.minWidth,\r\n Math.min(this.maxWidth - w0 - this.spacing, w));\r\n \r\n return [\r\n {\r\n geometry: {x: 0, y: 0, width: w0, height: h},\r\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\r\n sides: RectPart.Top | RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\r\n sides: RectPart.Right\r\n },\r\n {\r\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\r\n sides: RectPart.Bottom | RectPart.Right\r\n },\r\n ];\r\n }\r\n\r\n private static countRatios(sizes: Size[]) {\r\n return sizes.map(size => size.w / size.h);\r\n }\r\n\r\n private static countProportions(ratios: number[]) {\r\n return ratios.map(ratio => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\r\n }\r\n}\r\n\r\nclass ComplexLayouter {\r\n private ratios: number[];\r\n private count: number;\r\n\r\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\r\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\r\n this.count = ratios.length;\r\n }\r\n\r\n private static cropRatios(ratios: number[], averageRatio: number) {\r\n const kMaxRatio = 2.75;\r\n const kMinRatio = 0.6667;\r\n return ratios.map(ratio => {\r\n return averageRatio > 1.1\r\n\t\t\t ? clamp(ratio, 1., kMaxRatio)\r\n\t\t\t : clamp(ratio, kMinRatio, 1.);\r\n });\r\n }\r\n\r\n public layout(): GroupMediaLayout[] {\r\n let result = new Array(this.count);\r\n\r\n let attempts: Attempt[] = [];\r\n const multiHeight = (offset: number, count: number) => {\r\n const ratios = this.ratios.slice(offset, offset + count); // warn\r\n const sum = accumulate(ratios, 0);\r\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\r\n };\r\n const pushAttempt = (lineCounts: number[]) => {\r\n let heights: number[] = [];\r\n let offset = 0;\r\n for(let count of lineCounts) {\r\n heights.push(multiHeight(offset, count));\r\n offset += count;\r\n }\r\n attempts.push({lineCounts, heights}); // warn\r\n };\r\n\r\n for(let first = 1; first !== this.count; ++first) {\r\n const second = this.count - first;\r\n if(first > 3 || second > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second]);\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n const third = this.count - first - second;\r\n if((first > 3)\r\n || (second > ((this.averageRatio < 0.85) ? 4 : 3))\r\n || (third > 3)) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third]);\r\n }\r\n }\r\n for(let first = 1; first !== this.count - 1; ++first) {\r\n for(let second = 1; second !== this.count - first; ++second) {\r\n for(let third = 1; third !== this.count - first - second; ++third) {\r\n const fourth = this.count - first - second - third;\r\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\r\n continue;\r\n }\r\n pushAttempt([first, second, third, fourth]);\r\n }\r\n }\r\n }\r\n\r\n let optimalAttempt: Attempt = null;\r\n let optimalDiff = 0;\r\n for(const attempt of attempts) {\r\n const {heights, lineCounts: counts} = attempt;\r\n const lineCount = counts.length;\r\n const totalHeight = accumulate(heights, 0) \r\n + this.spacing * (lineCount - 1);\r\n const minLineHeight = Math.min(...heights);\r\n const maxLineHeight = Math.max(...heights);\r\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\r\n const bad2 = (() => {\r\n for(let line = 1; line !== lineCount; ++line) {\r\n if(counts[line - 1] > counts[line]) {\r\n return 1.5;\r\n }\r\n }\r\n return 1.;\r\n })();\r\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\r\n if(!optimalAttempt || diff < optimalDiff) {\r\n optimalAttempt = attempt;\r\n optimalDiff = diff;\r\n }\r\n }\r\n\r\n const optimalCounts = optimalAttempt.lineCounts;\r\n\t const optimalHeights = optimalAttempt.heights;\r\n const rowCount = optimalCounts.length;\r\n \r\n let index = 0;\r\n let y = 0;\r\n for(let row = 0; row !== rowCount; ++row) {\r\n const colCount = optimalCounts[row];\r\n const lineHeight = optimalHeights[row];\r\n const height = Math.round(lineHeight);\r\n\r\n let x = 0;\r\n for(let col = 0; col !== colCount; ++col) {\r\n const sides = RectPart.None\r\n | (row === 0 ? RectPart.Top : RectPart.None)\r\n | (row === rowCount - 1 ? RectPart.Bottom : RectPart.None)\r\n | (col === 0 ? RectPart.Left : RectPart.None)\r\n | (col === colCount - 1 ? RectPart.Right : RectPart.None);\r\n\r\n const ratio = this.ratios[index];\r\n const width = (col === colCount - 1)\r\n ? (this.maxWidth - x)\r\n : Math.round(ratio * lineHeight);\r\n result[index] = {\r\n geometry: {x, y, width, height},\r\n sides\r\n };\r\n\r\n x += width + this.spacing;\r\n ++index;\r\n }\r\n y += height + this.spacing;\r\n }\r\n\r\n return result;\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { InputFile } from \"../layer\";\r\nimport AvatarEdit from \"./avatarEdit\";\r\nimport AvatarElement from \"./avatar\";\r\nimport InputField from \"./inputField\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport ButtonCorner from \"./buttonCorner\";\r\n\r\nexport default class EditPeer {\r\n public nextBtn: HTMLButtonElement;\r\n\r\n public uploadAvatar: () => Promise;\r\n public avatarEdit: AvatarEdit;\r\n public avatarElem: AvatarElement;\r\n\r\n private inputFields: InputField[];\r\n private listenerSetter: ListenerSetter;\r\n\r\n private peerId: PeerId;\r\n\r\n private _disabled = false;\r\n private avatarSize = 120;\r\n\r\n constructor(options: {\r\n peerId?: EditPeer['peerId'],\r\n inputFields: EditPeer['inputFields'],\r\n listenerSetter: ListenerSetter,\r\n doNotEditAvatar?: boolean,\r\n withoutAvatar?: boolean,\r\n nextBtn?: HTMLButtonElement,\r\n avatarSize?: number\r\n }) {\r\n safeAssign(this, options);\r\n\r\n if(!this.nextBtn) {\r\n this.nextBtn = ButtonCorner({icon: 'check'});\r\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\r\n this.handleChange = () => {\r\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\r\n };\r\n }\r\n\r\n if(!options.withoutAvatar) {\r\n this.avatarElem = document.createElement('avatar-element') as AvatarElement;\r\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\r\n this.avatarElem.setAttribute('peer', '' + this.peerId);\r\n \r\n if(!options.doNotEditAvatar) {\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n this.handleChange();\r\n this.avatarElem.remove();\r\n });\r\n \r\n this.avatarEdit.container.append(this.avatarElem);\r\n }\r\n }\r\n\r\n this.inputFields.forEach(inputField => {\r\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\r\n });\r\n\r\n this.handleChange();\r\n }\r\n\r\n public get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n public set disabled(value) {\r\n this._disabled = value;\r\n this.inputFields.forEach(inputField => inputField.input.toggleAttribute('disabled', value));\r\n this.handleChange();\r\n }\r\n\r\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\r\n this.disabled = true;\r\n promise.then(() => {\r\n if(unlockOnSuccess) {\r\n this.disabled = false;\r\n }\r\n }, () => {\r\n this.disabled = false;\r\n });\r\n }\r\n\r\n public isChanged = () => {\r\n if(this.uploadAvatar) {\r\n return true;\r\n }\r\n\r\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\r\n this.inputFields.forEach(inputField => {\r\n if(inputField.isValid()) {\r\n if(inputField.isChanged()) {\r\n ++changedLength;\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredValidLength;\r\n }\r\n }\r\n\r\n if(inputField.required) {\r\n ++requiredLength;\r\n }\r\n });\r\n\r\n return requiredLength === requiredValidLength && changedLength > 0;\r\n };\r\n\r\n public handleChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\r\n const form = document.createElement('form');\r\n\r\n radios.forEach(r => {\r\n const {container, input} = r;\r\n form.append(container);\r\n input.addEventListener('change', (e) => {\r\n if(input.checked) {\r\n onChange(input.value, e);\r\n }\r\n });\r\n });\r\n\r\n return form;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CheckboxField from \"./checkboxField\";\r\nimport RadioField from \"./radioField\";\r\nimport { ripple } from \"./ripple\";\r\nimport { SliderSuperTab } from \"./slider\";\r\nimport RadioForm from \"./radioForm\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\r\n\r\nexport default class Row {\r\n public container: HTMLElement;\r\n public title: HTMLDivElement;\r\n public subtitle: HTMLElement;\r\n\r\n public checkboxField: CheckboxField;\r\n public radioField: RadioField;\r\n\r\n public freezed = false;\r\n\r\n constructor(options: Partial<{\r\n icon: string,\r\n subtitle: string | HTMLElement | DocumentFragment,\r\n subtitleLangKey: LangPackKey,\r\n subtitleLangArgs: any[],\r\n radioField: Row['radioField'],\r\n checkboxField: Row['checkboxField'],\r\n noCheckboxSubtitle: boolean,\r\n title: string,\r\n titleLangKey: LangPackKey,\r\n titleRight: string | HTMLElement,\r\n clickable: boolean | ((e: Event) => void),\r\n navigationTab: SliderSuperTab,\r\n havePadding: boolean,\r\n noRipple: boolean\r\n }> = {}) {\r\n this.container = document.createElement(options.radioField || options.checkboxField ? 'label' : 'div');\r\n this.container.classList.add('row');\r\n\r\n this.subtitle = document.createElement('div');\r\n this.subtitle.classList.add('row-subtitle');\r\n this.subtitle.setAttribute('dir', 'auto');\r\n if(options.subtitle) {\r\n if(typeof(options.subtitle) === 'string') {\r\n setInnerHTML(this.subtitle, options.subtitle);\r\n } else {\r\n this.subtitle.append(options.subtitle);\r\n }\r\n } else if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\r\n }\r\n this.container.append(this.subtitle);\r\n\r\n let havePadding = !!options.havePadding;\r\n if(options.radioField || options.checkboxField) {\r\n havePadding = true;\r\n if(options.radioField) {\r\n this.radioField = options.radioField;\r\n this.container.append(this.radioField.label);\r\n }\r\n\r\n if(options.checkboxField) {\r\n this.checkboxField = options.checkboxField;\r\n \r\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\r\n if(isToggle) {\r\n this.container.classList.add('row-with-toggle');\r\n options.titleRight = this.checkboxField.label;\r\n } else {\r\n this.container.append(this.checkboxField.label);\r\n }\r\n\r\n if(!options.noCheckboxSubtitle && !isToggle) {\r\n this.checkboxField.input.addEventListener('change', () => {\r\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\r\n });\r\n }\r\n }\r\n\r\n const i = options.radioField || options.checkboxField;\r\n i.label.classList.add('disable-hover');\r\n } \r\n \r\n if(options.title || options.titleLangKey) {\r\n let c: HTMLElement;\r\n if(options.titleRight) {\r\n c = document.createElement('div');\r\n c.classList.add('row-title-row');\r\n this.container.append(c);\r\n } else {\r\n c = this.container;\r\n }\r\n\r\n this.title = document.createElement('div');\r\n this.title.classList.add('row-title');\r\n this.title.setAttribute('dir', 'auto');\r\n if(options.title) {\r\n this.title.innerHTML = options.title;\r\n } else {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n c.append(this.title);\r\n\r\n if(options.titleRight) {\r\n const titleRight = document.createElement('div');\r\n titleRight.classList.add('row-title', 'row-title-right');\r\n\r\n if(typeof(options.titleRight) === 'string') {\r\n titleRight.innerHTML = options.titleRight;\r\n } else {\r\n titleRight.append(options.titleRight);\r\n }\r\n\r\n c.append(titleRight);\r\n }\r\n }\r\n\r\n if(options.icon) {\r\n havePadding = true;\r\n this.title.classList.add('tgico', 'tgico-' + options.icon);\r\n this.container.classList.add('row-with-icon');\r\n }\r\n\r\n if(havePadding) {\r\n this.container.classList.add('row-with-padding');\r\n }\r\n\r\n if(options.navigationTab) {\r\n options.clickable = () => options.navigationTab.open();\r\n }\r\n\r\n if(options.clickable || options.radioField || options.checkboxField) {\r\n if(typeof(options.clickable) === 'function') {\r\n this.container.addEventListener('click', (e) => {\r\n if(this.freezed) return;\r\n (options.clickable as any)(e);\r\n });\r\n }\r\n\r\n this.container.classList.add('row-clickable', 'hover-effect');\r\n\r\n if(!options.noRipple) {\r\n ripple(this.container, undefined, undefined, true);\r\n }\r\n\r\n /* if(options.radioField || options.checkboxField) {\r\n this.container.prepend(this.container.lastElementChild);\r\n } */\r\n }\r\n }\r\n\r\n\r\n}\r\n\r\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\r\n return RadioForm(rows.map(r => ({container: r.container, input: r.radioField.input})), onChange);\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// https://stackoverflow.com/a/30810322\r\nfunction fallbackCopyTextToClipboard(text: string) {\r\n var textArea = document.createElement(\"textarea\");\r\n textArea.value = text;\r\n \r\n // Avoid scrolling to bottom\r\n textArea.style.top = \"0\";\r\n textArea.style.left = \"0\";\r\n textArea.style.position = \"fixed\";\r\n\r\n document.body.appendChild(textArea);\r\n textArea.focus();\r\n textArea.select();\r\n\r\n try {\r\n document.execCommand('copy');\r\n //const successful = document.execCommand('copy');\r\n //const msg = successful ? 'successful' : 'unsuccessful';\r\n //console.log('Fallback: Copying text command was ' + msg);\r\n } catch(err) {\r\n //console.error('Fallback: Oops, unable to copy', err);\r\n }\r\n\r\n document.body.removeChild(textArea);\r\n}\r\n\r\nexport function copyTextToClipboard(text: string) {\r\n if(!navigator.clipboard) {\r\n fallbackCopyTextToClipboard(text);\r\n return;\r\n }\r\n \r\n navigator.clipboard.writeText(text);/* .then(function() {\r\n console.log('Async: Copying to clipboard was successful!');\r\n }, function(err) {\r\n console.error('Async: Could not copy text: ', err);\r\n }); */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport default class RadioField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public main: HTMLElement;\r\n\r\n constructor(options: {\r\n text?: string, \r\n langKey?: LangPackKey,\r\n name: string, \r\n value?: string, \r\n stateKey?: string\r\n }) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('radio-field');\r\n \r\n const input = this.input = document.createElement('input');\r\n input.type = 'radio';\r\n /* input.id = */input.name = 'input-radio-' + options.name;\r\n \r\n if(options.value) {\r\n input.value = options.value;\r\n \r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\r\n });\r\n \r\n input.addEventListener('change', () => {\r\n appStateManager.setByKey(options.stateKey, options.value);\r\n });\r\n }\r\n }\r\n \r\n const main = this.main = document.createElement('div');\r\n main.classList.add('radio-field-main');\r\n \r\n if(options.text) {\r\n main.innerHTML = options.text;\r\n /* const caption = document.createElement('div');\r\n caption.classList.add('radio-field-main-caption');\r\n caption.innerHTML = text;\r\n \r\n if(subtitle) {\r\n label.classList.add('radio-field-with-subtitle');\r\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\r\n }\r\n \r\n main.append(caption); */\r\n } else if(options.langKey) {\r\n _i18n(main, options.langKey);\r\n }\r\n \r\n label.append(input, main);\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\n\r\nconst toastEl = document.createElement('div');\r\ntoastEl.classList.add('toast');\r\nexport function toast(content: string | Node) {\r\n replaceContent(toastEl, content);\r\n document.body.append(toastEl);\r\n\r\n if(toastEl.dataset.timeout) clearTimeout(+toastEl.dataset.timeout);\r\n toastEl.dataset.timeout = '' + setTimeout(() => {\r\n toastEl.remove();\r\n delete toastEl.dataset.timeout;\r\n }, 3000);\r\n}\r\n\r\nexport function toastNew(options: Partial<{\r\n langPackKey: LangPackKey\r\n}>) {\r\n toast(i18n(options.langPackKey));\r\n}\r\n","// * Jolly Cobra's schedulers\r\n\r\nimport { AnyFunction, Awaited } from \"../../types\";\r\n\r\nexport default function debounce(\r\n fn: F,\r\n ms: number,\r\n shouldRunFirst = true,\r\n shouldRunLast = true,\r\n) {\r\n let waitingTimeout: number;\r\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\r\n let hadNewCall = false;\r\n\r\n return (...args: Parameters): typeof waitingPromise => {\r\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n\r\n if(waitingTimeout) {\r\n clearTimeout(waitingTimeout);\r\n hadNewCall = true;\r\n reject();\r\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\r\n } else if(shouldRunFirst) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n hadNewCall = false;\r\n }\r\n\r\n waitingTimeout = setTimeout(() => {\r\n // will run if should run last or first but with new call\r\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\r\n // @ts-ignore\r\n resolve(fn(...args));\r\n }\r\n\r\n waitingTimeout = waitingPromise = resolve = reject = undefined;\r\n hadNewCall = false;\r\n }, ms) as any;\r\n\r\n waitingPromise.catch(() => {});\r\n return waitingPromise;\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport debounce from \"../helpers/schedulers/debounce\";\r\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\r\nimport { LangPackKey } from \"../lib/langPack\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport InputField, { InputFieldOptions, InputState } from \"./inputField\";\r\n\r\nexport class UsernameInputField extends InputField {\r\n private checkUsernamePromise: Promise;\r\n private checkUsernameDebounced: (username: string) => void;\r\n public options: InputFieldOptions & {\r\n peerId?: PeerId,\r\n listenerSetter: ListenerSetter,\r\n onChange?: () => void,\r\n invalidText: LangPackKey,\r\n takenText: LangPackKey,\r\n availableText: LangPackKey,\r\n head?: string\r\n };\r\n\r\n constructor(options: UsernameInputField['options']) {\r\n super(options);\r\n\r\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\r\n\r\n options.listenerSetter.add(this.input)('input', () => {\r\n const value = this.getValue();\r\n\r\n //console.log('userNameInput:', value);\r\n if(value === this.originalValue || !value.length) {\r\n this.setState(InputState.Neutral, this.options.label);\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n } else if(!RichTextProcessor.isUsernameValid(value)) { // does not check the last underscore\r\n this.setError(this.options.invalidText);\r\n } else {\r\n this.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.input.classList.contains('error')) {\r\n this.options.onChange && this.options.onChange();\r\n return;\r\n }\r\n\r\n this.checkUsernameDebounced(value);\r\n });\r\n }\r\n\r\n public getValue() {\r\n let value = this.value;\r\n if(this.options.head) {\r\n value = value.slice(this.options.head.length);\r\n this.setValueSilently(this.options.head + value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n private checkUsername(username: string) {\r\n if(this.checkUsernamePromise) return;\r\n\r\n if(this.options.peerId) {\r\n this.checkUsernamePromise = apiManager.invokeApi('channels.checkUsername', {\r\n channel: appChatsManager.getChannelInput(this.options.peerId.toChatId()),\r\n username\r\n });\r\n } else {\r\n this.checkUsernamePromise = apiManager.invokeApi('account.checkUsername', {username});\r\n }\r\n\r\n this.checkUsernamePromise.then(available => {\r\n if(this.getValue() !== username) return;\r\n\r\n if(available) {\r\n this.setState(InputState.Valid, this.options.availableText);\r\n } else {\r\n this.setError(this.options.takenText);\r\n }\r\n }, (err) => {\r\n if(this.getValue() !== username) return;\r\n\r\n switch(err.type) {\r\n case 'USERNAME_INVALID': {\r\n this.setError(this.options.invalidText);\r\n break;\r\n }\r\n }\r\n }).then(() => {\r\n this.checkUsernamePromise = undefined;\r\n this.options.onChange && this.options.onChange();\r\n\r\n const value = this.getValue();\r\n if(value !== username && this.isValidToChange() && RichTextProcessor.isUsernameValid(value)) {\r\n this.checkUsername(value);\r\n }\r\n });\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from \"../avatar\";\nimport PopupElement, { addCancelButton, PopupButton, PopupOptions } from \".\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport CheckboxField, { CheckboxFieldOptions } from \"../checkboxField\";\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = PopupOptions & Partial<{\n peerId: PeerId,\n title: string | HTMLElement,\n titleLangKey?: LangPackKey,\n titleLangArgs?: any[],\n noTitle?: boolean,\n description: string,\n descriptionLangKey?: LangPackKey,\n descriptionLangArgs?: any[],\n buttons?: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), options.buttons && addCancelButton(options.buttons), {overlayClosable: true, ...options});\n\n if(options.peerId) {\n let avatarEl = new AvatarElement();\n avatarEl.setAttribute('dialog', '1');\n avatarEl.setAttribute('peer', '' + options.peerId);\n avatarEl.classList.add('avatar-32');\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) p.innerHTML = options.description;\n \n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n \n options.checkboxes.forEach(o => {\n o.withRipple = false;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach(button => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach(o => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { copyTextToClipboard } from \"../../../helpers/clipboard\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport { Chat, ChatFull, ExportedChatInvite } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport Button from \"../../button\";\r\nimport { setButtonLoader } from \"../../misc\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport { toast } from \"../../toast\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\n\r\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\r\n public chatId: ChatId;\r\n public chatFull: ChatFull;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'group-type-container');\r\n\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n\r\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\r\n\r\n const section = new SettingSection({\r\n name: isBroadcast ? 'ChannelType' : 'GroupType'\r\n });\r\n\r\n const random = randomLong();\r\n const privateRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate', \r\n name: random, \r\n value: 'private'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\r\n });\r\n const publicRow = new Row({\r\n radioField: new RadioField({\r\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic', \r\n name: random, \r\n value: 'public'\r\n }),\r\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\r\n });\r\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\r\n const a = [privateSection, publicSection];\r\n if(value === 'public') a.reverse();\r\n\r\n a[0].container.classList.remove('hide');\r\n a[1].container.classList.add('hide');\r\n\r\n onChange();\r\n });\r\n\r\n const chat: Chat = appChatsManager.getChat(this.chatId);\r\n\r\n section.content.append(form);\r\n\r\n const privateSection = new SettingSection({});\r\n\r\n //let revoked = false;\r\n const linkRow = new Row({\r\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\r\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\r\n clickable: () => {\r\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\r\n toast(I18n.format('LinkCopied', true));\r\n }\r\n });\r\n\r\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\r\n\r\n attachClickEvent(btnRevoke, () => {\r\n new PopupPeer('revoke-link', {\r\n buttons: [{\r\n langKey: 'RevokeButton',\r\n callback: () => {\r\n const toggle = toggleDisability([btnRevoke], true);\r\n \r\n appProfileManager.getChatInviteLink(this.chatId, true).then(link => {\r\n toggle();\r\n linkRow.title.innerHTML = link;\r\n //revoked = true;\r\n //onChange();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'RevokeLink',\r\n descriptionLangKey: 'RevokeAlert'\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n privateSection.content.append(linkRow.container, btnRevoke);\r\n\r\n const publicSection = new SettingSection({\r\n caption: isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup',\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const placeholder = 't.me/';\r\n\r\n const onChange = () => {\r\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) \r\n || (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\r\n applyBtn.classList.toggle('is-visible', changed);\r\n };\r\n\r\n const linkInputField = new UsernameInputField({\r\n label: 'SetUrlPlaceholder',\r\n name: 'group-public-link',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n availableText: 'Link.Available',\r\n invalidText: 'Link.Invalid',\r\n takenText: 'Link.Taken',\r\n onChange: onChange,\r\n peerId: this.chatId.toPeerId(true),\r\n head: placeholder\r\n });\r\n\r\n const originalValue = placeholder + ((chat as Chat.channel).username || '');\r\n\r\n inputWrapper.append(linkInputField.container)\r\n publicSection.content.append(inputWrapper);\r\n\r\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\r\n this.content.append(applyBtn);\r\n\r\n attachClickEvent(applyBtn, () => {\r\n /* const unsetLoader = */setButtonLoader(applyBtn);\r\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\r\n appChatsManager.migrateChat(this.chatId).then(channelId => {\r\n return appChatsManager.updateUsername(channelId, username);\r\n }).then(() => {\r\n //unsetLoader();\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n (originalValue !== placeholder ? publicRow : privateRow).radioField.checked = true;\r\n linkInputField.setOriginalValue(originalValue);\r\n\r\n this.scrollable.append(section.container, privateSection.container, publicSection.container);\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'SavingContentTitle',\r\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\r\n });\r\n\r\n const checkboxField = new CheckboxField({\r\n text: 'RestrictSavingContent',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(checkboxField.input)('change', () => {\r\n const toggle = checkboxField.toggleDisability(true);\r\n appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const onChatUpdate = () => {\r\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n onChatUpdate();\r\n }\r\n });\r\n\r\n onChatUpdate();\r\n\r\n section.content.append(checkboxField.label);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Scrollable from \"../components/scrollable\";\r\nimport { safeAssign } from \"./object\";\r\n\r\nexport default class ScrollableLoader {\r\n public loading = false;\r\n private scrollable: Scrollable;\r\n private getPromise: () => Promise;\r\n private promise: Promise;\r\n private loaded = false;\r\n\r\n constructor(options: {\r\n scrollable: ScrollableLoader['scrollable'],\r\n getPromise: ScrollableLoader['getPromise']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n options.scrollable.onScrolledBottom = () => {\r\n this.load();\r\n };\r\n }\r\n \r\n public load() {\r\n if(this.loaded) {\r\n return Promise.resolve();\r\n }\r\n \r\n if(this.loading) {\r\n return this.promise;\r\n }\r\n\r\n this.loading = true;\r\n this.promise = this.getPromise().then(done => {\r\n this.loading = false;\r\n this.promise = undefined;\r\n\r\n if(done) {\r\n this.loaded = true;\r\n this.scrollable.onScrolledBottom = null;\r\n } else {\r\n this.scrollable.checkForTriggers();\r\n }\r\n }, () => {\r\n this.promise = undefined;\r\n this.loading = false;\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager, { ChatRights } from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { Dialog } from \"../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport Scrollable from \"./scrollable\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport CheckboxField from \"./checkboxField\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { safeAssign } from \"../helpers/object\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport findUpAttribute from \"../helpers/dom/findUpAttribute\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport PeerTitle from \"./peerTitle\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { filterUnique, indexOfAndSplice } from \"../helpers/array\";\nimport debounce from \"../helpers/schedulers/debounce\";\nimport windowSize from \"../helpers/windowSize\";\nimport appPeersManager, { IsPeerType } from \"../lib/appManagers/appPeersManager\";\nimport { generateDelimiter, SettingSection } from \"./sidebarLeft\";\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n \n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n \n //public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize = 48;\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n \n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n \n constructor(options: {\n appendTo: AppSelectPeers['appendTo'], \n onChange?: AppSelectPeers['onChange'], \n peerType?: AppSelectPeers['peerType'], \n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void, \n renderResultsFunc?: AppSelectPeers['renderResultsFunc'], \n chatRightsAction?: AppSelectPeers['chatRightsAction'], \n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector');\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = (peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n \n peerIds = peerIds.filter(peerId => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = peerIds.filter(peerId => {\n if(peerId.isPeerId()) {\n const peer = appPeersManager.getPeer(peerId);\n if(!peer.deleted) {\n return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId));\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n let topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n \n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n \n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n \n // let delimiter = document.createElement('hr');\n\n this.selectedContainer.addEventListener('click', (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n \n if(!target) return;\n \n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n li.click();\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n this.chatsContainer.addEventListener('click', (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n //target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n let getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = null;\n }\n \n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(let i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = null;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n \n //console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private renderSaved() {\n if(!this.exceptSelf && \n !this.offsetIndex && \n this.folderId === 0 && \n this.peerType.includes('dialogs') && \n (!this.query || appUsersManager.testSelfSearch(this.query))) {\n this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n if(this.tempIds[type] === undefined) {\n this.tempIds[type] = 0;\n }\n\n return ++this.tempIds[type];\n }\n\n private async getMoreDialogs(): Promise {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n \n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n\n const tempId = this.getTempId('dialogs');\n const promise = appMessagesManager.getConversations(this.query, this.offsetIndex, pageCount, this.folderId, true).promise;\n this.promise = promise;\n const value = await promise;\n if(this.tempIds.dialogs !== tempId) {\n return;\n }\n\n this.promise = null;\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = dialogs[dialogs.length - 1].index || 0;\n\n dialogs = dialogs.slice();\n dialogs.findAndSplice(d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = dialogs.filter(d => this.filterByRights(d.peerId));\n }\n\n this.renderSaved();\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map(dialog => dialog.peerId));\n \n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n this.renderSaved();\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private filterByRights(peerId: PeerId) {\n return (\n peerId.isUser() && \n (this.chatRightsAction !== 'send_messages' || appUsersManager.canSendToUser(peerId))\n ) || appChatsManager.hasRights(peerId.toChatId(), this.chatRightsAction);\n }\n\n private async getMoreContacts() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const tempId = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n this.promise = promise;\n let [cachedContacts, searchResult] = await promise;\n if(this.tempIds.contacts !== tempId) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = resultPeerIds.filter(peerId => this.filterByRights(peerId));\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter(peerId => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n this.promise = null;\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n \n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.promise) return this.promise;\n\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const tempId = this.getTempId('channelParticipants');\n const promise = appProfileManager.getChannelParticipants(this.peerId.toChatId(), {_: 'channelParticipantsSearch', q: this.query}, pageCount, this.list.childElementCount);\n const participants = await promise;\n if(this.tempIds.channelParticipants !== tempId) {\n return;\n }\n \n const peerIds = participants.participants.map(participant => {\n return appChatsManager.getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n const get = () => {\n const promises: Promise[] = [];\n\n // if(!loadedAllDialogs && (this.peerType.includes('dialogs')/* || this.peerType.includes('contacts') */)) {\n // if(!loadAllDialogsPromise) {\n // loadAllDialogsPromise = appMessagesManager.getConversationsAll()\n // .then(() => {\n // loadedAllDialogs = true;\n // }).finally(() => {\n // loadAllDialogsPromise = null;\n // });\n // }\n\n // promises.push(loadAllDialogsPromise);\n // }\n \n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n promises.push(this.getMoreDialogs());\n \n if(!this.loadedWhat.archived) {\n return promises;\n }\n }\n \n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n promises.push(this.getMoreContacts());\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n promises.push(this.getMoreChannelParticipants());\n }\n \n return promises;\n };\n \n const promises = get();\n const promise = Promise.all(promises);\n if(promises.length) {\n promise.then(this.checkForTriggers);\n }\n\n return promise;\n }\n\n private renderResults(peerIds: PeerId[]) {\n //console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = peerIds.filter(peerId => {\n return appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(peerId => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.scrollable,\n drawStatus: false,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n //dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = appProfileManager.getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = appUsersManager.getUserStatusString(peerId);\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n //console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-32');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId(), dialog: true}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n //this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange && this.onChange(this.selected.size);\n \n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center'\n });\n }\n \n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n //const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach(value => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input, \n position: 'center', \n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport AppSelectPeers from \"../appSelectPeers\";\r\nimport PopupElement from \".\";\r\nimport { LangPackKey, _i18n } from \"../../lib/langPack\";\r\n\r\nexport default class PopupPickUser extends PopupElement {\r\n protected selector: AppSelectPeers;\r\n \r\n constructor(options: {\r\n peerTypes: AppSelectPeers['peerType'], \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n placeholder: LangPackKey,\r\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\r\n peerId?: number,\r\n selfPresence?: LangPackKey\r\n }) {\r\n super('popup-forward', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.body, \r\n onChange: async() => {\r\n const selected = this.selector.getSelected();\r\n const peerId = selected[selected.length - 1].toPeerId();\r\n \r\n if(options.onSelect) {\r\n const res = options.onSelect(peerId);\r\n if(res instanceof Promise) {\r\n try {\r\n await res;\r\n } catch(err) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.selector = null;\r\n this.hide();\r\n }, \r\n peerType: options.peerTypes, \r\n onFirstRender: () => {\r\n this.show();\r\n this.selector.checkForTriggers(); // ! due to zero height before mounting\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.selector.input.focus();\r\n }\r\n }, \r\n chatRightsAction: options.chatRightsAction, \r\n multiSelect: false,\r\n rippleEnabled: false,\r\n avatarSize: 46,\r\n peerId: options.peerId,\r\n placeholder: options.placeholder,\r\n selfPresence: options.selfPresence\r\n });\r\n\r\n //this.scrollable = new Scrollable(this.body);\r\n\r\n this.title.append(this.selector.input);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\nimport { deepEqual } from \"../../../helpers/object\";\nimport { ChannelParticipant } from \"../../../layer\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport Button from \"../../button\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { ChatPermissions } from \"./groupPermissions\";\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n protected init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo',\n });\n \n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n dialog: this.userId.toPeerId(false),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48\n });\n\n dom.lastMessageSpan.append(appUsersManager.getUserStatusString(this.userId));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n });\n\n destroyListener = () => {\n //appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n \n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport ListenerSetter from \"../../../helpers/listenerSetter\";\nimport ScrollableLoader from \"../../../helpers/scrollableLoader\";\nimport { ChannelParticipant, Chat, ChatBannedRights, Update } from \"../../../layer\";\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\nimport I18n, { i18n, join, LangPackKey } from \"../../../lib/langPack\";\nimport rootScope from \"../../../lib/rootScope\";\nimport CheckboxField from \"../../checkboxField\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport Row from \"../../row\";\nimport { SettingSection } from \"../../sidebarLeft\";\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\nimport { toast } from \"../../toast\";\nimport AppUserPermissionsTab from \"./userPermissions\";\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }) {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const chat: Chat.chat = appChatsManager.getChat(options.chatId);\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? appChatsManager.combineParticipantBannedRights(options.chatId, options.participant.banned_rights) : defaultBannedRights;\n \n for(const info of this.v) {\n const mainFlag = info.flags[0];\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: appChatsManager.hasRights(options.chatId, mainFlag, rights),\n restriction: true,\n withRipple: true\n });\n\n // @ts-ignore\n if(options.participant && defaultBannedRights.pFlags[mainFlag]) {\n info.checkboxField.input.disabled = true;\n \n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format('UserRestrictionsDisabled', true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter(i => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach(info => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(info.checkboxField.label);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach(flag => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n protected async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader',\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n });\n\n this.eventListener.addEventListener('destroy', () => {\n appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n \n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId,\n });\n }\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = new AppUserPermissionsTab(this.slider);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n \n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, 'LI');\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = (li: Element, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;//appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = (appChatsManager.getChat(this.chatId) as Chat.channel).default_banned_rights;\n //const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach(info => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = li.querySelector('.user-last-message') as HTMLElement;\n\n if(cantWhat.length) {\n el.innerHTML = '';\n el.append(...join(cantWhat.map(t => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n \n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: appPeersManager.getPeerId(participant.peer),\n container: list,\n drawStatus: false,\n rippleEnabled: true,\n avatarSize: 48,\n append\n });\n\n setSubtitle(dom.listEl, participant);\n\n //dom.titleSpan.innerHTML = 'Chinaza Akachi';\n //dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n if(needAdd) {\n if(!li) {\n add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n } else {\n setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n }\n\n if(update.prev_participant?._ !== 'channelParticipantBanned') {\n ++exceptionsCount;\n }\n } else {\n if(li) {\n li.remove();\n }\n\n if(update.prev_participant?._ === 'channelParticipantBanned') {\n --exceptionsCount;\n }\n }\n\n setLength();\n });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then(res => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n \n exceptionsCount = res.count;\n setLength();\n \n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n \n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appPeersManager, { PeerType } from \"../../lib/appManagers/appPeersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\n\nexport default class PopupDeleteDialog {\n constructor(\n peerId: PeerId, \n // actionType: 'leave' | 'delete', \n peerType: PeerType = appPeersManager.getDialogType(peerId), \n onSelect?: (promise: Promise) => void\n ) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = appChatsManager.leave(peerId.toChatId());\n \n if(flush) {\n promise = promise.finally(() => {\n return appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n \n onSelect && onSelect(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(peerId.isUser()) {\n promise = appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n \n onSelect && onSelect(promise);\n };\n\n let title: LangPackKey, description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n appChatsManager.deleteChannel\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n new PeerTitle({peerId}).element\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(/* actionType === 'delete' && */appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport Button from \"../../button\";\r\nimport appChatsManager, { ChatRights } from \"../../../lib/appManagers/appChatsManager\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport { Chat, ChatFull } from \"../../../layer\";\r\nimport AppChatTypeTab from \"./chatType\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppGroupPermissionsTab from \"./groupPermissions\";\r\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\r\nimport PopupDeleteDialog from \"../../popups/deleteDialog\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\nimport CheckboxField from \"../../checkboxField\";\r\n\r\nexport default class AppEditChatTab extends SliderSuperTab {\r\n private chatNameInputField: InputField;\r\n private descriptionInputField: InputField;\r\n private editPeer: EditPeer;\r\n public chatId: ChatId;\r\n\r\n protected async _init() {\r\n // * cleanup prev\r\n this.listenerSetter.removeAll();\r\n this.scrollable.container.innerHTML = '';\r\n\r\n this.container.classList.add('edit-peer-container', 'edit-group-container');\r\n this.setTitle('Edit');\r\n \r\n const chatFull = await appProfileManager.getChatFull(this.chatId, true);\r\n\r\n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(this.chatId);\r\n const isBroadcast = appChatsManager.isBroadcast(this.chatId);\r\n const isChannel = appChatsManager.isChannel(this.chatId);\r\n\r\n const chatUpdateListeners: (() => void)[] = [];\r\n const addChatUpdateListener = (callback: () => void) => {\r\n chatUpdateListeners.push(callback);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n chatUpdateListeners.forEach(callback => callback());\r\n }\r\n });\r\n\r\n const peerId = this.chatId.toPeerId(true);\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.chatNameInputField = new InputField({\r\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\r\n name: 'chat-name',\r\n maxLength: 255,\r\n required: true\r\n });\r\n this.descriptionInputField = new InputField({\r\n label: 'DescriptionPlaceholder',\r\n name: 'chat-description',\r\n maxLength: 255\r\n });\r\n \r\n this.chatNameInputField.setOriginalValue(chat.title);\r\n this.descriptionInputField.setOriginalValue(chatFull.about);\r\n\r\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\r\n \r\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_type')) {\r\n const chatTypeRow = new Row({\r\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\r\n clickable: () => {\r\n const tab = new AppChatTypeTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.chatFull = chatFull;\r\n tab.open();\r\n\r\n this.listenerSetter.add(tab.eventListener)('destroy', setChatTypeSubtitle);\r\n },\r\n icon: 'lock'\r\n });\r\n\r\n const setChatTypeSubtitle = () => {\r\n chatTypeRow.subtitle.textContent = '';\r\n\r\n let key: LangPackKey;\r\n if(isBroadcast) {\r\n key = (chat as Chat.channel).username ? 'TypePublic' : 'TypePrivate';\r\n } else {\r\n key = (chat as Chat.channel).username ? 'TypePublicGroup' : 'TypePrivateGroup';\r\n }\r\n\r\n chatTypeRow.subtitle.append(i18n(key));\r\n };\r\n\r\n setChatTypeSubtitle();\r\n section.content.append(chatTypeRow.container);\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'change_permissions') && !isBroadcast) {\r\n const flags = [\r\n 'send_messages',\r\n 'send_media',\r\n 'send_stickers',\r\n 'send_polls',\r\n 'embed_links',\r\n 'invite_users',\r\n 'pin_messages',\r\n 'change_info'\r\n ] as ChatRights[];\r\n\r\n const permissionsRow = new Row({\r\n titleLangKey: 'ChannelPermissions',\r\n clickable: () => {\r\n const tab = new AppGroupPermissionsTab(this.slider);\r\n tab.chatId = this.chatId;\r\n tab.open();\r\n },\r\n icon: 'permissions',\r\n });\r\n\r\n const setPermissionsLength = () => {\r\n permissionsRow.subtitle.innerHTML = flags.reduce((acc, f) => acc + +appChatsManager.hasRights(this.chatId, f, chat.default_banned_rights), 0) + '/' + flags.length;\r\n };\r\n\r\n setPermissionsLength(); \r\n section.content.append(permissionsRow.container);\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.chatId === chatId) {\r\n setPermissionsLength();\r\n }\r\n });\r\n }\r\n\r\n /* const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n \r\n let promises: Promise[] = [];\r\n\r\n const id = this.chatId;\r\n if(this.chatNameInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editTitle(id, this.chatNameInputField.value));\r\n }\r\n\r\n if(this.descriptionInputField.isValidToChange()) {\r\n promises.push(appChatsManager.editAbout(id, this.descriptionInputField.value));\r\n }\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appChatsManager.editPhoto(id, inputFile);\r\n }));\r\n }\r\n \r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n \r\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\r\n const discussionRow = new Row({\r\n titleLangKey: 'PeerInfo.Discussion',\r\n subtitleLangKey: 'PeerInfo.Discussion.Add',\r\n clickable: true,\r\n icon: 'message'\r\n });\r\n\r\n section.content.append(discussionRow.container);\r\n }\r\n\r\n const administratorsRow = new Row({\r\n titleLangKey: 'PeerInfo.Administrators',\r\n subtitle: '' + chatFull.admins_count,\r\n icon: 'admin',\r\n clickable: true\r\n });\r\n\r\n section.content.append(administratorsRow.container); */\r\n\r\n if(isBroadcast && appChatsManager.hasRights(this.chatId, 'change_info')) {\r\n const signMessagesCheckboxField = new CheckboxField({\r\n text: 'PeerInfo.SignMessages',\r\n checked: !!(chat as Chat.channel).pFlags.signatures,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\r\n const toggle = signMessagesCheckboxField.toggleDisability(true);\r\n appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n addChatUpdateListener(() => {\r\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\r\n });\r\n\r\n section.content.append(signMessagesCheckboxField.label);\r\n }\r\n }\r\n\r\n if(!isBroadcast) {\r\n const section = new SettingSection({\r\n\r\n });\r\n\r\n /* const membersRow = new Row({\r\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\r\n icon: 'newgroup',\r\n clickable: true\r\n });\r\n\r\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\r\n\r\n section.content.append(membersRow.container); */\r\n\r\n if(!isBroadcast && appChatsManager.hasRights(this.chatId, 'change_permissions')) {\r\n const showChatHistoryCheckboxField = new CheckboxField({\r\n text: 'ChatHistory',\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\r\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\r\n appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n // ! it won't be updated because chatFull will be old\r\n const onChatUpdate = () => {\r\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\r\n };\r\n\r\n onChatUpdate();\r\n addChatUpdateListener(onChatUpdate);\r\n \r\n section.content.append(showChatHistoryCheckboxField.label);\r\n }\r\n\r\n if(section.content.childElementCount) {\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n\r\n if(appChatsManager.hasRights(this.chatId, 'delete_chat')) {\r\n const section = new SettingSection({});\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!isChannel) {\r\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\r\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\r\n if(peerId === migrateFrom) {\r\n this.chatId = migrateTo.toChatId();\r\n this._init();\r\n }\r\n });\r\n }\r\n }\r\n\r\n protected init() {\r\n return this._init();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\"\r\nimport InputField from \"../../inputField\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { SettingSection } from \"../../sidebarLeft\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport { addCancelButton } from \"../../popups\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppEditContactTab extends SliderSuperTab {\r\n private nameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private editPeer: EditPeer;\r\n public peerId: PeerId;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\r\n const isNew = !appUsersManager.isContact(this.peerId.toUserId());\r\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n const inputFields: InputField[] = [];\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FirstName',\r\n name: 'contact-name',\r\n maxLength: 70,\r\n required: true\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'LastName',\r\n name: 'contact-lastname',\r\n maxLength: 70\r\n });\r\n\r\n if(this.peerId) {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n if(isNew) {\r\n this.nameInputField.setDraftValue(user.first_name);\r\n this.lastNameInputField.setDraftValue(user.last_name);\r\n } else {\r\n this.nameInputField.setOriginalValue(user.first_name);\r\n this.lastNameInputField.setOriginalValue(user.last_name);\r\n }\r\n }\r\n \r\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\r\n inputFields.push(this.nameInputField, this.lastNameInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: this.peerId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter,\r\n doNotEditAvatar: true\r\n });\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n if(this.peerId) {\r\n const div = document.createElement('div');\r\n div.classList.add('avatar-edit');\r\n div.append(this.editPeer.avatarElem);\r\n \r\n const notificationsCheckboxField = new CheckboxField({\r\n text: 'Notifications'\r\n });\r\n \r\n notificationsCheckboxField.input.addEventListener('change', (e) => {\r\n if(!e.isTrusted) {\r\n return;\r\n }\r\n \r\n appMessagesManager.mutePeer(this.peerId);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('notify_settings', (update) => {\r\n if(update.peer._ !== 'notifyPeer') return;\r\n const peerId = appPeersManager.getPeerId(update.peer.peer);\r\n if(this.peerId === peerId) {\r\n const enabled = !appNotificationsManager.isMuted(update.notify_settings);\r\n if(enabled !== notificationsCheckboxField.checked) {\r\n notificationsCheckboxField.checked = enabled;\r\n }\r\n }\r\n });\r\n \r\n const profileNameDiv = document.createElement('div');\r\n profileNameDiv.classList.add('profile-name');\r\n profileNameDiv.append(new PeerTitle({\r\n peerId: this.peerId\r\n }).element);\r\n //profileNameDiv.innerHTML = 'Karen Stanford';\r\n \r\n const profileSubtitleDiv = document.createElement('div');\r\n profileSubtitleDiv.classList.add('profile-subtitle');\r\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\r\n\r\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\r\n\r\n if(!isNew) {\r\n const notificationsRow = new Row({\r\n checkboxField: notificationsCheckboxField\r\n });\r\n \r\n const enabled = !appNotificationsManager.isPeerLocalMuted(this.peerId, false);\r\n notificationsCheckboxField.checked = enabled;\r\n\r\n section.content.append(notificationsRow.container);\r\n } else {\r\n const user = appUsersManager.getUser(this.peerId);\r\n\r\n const phoneRow = new Row({\r\n icon: 'phone',\r\n titleLangKey: user.phone ? undefined : 'MobileHidden',\r\n title: user.phone ? appUsersManager.formatUserPhone(user.phone) : undefined,\r\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\r\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: this.peerId}).element]\r\n });\r\n\r\n section.content.append(phoneRow.container);\r\n }\r\n } else {\r\n section.content.append(inputWrapper);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n appUsersManager.addContact(this.peerId, this.nameInputField.value, this.lastNameInputField.value, appUsersManager.getUser(this.peerId).phone)\r\n .finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n this.close();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(!isNew) {\r\n const section = new SettingSection({\r\n \r\n });\r\n\r\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\r\n\r\n attachClickEvent(btnDelete, () => {\r\n new PopupPeer('popup-delete-contact', {\r\n peerId: this.peerId,\r\n titleLangKey: 'DeleteContact',\r\n descriptionLangKey: 'AreYouSureDeleteContact',\r\n buttons: addCancelButton([{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([btnDelete], true);\r\n\r\n appUsersManager.deleteContacts([this.peerId]).then(() => {\r\n this.close();\r\n }, () => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true\r\n }])\r\n }).show();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n section.content.append(btnDelete);\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport { putPreloader, setButtonLoader } from \"../../misc\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppAddMembersTab extends SliderSuperTab {\r\n private nextBtn: HTMLButtonElement;\r\n private selector: AppSelectPeers;\r\n private peerType: 'channel' | 'chat' | 'privacy';\r\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\r\n private skippable: boolean;\r\n\r\n protected init() {\r\n this.container.classList.add('add-members-container');\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n this.content.append(this.nextBtn);\r\n this.scrollable.container.remove();\r\n \r\n this.nextBtn.addEventListener('click', () => {\r\n const peerIds = this.selector.getSelected().map(sel => sel.toPeerId());\r\n\r\n if(this.skippable) {\r\n this.takeOut(peerIds);\r\n this.close();\r\n } else {\r\n const promise = this.takeOut(peerIds);\r\n\r\n if(promise instanceof Promise) {\r\n this.attachToPromise(promise);\r\n } else if(promise === undefined) {\r\n this.close();\r\n }\r\n }\r\n });\r\n }\r\n\r\n public attachToPromise(promise: Promise) {\r\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\r\n\r\n promise.then(() => {\r\n this.close();\r\n }, () => {\r\n removeLoader();\r\n });\r\n }\r\n\r\n public open(options: {\r\n title: LangPackKey,\r\n placeholder: LangPackKey,\r\n type: AppAddMembersTab['peerType'], \r\n takeOut?: AppAddMembersTab['takeOut'],\r\n skippable: boolean,\r\n selectedPeerIds?: PeerId[]\r\n }) {\r\n const ret = super.open();\r\n\r\n this.setTitle(options.title);\r\n this.peerType = options.type;\r\n this.takeOut = options.takeOut;\r\n this.skippable = options.skippable;\r\n\r\n const isPrivacy = this.peerType === 'privacy';\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.content, \r\n onChange: this.skippable ? null : (length) => {\r\n this.nextBtn.classList.toggle('is-visible', !!length);\r\n }, \r\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\r\n placeholder: options.placeholder,\r\n exceptSelf: isPrivacy,\r\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined\r\n });\r\n\r\n if(options.selectedPeerIds) {\r\n this.selector.addInitial(options.selectedPeerIds);\r\n }\r\n\r\n this.nextBtn.classList.add('tgico-arrow_next');\r\n this.nextBtn.innerHTML = '';\r\n this.nextBtn.disabled = false;\r\n this.nextBtn.classList.toggle('is-visible', this.skippable);\r\n\r\n return ret;\r\n }\r\n}","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","export default function generateVerifiedIcon() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n svg.setAttributeNS(null, 'width', '24');\n svg.setAttributeNS(null, 'height', '24');\n svg.classList.add('verified-icon');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-background');\n use.classList.add('verified-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-check');\n use2.classList.add('verified-check');\n\n svg.append(use, use2);\n\n return svg;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\n\r\nconst getEvent = (e: TouchEvent | MouseEvent) => {\r\n return (e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent;\r\n};\r\n\r\nconst attachGlobalListenerTo = window;\r\n\r\nlet RESET_GLOBAL = false;\r\nrootScope.addEventListener('context_menu_toggle', (visible) => {\r\n RESET_GLOBAL = visible;\r\n});\r\n\r\nexport type SwipeHandlerOptions = {\r\n element: SwipeHandler['element'],\r\n onSwipe: SwipeHandler['onSwipe'],\r\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\r\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\r\n onReset?: SwipeHandler['onReset'],\r\n cursor?: SwipeHandler['cursor'],\r\n cancelEvent?: SwipeHandler['cancelEvent'],\r\n listenerOptions?: SwipeHandler['listenerOptions']\r\n};\r\n\r\nexport default class SwipeHandler {\r\n private element: HTMLElement;\r\n private onSwipe: (xDiff: number, yDiff: number, e: TouchEvent | MouseEvent) => boolean | void;\r\n private verifyTouchTarget: (evt: TouchEvent | MouseEvent) => boolean;\r\n private onFirstSwipe: () => void;\r\n private onReset: () => void;\r\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\r\n private cancelEvent = true;\r\n private listenerOptions: boolean | AddEventListenerOptions = false;\r\n private setCursorTo: HTMLElement;\r\n\r\n private hadMove = false;\r\n private xDown: number = null;\r\n private yDown: number = null;\r\n\r\n constructor(options: SwipeHandlerOptions) {\r\n safeAssign(this, options);\r\n \r\n this.setCursorTo = this.element;\r\n\r\n this.setListeners();\r\n }\r\n\r\n public setListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.addEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.addEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.addEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public removeListeners() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.removeEventListener('mousedown', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('mouseup', this.reset);\r\n } else {\r\n this.element.removeEventListener('touchstart', this.handleStart, this.listenerOptions);\r\n attachGlobalListenerTo.removeEventListener('touchend', this.reset);\r\n }\r\n }\r\n\r\n public setCursor(cursor: SwipeHandler['cursor']) {\r\n this.cursor = cursor;\r\n \r\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n }\r\n\r\n reset = (e?: Event) => {\r\n /* if(e) {\r\n cancelEvent(e);\r\n } */\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.removeEventListener('touchmove', this.handleMove, {capture: true});\r\n } else {\r\n attachGlobalListenerTo.removeEventListener('mousemove', this.handleMove);\r\n this.setCursorTo.style.cursor = '';\r\n }\r\n\r\n if(this.onReset && this.hadMove) {\r\n this.onReset();\r\n }\r\n\r\n this.xDown = this.yDown = null;\r\n this.hadMove = false;\r\n };\r\n\r\n handleStart = (_e: TouchEvent | MouseEvent) => {\r\n const e = getEvent(_e);\r\n if(this.verifyTouchTarget && !this.verifyTouchTarget(_e)) {\r\n return this.reset();\r\n }\r\n\r\n this.xDown = e.clientX;\r\n this.yDown = e.clientY;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachGlobalListenerTo.addEventListener('touchmove', this.handleMove, {passive: false, capture: true});\r\n } else {\r\n attachGlobalListenerTo.addEventListener('mousemove', this.handleMove, false);\r\n }\r\n };\r\n\r\n handleMove = (_e: TouchEvent | MouseEvent) => {\r\n if(this.xDown === null || this.yDown === null || RESET_GLOBAL) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if(this.cancelEvent) {\r\n cancelEvent(_e);\r\n }\r\n\r\n const e = getEvent(_e);\r\n const xUp = e.clientX;\r\n const yUp = e.clientY;\r\n\r\n const xDiff = this.xDown - xUp;\r\n const yDiff = this.yDown - yUp;\r\n\r\n if(!this.hadMove) {\r\n if(!xDiff && !yDiff) {\r\n return;\r\n }\r\n\r\n this.hadMove = true;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\r\n }\r\n\r\n if(this.onFirstSwipe) {\r\n this.onFirstSwipe();\r\n }\r\n }\r\n\r\n // if(Math.abs(xDiff) > Math.abs(yDiff)) { /*most significant*/\r\n // if(xDiff > 0) { /* left swipe */ \r\n\r\n // } else { /* right swipe */\r\n\r\n // } \r\n // } else {\r\n // if(yDiff > 0) { /* up swipe */ \r\n \r\n // } else { /* down swipe */\r\n \r\n // }\r\n // }\r\n\r\n /* reset values */\r\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\r\n if(onSwipeResult !== undefined && onSwipeResult) {\r\n this.reset();\r\n }\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport filterChatPhotosMessages from \"../helpers/filterChatPhotosMessages\";\nimport ListLoader from \"../helpers/listLoader\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { Message, ChatFull, MessageAction, Photo } from \"../layer\";\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\nimport appMessagesManager, { AppMessagesManager } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { openAvatarViewer } from \"./avatar\";\nimport Scrollable from \"./scrollable\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { wrapPhoto } from \"./wrappers\";\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void> = new Map();\n\n constructor(public scrollable: Scrollable) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n \n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) \n || (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n \n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n });\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, lastIndex = 0, minX = 0;\n const swipeHandler = new SwipeHandler({\n element: this.avatars, \n onSwipe: (xDiff, yDiff) => {\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n //console.log(xDiff, yDiff);\n return false;\n }, \n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n }, \n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n \n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n \n //console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = (anchor || listLoader.current) as any;\n return appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then(value => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(appProfileManager.getChatFull(peerId.toChatId()));\n }\n \n promises.push(appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then((result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = value.history.findAndSplice(m => {\n return ((m as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n \n listLoader.current = message || appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n //console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n //const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = (photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container');\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ? \n appPhotosManager.getPhoto(photoId) : \n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = () => {\n if(photo) {\n const res = wrapPhoto({\n container: avatar,\n photo,\n size: appPhotosManager.choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n \n [res.images.thumb, res.images.full].filter(Boolean).forEach(img => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n appAvatarsManager.putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.avatars.append(avatar);\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach(target => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from \"../environment/parallaxSupport\";\nimport { copyTextToClipboard } from \"../helpers/clipboard\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { User } from \"../layer\";\nimport { Channel } from \"../lib/appManagers/appChatsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport I18n from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport AvatarElement from \"./avatar\";\nimport CheckboxField from \"./checkboxField\";\nimport generateVerifiedIcon from \"./generateVerifiedIcon\";\nimport PeerProfileAvatars from \"./peerProfileAvatars\";\nimport PeerTitle from \"./peerTitle\";\nimport Row from \"./row\";\nimport Scrollable from \"./scrollable\";\nimport { SettingSection, generateDelimiter } from \"./sidebarLeft\";\nimport { toast } from \"./toast\";\n\nlet setText = (text: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = text;\n row.container.style.display = '';\n //});\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n public avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n \n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n constructor(public scrollable: Scrollable) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.avatar = new AvatarElement();\n this.avatar.classList.add('profile-avatar', 'avatar-120');\n this.avatar.setAttribute('dialog', '1');\n this.avatar.setAttribute('clickable', '');\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitleLangKey: 'UserBio',\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n \n appProfileManager.getProfileByPeerId(this.peerId).then(full => {\n copyTextToClipboard(full.about);\n toast(I18n.format('BioCopied', true));\n });\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n const peer: Channel | User.user = appPeersManager.getPeer(this.peerId);\n copyTextToClipboard('@' + peer.username);\n toast(I18n.format('UsernameCopied', true));\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitleLangKey: 'Phone',\n icon: 'phone',\n clickable: () => {\n const peer: User = appUsersManager.getUser(this.peerId);\n copyTextToClipboard('+' + peer.phone);\n toast(I18n.format('PhoneCopied', true));\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute'\n });\n \n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.notifications.container\n );\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n this.notifications.checkboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n //let checked = this.notificationsCheckbox.checked;\n appMessagesManager.mutePeer(this.peerId);\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = appNotificationsManager.isPeerLocalMuted(this.peerId, false);\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n rootScope.addEventListener('user_update', (userId) => {\n if(this.peerId === userId) {\n this.setPeerStatus();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n const user = appUsersManager.getUser(userId);\n if(!user.pFlags.self) {\n if(user.phone) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n } else {\n this.phone.container.style.display = 'none';\n }\n }\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n }\n\n public setPeerStatus = (needClear = false) => {\n if(!this.peerId) return;\n\n const peerId = this.peerId;\n appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, true, () => peerId === this.peerId);\n };\n\n public cleanupHTML() {\n this.bio.container.style.display = 'none';\n this.phone.container.style.display = 'none';\n this.username.container.style.display = 'none';\n this.location.container.style.display = 'none';\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n }\n\n public setAvatar() {\n if(this.peerId !== rootScope.myId) {\n const photo = appPeersManager.getPeerPhoto(this.peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable);\n this.avatars.setPeer(this.peerId);\n this.avatars.info.append(this.name, this.subtitle);\n \n this.avatar.remove();\n \n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n\n return;\n }\n }\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars = undefined;\n }\n\n this.avatar.setAttribute('peer', '' + this.peerId);\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n }\n\n public fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n \n const peerId = this.peerId;\n\n this.cleanupHTML();\n\n this.setAvatar();\n\n // username\n if(peerId !== rootScope.myId) {\n let username = appPeersManager.getPeerUsername(peerId);\n if(username) {\n setText(appPeersManager.getPeerUsername(peerId), this.username);\n }\n \n const muted = appNotificationsManager.isPeerLocalMuted(peerId, false);\n this.notifications.checkboxField.checked = !muted;\n } else {\n fastRaf(() => {\n this.notifications.container.style.display = 'none';\n });\n }\n \n //let membersLi = this.profileTabs.firstElementChild.children[0] as HTMLLIElement;\n if(peerId.isUser()) {\n //membersLi.style.display = 'none';\n\n let user = appUsersManager.getUser(peerId);\n if(user.phone && peerId !== rootScope.myId) {\n setText(appUsersManager.formatUserPhone(user.phone), this.phone);\n }\n }/* else {\n //membersLi.style.display = appPeersManager.isBroadcast(peerId) ? 'none' : '';\n } */\n\n this.setMoreDetails();\n\n replaceContent(this.name, new PeerTitle({\n peerId,\n dialog: true,\n }).element);\n\n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n this.name.append(generateVerifiedIcon());\n }\n\n this.setPeerStatus(true);\n }\n\n public setMoreDetails(override?: true) {\n if(this.setMoreDetailsTimeout) {\n window.clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = 0;\n }\n\n const peerId = this.peerId;\n const threadId = this.threadId;\n\n if(!peerId) {\n return;\n }\n\n let promise: Promise;\n if(peerId.isUser()) {\n promise = appProfileManager.getProfile(peerId, override).then(userFull => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n if(userFull.rAbout && peerId !== rootScope.myId) {\n setText(userFull.rAbout, this.bio);\n }\n \n //this.log('userFull', userFull);\n return true;\n });\n } else {\n promise = appProfileManager.getChatFull(peerId.toChatId(), override).then((chatFull) => {\n if(this.peerId !== peerId || this.threadId !== threadId) {\n //this.log.warn('peer changed');\n return false;\n }\n \n //this.log('chatInfo res 2:', chatFull);\n \n if(chatFull.about) {\n setText(RichTextProcessor.wrapRichText(chatFull.about), this.bio);\n }\n\n // @ts-ignore\n if(chatFull?.location?._ == 'channelLocation') {\n // @ts-ignore\n setText(chatFull.location.address, this.location);\n }\n\n return true;\n });\n }\n\n promise.then((canSetNext) => {\n if(canSetNext) {\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n }\n });\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n if(this.init) {\n this.init();\n }\n\n this.peerId = peerId;\n this.threadId = threadId;\n \n this.cleaned = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../../lib/rootScope\";\nimport AppSearchSuper, { SearchSuperType } from \"../../appSearchSuper.\";\nimport SidebarSlider, { SliderSuperTab } from \"../../slider\";\nimport { TransitionSlider } from \"../../transition\";\nimport AppEditChatTab from \"./editChat\";\nimport PeerTitle from \"../../peerTitle\";\nimport AppEditContactTab from \"./editContact\";\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\nimport Button from \"../../button\";\nimport ButtonIcon from \"../../buttonIcon\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { toastNew } from \"../../toast\";\nimport AppAddMembersTab from \"../../sidebarLeft/tabs/addMembers\";\nimport PopupPickUser from \"../../popups/pickUser\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions } from \"../../popups/peer\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PeerProfile from \"../../peerProfile\";\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n\n private historiesStorage: {\n [peerId: PeerId]: Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n }>\n } = {};\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n constructor(slider: SidebarSlider) {\n super(slider, false);\n }\n\n public init() {\n //const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n \n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.title.append(i18n('Profile'));\n this.editBtn = ButtonIcon('edit');\n //const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.scrollable);\n this.profile.init();\n \n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect(); \n if(!rect.width) return;\n\n const top = rect.top - 1;\n const isSharedMedia = top <= HEADER_HEIGHT;\n animatedCloseIcon.classList.toggle('state-back', isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider(transitionContainer, 'slide-fade', 400, null, false);\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(this.closeBtn.firstElementChild.classList.contains('state-back')) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement, \n position: 'start'\n });\n transition(0);\n animatedCloseIcon.classList.remove('state-back');\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n });\n\n attachClickEvent(this.editBtn, (e) => {\n let tab: AppEditChatTab | AppEditContactTab;\n if(this.peerId.isAnyChat()) {\n tab = new AppEditChatTab(this.slider);\n } else {\n tab = new AppEditContactTab(this.slider);\n }\n\n if(tab) {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = this.peerId.toChatId();\n } else {\n tab.peerId = this.peerId;\n }\n \n tab.open();\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {\n for(const peerId in msgIdsByPeer) {\n this.renderNewMessages(peerId.toPeerId(), Array.from(msgIdsByPeer[peerId]));\n }\n });\n \n rootScope.addEventListener('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n rootScope.addEventListener('message_sent', ({message}) => {\n this.renderNewMessages(message.peerId, [message.mid]);\n });\n\n //this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n let timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n }\n });\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n btnAddMembers.addEventListener('click', () => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map(peerId => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n \n if(isChannel) {\n const tab = new AppAddMembersTab(this.slider);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n },\n });\n }\n });\n\n //console.log('construct shared media time:', performance.now() - perf);\n }\n\n public renderNewMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n \n mids = mids.slice().reverse(); // ! because it will be ascend sorted array\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const filtered = this.searchSuper.filterMessagesByType(mids.map(mid => appMessagesManager.getMessageByPeer(peerId, mid)), inputFilter);\n if(filtered.length) {\n const history = this.historiesStorage[peerId][inputFilter];\n if(history) {\n history.unshift(...filtered.map(message => ({mid: message.mid, peerId: message.peerId})));\n }\n\n if(this.peerId === peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n if(!this.historiesStorage[peerId]) return;\n\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = this.historiesStorage[peerId][inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex(m => m.mid === mid);\n if(idx !== -1) {\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`div[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n \n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n this.searchSuper.usedFromHistory[inputFilter]--;\n }\n }\n\n break;\n }\n }\n }\n\n this.scrollable.onScroll();\n }\n\n public cleanupHTML() {\n // const perf = performance.now();\n this.profile.cleanupHTML();\n \n this.editBtn.classList.add('hide');\n\n this.searchSuper.cleanupHTML(true);\n\n this.container.classList.toggle('can-add-members', this.searchSuper.canViewMembers() && appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users'));\n\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId = 0) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId, \n //threadId, \n historyStorage: this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {})\n });\n\n this.profile.setPeer(peerId, threadId);\n \n return true;\n }\n\n public fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n\n this.cleanupHTML();\n\n this.profile.fillProfileElements();\n\n this.toggleEditBtn();\n }\n\n private toggleEditBtn() {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && appUsersManager.isContact(this.peerId.toUserId());\n } else {\n show = appChatsManager.hasRights(this.peerId.toChatId(), 'change_info');\n }\n\n this.editBtn.classList.toggle('hide', !show);\n }\n\n public loadSidebarMedia(single: boolean, justLoad = false) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppSharedMediaTab = AppSharedMediaTab);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport SidebarSlider from \"../slider\";\r\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\r\nimport AppSharedMediaTab from \"./tabs/sharedMedia\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\r\n\r\nexport class AppSidebarRight extends SidebarSlider {\r\n public sharedMediaTab: AppSharedMediaTab;\r\n private isColumnProportionSet = false;\r\n\r\n constructor() {\r\n super({\r\n sidebarEl: document.getElementById('column-right') as HTMLElement,\r\n canHideFirst: true,\r\n navigationType: 'right'\r\n });\r\n\r\n mediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\r\n this.toggleSidebar(false);\r\n }\r\n });\r\n\r\n mediaSizes.addEventListener('resize', () => {\r\n this.setColumnProportion();\r\n });\r\n\r\n this.sharedMediaTab = new AppSharedMediaTab(this);\r\n }\r\n\r\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\r\n if(!this.historyTabIds.length) {\r\n this.toggleSidebar(false, animate);\r\n }\r\n\r\n super.onCloseTab(id, animate, isNavigation);\r\n }\r\n\r\n /* public selectTab(id: number) {\r\n const res = super.selectTab(id);\r\n\r\n if(id !== -1) {\r\n this.toggleSidebar(true);\r\n }\r\n\r\n return res;\r\n } */\r\n\r\n private setColumnProportion() {\r\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\r\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\r\n }\r\n\r\n public toggleSidebar(enable?: boolean, animate?: boolean) {\r\n /////this.log('sidebarEl', this.sidebarEl, enable, isElementInViewport(this.sidebarEl));\r\n\r\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\r\n let willChange: boolean;\r\n if(enable !== undefined) {\r\n if(enable) {\r\n if(!active) {\r\n willChange = true;\r\n }\r\n } else if(active) {\r\n willChange = true;\r\n }\r\n } else {\r\n willChange = true;\r\n }\r\n\r\n if(!willChange) return Promise.resolve();\r\n\r\n if(!active && !this.historyTabIds.length) {\r\n this.sharedMediaTab.open();\r\n //this.selectTab(this.sharedMediaTab);\r\n }\r\n\r\n if(!this.isColumnProportionSet) {\r\n this.setColumnProportion();\r\n this.isColumnProportionSet = true;\r\n }\r\n\r\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\r\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\r\n return animationPromise;\r\n\r\n /* return new Promise((resolve, reject) => {\r\n const hidden: {element: HTMLDivElement, height: number}[] = [];\r\n const observer = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const bubble = entry.target as HTMLDivElement;\r\n if(!entry.isIntersecting) {\r\n hidden.push({element: bubble, height: bubble.scrollHeight});\r\n }\r\n }\r\n \r\n for(const item of hidden) {\r\n item.element.style.minHeight = item.height + 'px';\r\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\r\n item.element.style.width = '1px';\r\n }\r\n \r\n //console.log('hidden', hidden);\r\n observer.disconnect();\r\n \r\n set();\r\n \r\n setTimeout(() => {\r\n for(const item of hidden) {\r\n item.element.style.minHeight = '';\r\n item.element.style.width = '';\r\n (item.element.firstElementChild as HTMLElement).style.display = '';\r\n }\r\n\r\n resolve();\r\n }, 200);\r\n });\r\n \r\n const length = Object.keys(appImManager.bubbles).length;\r\n if(length) {\r\n for(const i in appImManager.bubbles) {\r\n observer.observe(appImManager.bubbles[i]);\r\n }\r\n } else {\r\n set();\r\n setTimeout(resolve, 200);\r\n }\r\n }); */\r\n }\r\n}\r\n\r\nconst appSidebarRight = new AppSidebarRight();\r\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\r\nexport default appSidebarRight;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport appSidebarRight from \"..\";\r\nimport appPollsManager from \"../../../lib/appManagers/appPollsManager\";\r\nimport { roundPercents } from \"../../poll\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { ripple } from \"../../ripple\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\n\r\nexport default class AppPollResultsTab extends SliderSuperTab {\r\n private resultsDiv: HTMLElement;\r\n\r\n protected init() {\r\n this.container.id = 'poll-results-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.resultsDiv = document.createElement('div');\r\n this.resultsDiv.classList.add('poll-results');\r\n this.scrollable.append(this.resultsDiv);\r\n }\r\n\r\n public open(message: any) {\r\n const ret = super.open();\r\n const poll = appPollsManager.getPoll(message.media.poll.id);\r\n\r\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\r\n\r\n const title = document.createElement('h3');\r\n title.innerHTML = poll.poll.rQuestion;\r\n\r\n const percents = poll.results.results.map(v => v.voters / poll.results.total_voters * 100);\r\n roundPercents(percents);\r\n\r\n const fragment = document.createDocumentFragment();\r\n poll.results.results.forEach((result, idx) => {\r\n if(!result.voters) return;\r\n\r\n const hr = document.createElement('hr');\r\n\r\n const answer = poll.poll.answers[idx];\r\n\r\n // Head\r\n const answerEl = document.createElement('div');\r\n answerEl.classList.add('poll-results-answer');\r\n\r\n const answerTitle = document.createElement('div');\r\n answerTitle.innerHTML = RichTextProcessor.wrapEmojiText(answer.text);\r\n\r\n const answerPercents = document.createElement('div');\r\n answerPercents.innerText = Math.round(percents[idx]) + '%';\r\n\r\n answerEl.append(answerTitle, answerPercents);\r\n\r\n // Humans\r\n const list = appDialogsManager.createChatList();\r\n list.classList.add('poll-results-voters');\r\n\r\n appDialogsManager.setListClickListener(list, () => {\r\n appSidebarRight.onCloseBtnClick();\r\n }, undefined, true);\r\n\r\n list.style.minHeight = Math.min(result.voters, 4) * 50 + 'px';\r\n\r\n fragment.append(hr, answerEl, list);\r\n\r\n let offset: string, limit = 4, loading = false, left = result.voters - 4;\r\n const load = () => {\r\n if(loading) return;\r\n loading = true;\r\n\r\n appPollsManager.getVotes(message, answer.option, offset, limit).then(votesList => {\r\n votesList.votes.forEach(vote => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: vote.user_id.toPeerId(false),\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: false, \r\n meAsSaved: false,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n });\r\n\r\n if(offset) {\r\n left -= votesList.votes.length;\r\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n }\r\n \r\n offset = votesList.next_offset;\r\n limit = 20;\r\n\r\n if(!left || !votesList.votes.length) {\r\n showMore.remove();\r\n }\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n\r\n load();\r\n\r\n if(left <= 0) return;\r\n\r\n const showMore = document.createElement('div');\r\n showMore.classList.add('poll-results-more', 'show-more', 'rp-overflow');\r\n showMore.addEventListener('click', load);\r\n ripple(showMore);\r\n const down = document.createElement('div');\r\n down.classList.add('tgico-down');\r\n showMore.append(down, i18n('PollResults.LoadMore', [Math.min(20, left)]));\r\n\r\n fragment.append(showMore);\r\n });\r\n\r\n this.resultsDiv.append(title, fragment);\r\n\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n /* appPollsManager.getVotes(mid).then(votes => {\r\n console.log('gOt VotEs', votes);\r\n }); */\r\n });\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport appImManager from \"../lib/appManagers/appImManager\";\r\nimport appPollsManager from \"../lib/appManagers/appPollsManager\";\r\nimport serverTimeManager from \"../lib/mtproto/serverTimeManager\";\r\nimport { RichTextProcessor } from \"../lib/richtextprocessor\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { ripple } from \"./ripple\";\r\nimport appSidebarRight from \"./sidebarRight\";\r\nimport AppPollResultsTab from \"./sidebarRight/tabs/pollResults\";\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport windowSize from \"../helpers/windowSize\";\r\nimport { Poll, PollResults } from \"../layer\";\r\n\r\nlet lineTotalLength = 0;\r\nconst tailLength = 9;\r\nconst times = 10;\r\nconst fullTime = 340;\r\nconst oneTime = fullTime / times;\r\n\r\nexport const roundPercents = (percents: number[]) => {\r\n //console.log('roundPercents before percents:', percents);\r\n\r\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\r\n if(sum > 100) {\r\n const diff = sum - 100;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, minRemainder = 1;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder >= 0.5 && remainder < minRemainder) {\r\n minRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] -= minRemainder;\r\n }\r\n } else if(sum < 100) {\r\n const diff = 100 - sum;\r\n const length = percents.length;\r\n for(let i = 0; i < diff; ++i) {\r\n let minIndex = -1, maxRemainder = 0;\r\n for(let k = 0; k < length; ++k) {\r\n let remainder = percents[k] % 1;\r\n if(remainder < 0.5 && remainder > maxRemainder) {\r\n maxRemainder = remainder;\r\n minIndex = k;\r\n }\r\n }\r\n\r\n if(minIndex === -1) {\r\n //throw new Error('lol chto');\r\n return;\r\n }\r\n\r\n percents[minIndex] += 1 - maxRemainder;\r\n }\r\n }\r\n\r\n //console.log('roundPercents after percents:', percents);\r\n};\r\n\r\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\r\nrootScope.on('poll_update', (e) => {\r\n const {poll, results} = e as {poll: Poll, results: PollResults};\r\n\r\n //console.log('poll_update', poll, results);\r\n for(const connected of connectedPolls) {\r\n if(connected.id === poll.id) {\r\n const pollElement = connected.element;\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n }\r\n }\r\n}); */\r\n\r\nrootScope.addEventListener('poll_update', ({poll, results}) => {\r\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n //console.log('poll_update', poll, results);\r\n pollElement.isClosed = !!poll.pFlags.closed;\r\n pollElement.performResults(results, poll.chosenIndexes);\r\n });\r\n});\r\n\r\nrootScope.addEventListener('peer_changed', () => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n});\r\n\r\nmediaSizes.addEventListener('resize', () => {\r\n PollElement.setMaxLength();\r\n PollElement.resizePolls();\r\n});\r\n\r\nmediaSizes.addEventListener('changeScreen', () => {\r\n PollElement.setMaxLength();\r\n});\r\n\r\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\r\n element.classList.remove('active');\r\n\r\n clearTimeout(timeout);\r\n setTimeout(() => {\r\n onHide();\r\n element.remove();\r\n\r\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\r\n prevQuizHint = prevQuizHintOnHide = null;\r\n prevQuizHintTimeout = 0;\r\n }\r\n }, 200);\r\n};\r\n\r\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\r\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\r\n if(prevQuizHint) {\r\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\r\n }\r\n\r\n const element = document.createElement('div');\r\n element.classList.add('quiz-hint');\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('container', 'tgico');\r\n\r\n const textEl = document.createElement('div');\r\n textEl.classList.add('text');\r\n\r\n container.append(textEl);\r\n element.append(container);\r\n\r\n textEl.innerHTML = RichTextProcessor.wrapRichText(solution, {entities: solution_entities});\r\n appImManager.chat.bubbles.bubblesContainer.append(element);\r\n\r\n void element.offsetLeft; // reflow\r\n element.classList.add('active');\r\n\r\n prevQuizHint = element;\r\n prevQuizHintOnHide = onHide;\r\n prevQuizHintTimeout = window.setTimeout(() => {\r\n hideQuizHint(element, onHide, prevQuizHintTimeout);\r\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\r\n};\r\n\r\nexport default class PollElement extends HTMLElement {\r\n public static MAX_OFFSET = -46.5;\r\n public static MAX_LENGTH = 0;\r\n public svgLines: SVGSVGElement[];\r\n private numberDivs: HTMLDivElement[];\r\n private answerDivs: HTMLDivElement[];\r\n private descDiv: HTMLElement;\r\n private typeDiv: HTMLElement;\r\n private avatarsDiv: HTMLElement;\r\n private viewResults: HTMLElement;\r\n private votersCountDiv: HTMLDivElement;\r\n\r\n // private maxLength: number;\r\n // private maxLengths: number[];\r\n private maxPercents: number[];\r\n\r\n public isClosed = false;\r\n private isQuiz = false;\r\n private isRetracted = false;\r\n private isPublic = false;\r\n private isMultiple = false;\r\n private chosenIndexes: number[] = [];\r\n private percents: number[];\r\n\r\n public message: any;\r\n\r\n private quizInterval: number;\r\n private quizTimer: SVGSVGElement;\r\n\r\n private sendVoteBtn: HTMLElement;\r\n private chosingIndexes: number[] = [];\r\n\r\n private sendVotePromise: Promise;\r\n private sentVote = false;\r\n\r\n constructor() {\r\n super();\r\n // элемент создан\r\n }\r\n\r\n public static setMaxLength() {\r\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\r\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\r\n }\r\n\r\n public static resizePolls() {\r\n if(!this.MAX_LENGTH) return;\r\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\r\n pollElements.forEach(pollElement => {\r\n pollElement.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n pollElement.setLineProgress(idx, 1);\r\n });\r\n });\r\n }\r\n\r\n public render() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n if(!lineTotalLength) {\r\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\r\n //console.log('line total length:', lineTotalLength);\r\n PollElement.setMaxLength();\r\n }\r\n\r\n const pollId = this.message.media.poll.id;\r\n const {poll, results} = appPollsManager.getPoll(pollId);\r\n\r\n /* const timestamp = Date.now() / 1000 | 0;\r\n if(timestamp < this.message.date) { */\r\n if(this.message.pFlags.is_scheduled) {\r\n this.classList.add('disable-hover');\r\n }\r\n\r\n //console.log('pollElement poll:', poll, results);\r\n\r\n let descKey: LangPackKey;\r\n if(poll.pFlags) {\r\n this.isPublic = !!poll.pFlags.public_voters;\r\n this.isQuiz = !!poll.pFlags.quiz;\r\n this.isClosed = !!poll.pFlags.closed;\r\n this.isMultiple = !!poll.pFlags.multiple_choice;\r\n\r\n if(this.isClosed) {\r\n descKey = 'Chat.Poll.Type.Closed';\r\n this.classList.add('is-closed');\r\n } else if(this.isQuiz) {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\r\n } else {\r\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\r\n }\r\n }\r\n\r\n this.classList.toggle('is-multiple', this.isMultiple);\r\n\r\n const multipleSelect = this.isMultiple ? '' : '';\r\n const votes = poll.answers.map((answer, idx) => {\r\n return `\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n ${multipleSelect}\r\n
\r\n
\r\n
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\r\n\r\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\r\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\r\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\r\n\r\n if(descKey) {\r\n this.typeDiv.append(i18n(descKey));\r\n }\r\n\r\n if(this.isQuiz) {\r\n this.classList.add('is-quiz');\r\n\r\n if(poll.close_period && poll.close_date) {\r\n const timeLeftDiv = document.createElement('div');\r\n timeLeftDiv.classList.add('poll-time');\r\n this.descDiv.append(timeLeftDiv);\r\n\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n //svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\r\n svg.classList.add('poll-quiz-timer');\r\n\r\n this.quizTimer = svg;\r\n\r\n const strokeWidth = 2;\r\n const radius = 7;\r\n const circumference = 2 * Math.PI * radius;\r\n\r\n const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\r\n circle.classList.add('poll-quiz-timer-circle');\r\n circle.setAttributeNS(null, 'cx', '16');\r\n circle.setAttributeNS(null, 'cy', '16');\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\r\n\r\n svg.append(circle);\r\n this.descDiv.append(svg);\r\n \r\n const period = poll.close_period * 1000;\r\n const closeTime = (poll.close_date - serverTimeManager.serverTimeOffset) * 1000;\r\n\r\n //console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\r\n\r\n // let time = Date.now();\r\n // let percents = (closeTime - time) / period;\r\n\r\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\r\n\r\n // // @ts-ignore\r\n // circle.style.strokeDashoffset = circumference + percents * circumference;\r\n // circle.style.strokeDasharray = ${circumference} ${circumference};\r\n\r\n this.quizInterval = window.setInterval(() => {\r\n const time = Date.now();\r\n const percents = (closeTime - time) / period;\r\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\r\n timeLeftDiv.innerHTML = String(timeLeft).toHHMMSS();\r\n \r\n if (timeLeft <= 5) {\r\n timeLeftDiv.style.color = '#ee545c';\r\n circle.style.stroke = '#ee545c';\r\n }\r\n //timeLeftDiv.style.visibility = 'visible';\r\n\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference + percents * circumference;\r\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\r\n\r\n if(time >= closeTime) {\r\n clearInterval(this.quizInterval);\r\n timeLeftDiv.innerHTML = '';\r\n // @ts-ignore\r\n circle.style.strokeDashoffset = circumference;\r\n this.quizInterval = 0;\r\n\r\n setTimeout(() => {\r\n // нужно запросить апдейт чтобы опрос обновился\r\n appPollsManager.getResults(this.message);\r\n }, 3e3);\r\n }\r\n }, 1e3);\r\n }\r\n }\r\n \r\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\r\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\r\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\r\n\r\n const footerDiv = document.createElement('div');\r\n footerDiv.classList.add('poll-footer');\r\n\r\n this.viewResults = document.createElement('div');\r\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\r\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\r\n\r\n this.votersCountDiv = document.createElement('div');\r\n this.votersCountDiv.className = 'poll-votes-count';\r\n\r\n footerDiv.append(this.viewResults, this.votersCountDiv);\r\n this.append(footerDiv);\r\n\r\n this.viewResults.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n\r\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\r\n new AppPollResultsTab(appSidebarRight).open(this.message);\r\n }\r\n });\r\n ripple(this.viewResults);\r\n\r\n if(this.isMultiple) {\r\n this.sendVoteBtn = document.createElement('div');\r\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\r\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\r\n ripple(this.sendVoteBtn);\r\n\r\n if(!poll.chosenIndexes.length) {\r\n this.votersCountDiv.classList.add('hide');\r\n }\r\n\r\n attachClickEvent(this.sendVoteBtn, (e) => {\r\n cancelEvent(e);\r\n /* const indexes = this.answerDivs.filter(el => el.classList.contains('is-chosing')).map(el => +el.dataset.index);\r\n if(indexes.length) {\r\n \r\n } */\r\n if(this.chosingIndexes.length) {\r\n this.sendVotes(this.chosingIndexes).then(() => {\r\n this.chosingIndexes.length = 0;\r\n this.answerDivs.forEach(el => {\r\n el.classList.remove('is-chosing');\r\n });\r\n });\r\n }\r\n });\r\n\r\n footerDiv.append(this.sendVoteBtn);\r\n }\r\n\r\n // const width = this.getBoundingClientRect().width;\r\n // const width = mediaSizes.active.poll.width;\r\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\r\n\r\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\r\n if(!canVote || this.isPublic) {\r\n this.performResults(results, poll.chosenIndexes, false);\r\n }\r\n\r\n if(canVote) {\r\n this.setVotersCount(results);\r\n attachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n\r\n initQuizHint(results: PollResults) {\r\n if(results.solution && results.solution_entities) {\r\n const toggleHint = document.createElement('div');\r\n toggleHint.classList.add('tgico-tip', 'poll-hint');\r\n this.descDiv.append(toggleHint);\r\n\r\n //let active = false;\r\n attachClickEvent(toggleHint, (e) => {\r\n cancelEvent(e);\r\n\r\n //active = true;\r\n toggleHint.classList.add('active');\r\n setQuizHint(results.solution, results.solution_entities, () => {\r\n //active = false;\r\n toggleHint.classList.remove('active');\r\n });\r\n });\r\n\r\n if(this.sentVote) {\r\n const correctResult = results.results.find(r => r.pFlags.correct);\r\n if(correctResult && !correctResult.pFlags.chosen) {\r\n toggleHint.click();\r\n }\r\n }\r\n }\r\n }\r\n\r\n clickHandler(e: Event) {\r\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n \r\n cancelEvent(e);\r\n const answerIndex = +target.dataset.index;\r\n if(this.isMultiple) {\r\n target.classList.toggle('is-chosing');\r\n\r\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\r\n if(foundIndex !== -1) {\r\n this.chosingIndexes.splice(foundIndex, 1);\r\n } else {\r\n this.chosingIndexes.push(answerIndex);\r\n }\r\n } else {\r\n this.sendVotes([answerIndex]);\r\n }\r\n \r\n /* target.classList.add('is-voting');\r\n setTimeout(() => { // simulate\r\n this.setResults([100, 0], answerIndex);\r\n target.classList.remove('is-voting');\r\n }, 1000); */\r\n }\r\n\r\n sendVotes(indexes: number[]) {\r\n if(this.sendVotePromise) return this.sendVotePromise;\r\n\r\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\r\n targets.forEach(target => {\r\n target.classList.add('is-voting');\r\n });\r\n \r\n this.classList.add('disable-hover');\r\n this.sentVote = true;\r\n return this.sendVotePromise = appPollsManager.sendVote(this.message, indexes).then(() => {\r\n targets.forEach(target => {\r\n target.classList.remove('is-voting');\r\n });\r\n\r\n this.classList.remove('disable-hover');\r\n }).catch(() => {\r\n this.sentVote = false;\r\n }).finally(() => {\r\n this.sendVotePromise = null;\r\n });\r\n }\r\n\r\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\r\n });\r\n\r\n if(this.initQuizHint) {\r\n this.initQuizHint(results);\r\n this.initQuizHint = null;\r\n }\r\n\r\n if(this.quizInterval) {\r\n clearInterval(this.quizInterval);\r\n this.quizInterval = 0;\r\n }\r\n\r\n if(this.quizTimer?.parentElement) {\r\n this.quizTimer.remove();\r\n }\r\n\r\n const timeEl = this.descDiv.querySelector('.poll-time');\r\n if(timeEl) {\r\n timeEl.remove();\r\n }\r\n }\r\n\r\n if(this.isClosed) {\r\n this.classList.add('is-closed');\r\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\r\n }\r\n\r\n // set chosen\r\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\r\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\r\n this.chosenIndexes = chosenIndexes.slice();\r\n\r\n if(this.isRetracted) {\r\n attachClickEvent(this, this.clickHandler);\r\n } else {\r\n detachClickEvent(this, this.clickHandler);\r\n }\r\n }\r\n \r\n // is need update\r\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\r\n const percents = results.results.map(v => results.total_voters ? v.voters / results.total_voters * 100 : 0);\r\n\r\n this.classList.toggle('no-transition', !animate);\r\n if(animate) {\r\n SetTransition(this, '', !this.isRetracted, 340);\r\n }\r\n\r\n fastRaf(() => {\r\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\r\n this.percents = percents;\r\n this.isRetracted = false;\r\n });\r\n }\r\n \r\n this.setVotersCount(results);\r\n\r\n if(this.isPublic) {\r\n if(!this.isMultiple) {\r\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\r\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\r\n }\r\n\r\n let html = '';\r\n /**\r\n * MACOS, ANDROID - без реверса\r\n * WINDOWS DESKTOP - реверс\r\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\r\n */\r\n (results.recent_voters || [])/* .slice().reverse() */.forEach((userId, idx) => {\r\n const style = idx === 0 ? '' : `style=\"transform: translateX(-${idx * 3}px);\"`;\r\n html += ``;\r\n });\r\n this.avatarsDiv.innerHTML = html;\r\n }\r\n\r\n if(this.isMultiple) {\r\n const isVoted = !!this.chosenIndexes.length;\r\n\r\n const hideSendVoteBtn = this.isClosed || isVoted;\r\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\r\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\r\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\r\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\r\n }\r\n }\r\n\r\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\r\n this.svgLines.forEach(svg => svg.style.display = '');\r\n\r\n this.answerDivs.forEach((el, idx) => {\r\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\r\n });\r\n\r\n const maxValue = Math.max(...percents);\r\n // this.maxLengths = percents.map(p => p / maxValue * this.maxLength);\r\n this.maxPercents = percents.map(p => p / maxValue);\r\n\r\n // line\r\n if(this.isRetracted) {\r\n this.svgLines.forEach((svg, idx) => {\r\n this.setLineProgress(idx, -1);\r\n });\r\n } else {\r\n const cb = () => {\r\n this.svgLines.forEach((svg, idx) => {\r\n //void svg.getBoundingClientRect(); // reflow\r\n this.setLineProgress(idx, 1);\r\n });\r\n };\r\n \r\n animate ? fastRaf(cb) : cb();\r\n }\r\n\r\n percents = percents.slice();\r\n roundPercents(percents);\r\n let getPercentValue: (percents: number, index: number) => number;\r\n const iterate = (i: number) => {\r\n percents.forEach((percents, idx) => {\r\n const value = getPercentValue(percents, i);\r\n this.numberDivs[idx].innerText = value + '%';\r\n });\r\n };\r\n // numbers\r\n if(this.isRetracted) {\r\n getPercentValue = (percents, index) => Math.round(percents / times * index);\r\n\r\n if(animate) {\r\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * k);\r\n }\r\n } else {\r\n iterate(0);\r\n }\r\n } else {\r\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\r\n\r\n if(animate) {\r\n for(let i = 0; i < times; ++i) {\r\n setTimeout(() => {\r\n iterate(i);\r\n }, oneTime * i);\r\n }\r\n } else {\r\n iterate(times - 1);\r\n }\r\n }\r\n\r\n if(this.isRetracted) {\r\n if(animate) {\r\n this.classList.add('is-retracting');\r\n }\r\n\r\n this.classList.remove('is-voted');\r\n const cb = () => {\r\n this.svgLines.forEach(svg => svg.style.display = 'none');\r\n };\r\n\r\n if(animate) {\r\n setTimeout(() => {\r\n this.classList.remove('is-retracting');\r\n cb();\r\n }, fullTime);\r\n } else {\r\n cb();\r\n }\r\n } else {\r\n this.classList.add('is-voted');\r\n }\r\n }\r\n\r\n setVotersCount(results: PollResults) {\r\n const votersCount = results.total_voters || 0;\r\n let key: LangPackKey, args = [votersCount];\r\n if(this.isClosed) {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\r\n } else {\r\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\r\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\r\n }\r\n \r\n replaceContent(this.votersCountDiv, i18n(key, args));\r\n }\r\n\r\n setLineProgress(index: number, multiplier: number) {\r\n const svg = this.svgLines[index];\r\n\r\n if(multiplier === -1) {\r\n svg.style.strokeDasharray = '';\r\n svg.style.strokeDashoffset = '';\r\n } else {\r\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\r\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\r\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\r\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\r\n }\r\n }\r\n\r\n // у элемента могут быть ещё другие методы и свойства\r\n}\r\n\r\ncustomElements.define(\"poll-element\", PollElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from './chat/chat';\r\nimport { getEmojiToneIndex } from '../vendor/emoji';\r\nimport { readBlobAsText } from '../helpers/blob';\r\nimport { deferredPromise } from '../helpers/cancellablePromise';\r\nimport { formatFullSentTime } from '../helpers/date';\r\nimport mediaSizes, { ScreenSize } from '../helpers/mediaSizes';\r\nimport { formatBytes } from '../helpers/number';\r\nimport { IS_SAFARI } from '../environment/userAgent';\r\nimport { Message, PhotoSize, StickerSet } from '../layer';\r\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\r\nimport appMessagesManager from '../lib/appManagers/appMessagesManager';\r\nimport appPhotosManager, { MyPhoto } from '../lib/appManagers/appPhotosManager';\r\nimport LottieLoader from '../lib/rlottie/lottieLoader';\r\nimport webpWorkerController from '../lib/webp/webpWorkerController';\r\nimport animationIntersector from './animationIntersector';\r\nimport appMediaPlaybackController, { MediaSearchContext } from './appMediaPlaybackController';\r\nimport AudioElement, { findMediaTargets } from './audio';\r\nimport ReplyContainer from './chat/replyContainer';\r\nimport { Layouter, RectPart } from './groupedLayout';\r\nimport LazyLoadQueue from './lazyLoadQueue';\r\nimport PollElement from './poll';\r\nimport ProgressivePreloader from './preloader';\r\nimport './middleEllipsis';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport appImManager from '../lib/appManagers/appImManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { onMediaLoad } from '../helpers/files';\r\nimport { animateSingle } from '../helpers/animation';\r\nimport renderImageFromUrl from '../helpers/dom/renderImageFromUrl';\r\nimport sequentialDom from '../helpers/sequentialDom';\r\nimport { fastRaf } from '../helpers/schedulers';\r\nimport appDownloadManager, { DownloadBlob, ThumbCache } from '../lib/appManagers/appDownloadManager';\r\nimport appStickersManager from '../lib/appManagers/appStickersManager';\r\nimport { cancelEvent } from '../helpers/dom/cancelEvent';\r\nimport { attachClickEvent, simulateClickEvent } from '../helpers/dom/clickEvent';\r\nimport isInDOM from '../helpers/dom/isInDOM';\r\nimport lottieLoader from '../lib/rlottie/lottieLoader';\r\nimport { clearBadCharsAndTrim } from '../helpers/cleanSearchText';\r\nimport blur from '../helpers/blur';\r\nimport IS_WEBP_SUPPORTED from '../environment/webpSupport';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\r\nimport { MiddleEllipsisElement } from './middleEllipsis';\r\nimport { joinElementsWith } from '../lib/langPack';\r\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\r\nimport { NULL_PEER_ID } from '../lib/mtproto/mtproto_config';\r\nimport findUpClassName from '../helpers/dom/findUpClassName';\r\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\r\nimport assumeType from '../helpers/assumeType';\r\nimport appMessagesIdsManager from '../lib/appManagers/appMessagesIdsManager';\r\nimport throttle from '../helpers/schedulers/throttle';\r\nimport { SendMessageEmojiInteractionData } from '../types';\r\nimport IS_VIBRATE_SUPPORTED from '../environment/vibrateSupport';\r\n\r\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\r\n\r\nlet roundVideoCircumference = 0;\r\nmediaSizes.addEventListener('changeScreen', (from, to) => {\r\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\r\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\r\n const width = mediaSizes.active.round.width;\r\n const halfSize = width / 2;\r\n const radius = halfSize - 7;\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n elements.forEach(element => {\r\n element.setAttributeNS(null, 'width', '' + width);\r\n element.setAttributeNS(null, 'height', '' + width);\r\n\r\n const circle = element.firstElementChild as SVGCircleElement;\r\n circle.setAttributeNS(null, 'cx', '' + halfSize);\r\n circle.setAttributeNS(null, 'cy', '' + halfSize);\r\n circle.setAttributeNS(null, 'r', '' + radius);\r\n\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n });\r\n }\r\n});\r\n\r\nexport function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, withoutPreloader, loadPromises, noPlayButton, noAutoDownload, size, searchContext}: {\r\n doc: MyDocument, \r\n container?: HTMLElement, \r\n message?: Message.message, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n noInfo?: true,\r\n noPlayButton?: boolean,\r\n group?: string,\r\n onlyPreview?: boolean,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n size?: PhotoSize,\r\n searchContext?: MediaSearchContext,\r\n}) {\r\n const isAlbumItem = !(boxWidth && boxHeight);\r\n const canAutoplay = (doc.type !== 'video' || (doc.size <= MAX_VIDEO_AUTOPLAY_SIZE && !isAlbumItem)) \r\n && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos);\r\n let spanTime: HTMLElement, spanPlay: HTMLElement;\r\n\r\n if(!noInfo) {\r\n spanTime = document.createElement('span');\r\n spanTime.classList.add('video-time');\r\n container.append(spanTime);\r\n \r\n let needPlayButton = false;\r\n if(doc.type !== 'gif') {\r\n spanTime.innerText = (doc.duration + '').toHHMMSS(false);\r\n\r\n if(!noPlayButton && doc.type !== 'round') {\r\n if(canAutoplay && !noAutoDownload) {\r\n spanTime.classList.add('tgico', 'can-autoplay');\r\n } else {\r\n needPlayButton = true;\r\n }\r\n }\r\n } else {\r\n spanTime.innerText = 'GIF';\r\n\r\n if(!canAutoplay && !noPlayButton) {\r\n needPlayButton = true;\r\n noAutoDownload = undefined;\r\n }\r\n }\r\n\r\n if(needPlayButton) {\r\n spanPlay = document.createElement('span');\r\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\r\n container.append(spanPlay);\r\n }\r\n }\r\n\r\n let res: {\r\n thumb?: typeof photoRes,\r\n loadPromise: Promise\r\n } = {} as any;\r\n\r\n if(doc.mime_type === 'image/gif') {\r\n const photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\r\n if(video.parentElement) {\r\n video.remove();\r\n } */\r\n\r\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\r\n\r\n const video = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\r\n video.muted = true;\r\n if(doc.type === 'round') {\r\n const divRound = document.createElement('div');\r\n divRound.classList.add('media-round', 'z-depth-1');\r\n divRound.dataset.mid = '' + message.mid;\r\n divRound.dataset.peerId = '' + message.peerId;\r\n (divRound as any).message = message;\r\n\r\n const size = mediaSizes.active.round;\r\n const halfSize = size.width / 2;\r\n const strokeWidth = 3.5;\r\n const radius = halfSize - (strokeWidth * 2);\r\n divRound.innerHTML = `\r\n \r\n `;\r\n\r\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\r\n if(!roundVideoCircumference) {\r\n roundVideoCircumference = 2 * Math.PI * radius;\r\n }\r\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\r\n \r\n spanTime.classList.add('tgico');\r\n\r\n const isUnread = message.pFlags.media_unread;\r\n if(isUnread) {\r\n divRound.classList.add('is-unread');\r\n }\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\r\n\r\n divRound.prepend(canvas, spanTime);\r\n divRound.append(video);\r\n container.append(divRound);\r\n\r\n const ctx = canvas.getContext('2d');\r\n /* ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\r\n ctx.clip(); */\r\n\r\n const onLoad = () => {\r\n const message: Message.message = (divRound as any).message;\r\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\r\n const clear = () => {\r\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\r\n if(isInDOM(globalVideo)) {\r\n return;\r\n }\r\n \r\n globalVideo.removeEventListener('play', onPlay);\r\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.removeEventListener('pause', onPaused);\r\n globalVideo.removeEventListener('ended', onEnded);\r\n });\r\n };\r\n \r\n const onFrame = () => {\r\n ctx.drawImage(globalVideo, 0, 0);\r\n \r\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\r\n circle.style.strokeDashoffset = '' + offset;\r\n \r\n return !globalVideo.paused;\r\n };\r\n\r\n const onTimeUpdate = () => {\r\n if(!globalVideo.duration) {\r\n return;\r\n }\r\n \r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n\r\n if(globalVideo.paused) {\r\n onFrame();\r\n }\r\n \r\n spanTime.innerText = (globalVideo.duration - globalVideo.currentTime + '').toHHMMSS(false);\r\n };\r\n\r\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\r\n \r\n const onPlay = () => {\r\n video.classList.add('hide');\r\n divRound.classList.remove('is-paused');\r\n animateSingle(onFrame, canvas);\r\n \r\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\r\n preloader.onClick();\r\n }\r\n };\r\n \r\n const onPaused = () => {\r\n if(!isInDOM(globalVideo)) {\r\n clear();\r\n return;\r\n }\r\n \r\n divRound.classList.add('is-paused');\r\n };\r\n \r\n const onEnded = () => {\r\n video.classList.remove('hide');\r\n divRound.classList.add('is-paused');\r\n \r\n video.currentTime = 0;\r\n spanTime.innerText = ('' + globalVideo.duration).toHHMMSS(false);\r\n \r\n if(globalVideo.currentTime) {\r\n globalVideo.currentTime = 0;\r\n }\r\n };\r\n \r\n globalVideo.addEventListener('play', onPlay);\r\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\r\n globalVideo.addEventListener('pause', onPaused);\r\n globalVideo.addEventListener('ended', onEnded);\r\n \r\n attachClickEvent(canvas, (e) => {\r\n cancelEvent(e);\r\n \r\n // ! костыль\r\n if(preloader && !preloader.detached) {\r\n preloader.onClick();\r\n }\r\n \r\n // ! can't use it here. on Safari iOS video won't start.\r\n /* if(globalVideo.readyState < 2) {\r\n return;\r\n } */\r\n \r\n if(globalVideo.paused) {\r\n const hadSearchContext = !!searchContext;\r\n if(appMediaPlaybackController.setSearchContext(searchContext || {\r\n peerId: NULL_PEER_ID, \r\n inputFilter: {_: 'inputMessagesFilterEmpty'}, \r\n useSearch: false\r\n })) {\r\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound/* , searchContext.useSearch */);\r\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\r\n }\r\n \r\n globalVideo.play();\r\n } else {\r\n globalVideo.pause();\r\n }\r\n });\r\n \r\n if(globalVideo.paused) {\r\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\r\n onFrame();\r\n onTimeUpdate();\r\n video.classList.add('hide');\r\n } else {\r\n onPaused();\r\n }\r\n } else {\r\n onPlay();\r\n }\r\n };\r\n\r\n if(message.pFlags.is_outgoing) {\r\n (divRound as any).onLoad = onLoad;\r\n divRound.dataset.isOutgoing = '1';\r\n } else {\r\n onLoad();\r\n }\r\n } else {\r\n video.autoplay = true; // для safari\r\n }\r\n\r\n let photoRes: ReturnType;\r\n if(message) {\r\n photoRes = wrapPhoto({\r\n photo: doc, \r\n message, \r\n container, \r\n boxWidth, \r\n boxHeight, \r\n withTail, \r\n isOut, \r\n lazyLoadQueue, \r\n middleware,\r\n withoutPreloader: true,\r\n loadPromises,\r\n noAutoDownload,\r\n size\r\n });\r\n\r\n res.thumb = photoRes;\r\n\r\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\r\n res.loadPromise = photoRes.loadPromises.full;\r\n return res;\r\n }\r\n\r\n if(withTail) {\r\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\r\n video.width = +foreignObject.getAttributeNS(null, 'width');\r\n video.height = +foreignObject.getAttributeNS(null, 'height');\r\n foreignObject.append(video);\r\n }\r\n } else { // * gifs masonry\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n if(gotThumb) {\r\n gotThumb.promise.then(() => {\r\n video.poster = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n if(!video.parentElement && container) {\r\n (photoRes?.aspecter || container).append(video);\r\n }\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const isUpload = !!(message?.media as any)?.preloader;\r\n if(isUpload) { // means upload\r\n preloader = (message.media as any).preloader as ProgressivePreloader;\r\n preloader.attach(container, false);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n } else if(doc.supportsStreaming) {\r\n preloader = new ProgressivePreloader({\r\n cancelable: false,\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const renderDeferred = deferredPromise();\r\n video.addEventListener('error', (e) => {\r\n if(video.error.code !== 4) {\r\n console.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\r\n }\r\n \r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n if(!renderDeferred.isFulfilled) {\r\n renderDeferred.resolve();\r\n }\r\n }, {once: true});\r\n\r\n onMediaLoad(video).then(() => {\r\n if(group) {\r\n animationIntersector.addAnimation(video, group);\r\n }\r\n\r\n if(preloader && !isUpload) {\r\n preloader.detach();\r\n }\r\n\r\n renderDeferred.resolve();\r\n });\r\n\r\n if(doc.type === 'video') {\r\n video.addEventListener('timeupdate', () => {\r\n spanTime.innerText = (video.duration - video.currentTime + '').toHHMMSS(false);\r\n });\r\n }\r\n\r\n video.muted = true;\r\n video.loop = true;\r\n //video.play();\r\n video.autoplay = true;\r\n\r\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\r\n const load = () => {\r\n if(preloader && noAutoDownload && !withoutPreloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n let loadPromise: Promise = Promise.resolve();\r\n if(preloader && !isUpload) {\r\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\r\n const promise = loadPromise = appDocsManager.downloadDoc(doc, lazyLoadQueue?.queueId, noAutoDownload);\r\n preloader.attach(container, false, promise);\r\n } else if(doc.supportsStreaming) {\r\n if(noAutoDownload) {\r\n loadPromise = Promise.reject();\r\n } else if(!cacheContext.downloaded) { // * check for uploading video\r\n preloader.attach(container, false, null);\r\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\r\n preloader.detach();\r\n }, {once: true});\r\n }\r\n }\r\n }\r\n\r\n if(!noAutoDownload && loadPhotoThumbFunc) {\r\n loadPhotoThumbFunc();\r\n loadPhotoThumbFunc = null;\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n loadPromise.then(() => {\r\n if(middleware && !middleware()) {\r\n renderDeferred.resolve();\r\n return;\r\n }\r\n\r\n if(doc.type === 'round') {\r\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\r\n }\r\n\r\n renderImageFromUrl(video, cacheContext.url);\r\n }, () => {});\r\n\r\n return {download: loadPromise, render: renderDeferred};\r\n };\r\n\r\n if(preloader && !isUpload) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n\r\n /* if(doc.size >= 20e6 && !doc.downloaded) {\r\n let downloadDiv = document.createElement('div');\r\n downloadDiv.classList.add('download');\r\n\r\n let span = document.createElement('span');\r\n span.classList.add('btn-circle', 'tgico-download');\r\n downloadDiv.append(span);\r\n\r\n downloadDiv.addEventListener('click', () => {\r\n downloadDiv.remove();\r\n loadVideo();\r\n });\r\n\r\n container.prepend(downloadDiv);\r\n\r\n return;\r\n } */\r\n\r\n if(doc.type === 'gif' && !canAutoplay) {\r\n attachClickEvent(container, (e) => {\r\n cancelEvent(e);\r\n spanPlay.remove();\r\n load();\r\n }, {capture: true, once: true});\r\n } else {\r\n res.loadPromise = !lazyLoadQueue ? load().render : (lazyLoadQueue.push({div: container, load: () => load().render}), Promise.resolve());\r\n }\r\n\r\n return res;\r\n}\r\n\r\nrootScope.addEventListener('download_start', (docId) => {\r\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n if(element.querySelector('.preloader-container.manual')) {\r\n simulateClickEvent(element);\r\n }\r\n });\r\n});\r\n\r\nexport function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, noAutoDownload, lazyLoadQueue}: {\r\n message: any, \r\n withTime?: boolean,\r\n fontWeight?: number,\r\n voiceAsMusic?: boolean,\r\n showSender?: boolean,\r\n searchContext?: MediaSearchContext,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue\r\n}): HTMLElement {\r\n if(!fontWeight) fontWeight = 500;\r\n\r\n const doc = (message.media.document || message.media.webpage.document) as MyDocument;\r\n const uploading = message.pFlags.is_outgoing && message.media?.preloader;\r\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\r\n const audioElement = new AudioElement();\r\n audioElement.withTime = withTime;\r\n audioElement.message = message;\r\n audioElement.noAutoDownload = noAutoDownload;\r\n audioElement.lazyLoadQueue = lazyLoadQueue;\r\n audioElement.loadPromises = loadPromises;\r\n \r\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\r\n if(searchContext) audioElement.searchContext = searchContext;\r\n if(showSender) audioElement.showSender = showSender;\r\n if(uploading) audioElement.preloader = message.media.preloader;\r\n\r\n audioElement.dataset.fontWeight = '' + fontWeight;\r\n audioElement.render();\r\n return audioElement;\r\n }\r\n\r\n let extSplitted = doc.file_name ? doc.file_name.split('.') : '';\r\n let ext = '';\r\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ? \r\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) : \r\n 'file';\r\n\r\n let docDiv = document.createElement('div');\r\n docDiv.classList.add('document', `ext-${ext}`);\r\n docDiv.dataset.docId = '' + doc.id;\r\n\r\n const icoDiv = document.createElement('div');\r\n icoDiv.classList.add('document-ico');\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\r\n docDiv.classList.add('document-with-thumb');\r\n\r\n let imgs: HTMLImageElement[] = [];\r\n if(message.pFlags.is_outgoing) {\r\n icoDiv.innerHTML = ``;\r\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\r\n } else {\r\n const wrapped = wrapPhoto({\r\n photo: doc, \r\n message: null, \r\n container: icoDiv, \r\n boxWidth: 54, \r\n boxHeight: 54,\r\n loadPromises,\r\n withoutPreloader: true,\r\n lazyLoadQueue,\r\n size: appPhotosManager.choosePhotoSize(doc, 54, 54, true)\r\n });\r\n icoDiv.style.width = icoDiv.style.height = '';\r\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\r\n if(wrapped.images.full) imgs.push(wrapped.images.full);\r\n }\r\n\r\n imgs.forEach(img => img.classList.add('document-thumb'));\r\n } else {\r\n icoDiv.innerText = ext;\r\n }\r\n\r\n //let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\r\n let fileName = doc.fileName || 'Unknown.file';\r\n const descriptionEl = document.createElement('div');\r\n descriptionEl.classList.add('document-description');\r\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [formatBytes(doc.size)];\r\n \r\n if(withTime) {\r\n descriptionParts.push(formatFullSentTime(message.date));\r\n }\r\n\r\n if(showSender) {\r\n descriptionParts.push(appMessagesManager.wrapSenderToPeer(message));\r\n }\r\n\r\n docDiv.innerHTML = `\r\n ${cacheContext.downloaded && !uploading ? '' : `
`}\r\n
\r\n
\r\n `;\r\n\r\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\r\n const middleEllipsisEl = new MiddleEllipsisElement();\r\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\r\n middleEllipsisEl.innerHTML = fileName;\r\n\r\n nameDiv.append(middleEllipsisEl);\r\n\r\n if(showSender) {\r\n nameDiv.append(appMessagesManager.wrapSentTime(message));\r\n }\r\n\r\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\r\n sizeDiv.append(...joinElementsWith(descriptionParts, ' · '));\r\n\r\n docDiv.prepend(icoDiv);\r\n\r\n if(!uploading && message.pFlags.is_outgoing) {\r\n return docDiv;\r\n }\r\n\r\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\r\n const onLoad = () => {\r\n if(downloadDiv) {\r\n downloadDiv.classList.add('downloaded');\r\n const _downloadDiv = downloadDiv;\r\n setTimeout(() => {\r\n _downloadDiv.remove();\r\n }, 200);\r\n downloadDiv = null;\r\n }\r\n\r\n if(preloader) {\r\n preloader = null;\r\n }\r\n };\r\n\r\n const load = (e: Event) => {\r\n const save = !e || e.isTrusted;\r\n const doc = appDocsManager.getDoc(docDiv.dataset.docId);\r\n let download: DownloadBlob;\r\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\r\n if(!save) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else if(doc.type === 'pdf') {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n download.then(() => {\r\n setTimeout(() => { // wait for preloader animation end\r\n const url = appDownloadManager.getCacheContext(doc).url;\r\n window.open(url);\r\n }, rootScope.settings.animationsEnabled ? 250 : 0);\r\n });\r\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\r\n download = appDocsManager.downloadDoc(doc, queueId);\r\n } else {\r\n download = appDocsManager.saveDocFile(doc, queueId);\r\n }\r\n\r\n if(downloadDiv) {\r\n download.then(onLoad);\r\n preloader.attach(downloadDiv, true, download);\r\n }\r\n\r\n return {download};\r\n };\r\n\r\n if(appDocsManager.downloading.has(doc.id)) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = new ProgressivePreloader();\r\n preloader.attach(downloadDiv, false, appDocsManager.downloading.get(doc.id));\r\n } else if(!cacheContext.downloaded || uploading) {\r\n downloadDiv = docDiv.querySelector('.document-download');\r\n preloader = message.media.preloader as ProgressivePreloader;\r\n\r\n if(!preloader) {\r\n preloader = new ProgressivePreloader();\r\n\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(downloadDiv);\r\n preloader.setDownloadFunction(load);\r\n } else {\r\n preloader.attach(downloadDiv);\r\n message.media.promise.then(onLoad);\r\n }\r\n }\r\n\r\n attachClickEvent(docDiv, (e) => {\r\n if(preloader) {\r\n preloader.onClick(e);\r\n } else {\r\n load(e);\r\n }\r\n });\r\n \r\n return docDiv;\r\n}\r\n\r\n/* function wrapMediaWithTail(photo: MyPhoto | MyDocument, message: {mid: number, message: string}, container: HTMLElement, boxWidth: number, boxHeight: number, isOut: boolean) {\r\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n svg.classList.add('bubble__media-container', isOut ? 'is-out' : 'is-in');\r\n \r\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", 'foreignObject');\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, true);\r\n if(gotThumb) {\r\n foreignObject.append(gotThumb.image);\r\n }\r\n appPhotosManager.setAttachmentSize(photo, foreignObject, boxWidth, boxHeight);\r\n \r\n const width = +foreignObject.getAttributeNS(null, 'width');\r\n const height = +foreignObject.getAttributeNS(null, 'height');\r\n\r\n svg.setAttributeNS(null, 'width', '' + width);\r\n svg.setAttributeNS(null, 'height', '' + height);\r\n\r\n svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);\r\n svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n\r\n const clipId = 'clip' + message.mid + '_' + nextRandomInt(9999);\r\n svg.dataset.clipId = clipId;\r\n \r\n const defs = document.createElementNS(\"http://www.w3.org/2000/svg\", 'defs');\r\n let clipPathHTML: string = '';\r\n \r\n if(message.message) {\r\n //clipPathHTML += ``;\r\n } else {\r\n if(isOut) {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n } else {\r\n clipPathHTML += `\r\n \r\n \r\n `;\r\n }\r\n }\r\n\r\n defs.innerHTML = `${clipPathHTML}`;\r\n \r\n container.style.width = parseInt(container.style.width) - 9 + 'px';\r\n container.classList.add('with-tail');\r\n\r\n svg.append(defs, foreignObject);\r\n container.append(svg);\r\n\r\n let img = foreignObject.firstElementChild as HTMLImageElement;\r\n if(!img) {\r\n foreignObject.append(img = new Image());\r\n }\r\n\r\n return img;\r\n} */\r\n\r\nexport function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, noAutoDownload, noBlur, noThumb, noFadeIn, blurAfter}: {\r\n photo: MyPhoto | MyDocument, \r\n message?: any, \r\n container: HTMLElement, \r\n boxWidth?: number, \r\n boxHeight?: number, \r\n withTail?: boolean, \r\n isOut?: boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n middleware?: () => boolean, \r\n size?: PhotoSize,\r\n withoutPreloader?: boolean,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n noBlur?: boolean,\r\n noThumb?: boolean,\r\n noFadeIn?: boolean,\r\n blurAfter?: boolean,\r\n}) {\r\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs)) {\r\n if(boxWidth && boxHeight && !size && photo._ === 'document') {\r\n appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: Promise.resolve(),\r\n full: Promise.resolve()\r\n },\r\n images: {\r\n thumb: null,\r\n full: null\r\n },\r\n preloader: null,\r\n aspecter: null\r\n };\r\n }\r\n\r\n if(!size) {\r\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\r\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\r\n }\r\n\r\n container.classList.add('media-container');\r\n let aspecter = container;\r\n\r\n let isFit = true;\r\n let loadThumbPromise: Promise = Promise.resolve();\r\n let thumbImage: HTMLImageElement;\r\n let image: HTMLImageElement;\r\n let cacheContext: ThumbCache;\r\n const isGif = photo._ === 'document' && photo.mime_type === 'image/gif' && !size;\r\n // if(withTail) {\r\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\r\n // } else {\r\n image = new Image();\r\n\r\n if(boxWidth && boxHeight && !size) { // !album\r\n const set = appPhotosManager.setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isGif ? {\r\n _: 'photoSize',\r\n w: photo.w,\r\n h: photo.h,\r\n size: photo.size,\r\n type: 'full'\r\n } : undefined);\r\n size = set.photoSize;\r\n isFit = set.isFit;\r\n cacheContext = appDownloadManager.getCacheContext(photo, size.type);\r\n\r\n if(!isFit) {\r\n aspecter = document.createElement('div');\r\n aspecter.classList.add('media-container-aspecter');\r\n aspecter.style.width = set.size.width + 'px';\r\n aspecter.style.height = set.size.height + 'px';\r\n\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\r\n if(gotThumb) {\r\n loadThumbPromise = gotThumb.loadPromise;\r\n const thumbImage = gotThumb.image; // local scope\r\n thumbImage.classList.add('media-photo');\r\n container.append(thumbImage);\r\n } else {\r\n const res = wrapPhoto({\r\n container,\r\n message,\r\n photo,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n size,\r\n lazyLoadQueue,\r\n isOut,\r\n loadPromises,\r\n middleware,\r\n withoutPreloader,\r\n withTail,\r\n noAutoDownload,\r\n noBlur,\r\n noThumb: true,\r\n blurAfter: true\r\n //noFadeIn: true\r\n });\r\n const thumbImage = res.images.full;\r\n thumbImage.classList.add('media-photo', 'thumbnail');\r\n //container.append(thumbImage);\r\n }\r\n\r\n container.classList.add('media-container-fitted');\r\n container.append(aspecter);\r\n }\r\n } else {\r\n if(!size) {\r\n size = appPhotosManager.choosePhotoSize(photo, boxWidth, boxHeight, true);\r\n }\r\n \r\n cacheContext = appDownloadManager.getCacheContext(photo, size?.type);\r\n }\r\n\r\n if(!noThumb) {\r\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\r\n if(gotThumb) {\r\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\r\n thumbImage = gotThumb.image;\r\n thumbImage.classList.add('media-photo');\r\n aspecter.append(thumbImage);\r\n }\r\n }\r\n // }\r\n\r\n image.classList.add('media-photo');\r\n \r\n //console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\r\n\r\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\r\n\r\n let preloader: ProgressivePreloader;\r\n if(message?.media?.preloader && !withoutPreloader) { // means upload\r\n preloader = message.media.preloader;\r\n preloader.attach(container);\r\n noAutoDownload = undefined;\r\n } else if(!cacheContext.downloaded) {\r\n preloader = new ProgressivePreloader({\r\n attachMethod: 'prepend'\r\n });\r\n }\r\n\r\n const getDownloadPromise = () => {\r\n const promise = isGif && !size ? \r\n appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) : \r\n appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\r\n\r\n return promise;\r\n };\r\n\r\n const renderOnLoad = (url: string) => {\r\n return renderImageWithFadeIn(container, image, url, needFadeIn, aspecter, thumbImage);\r\n };\r\n\r\n const onLoad = (): Promise => {\r\n if(middleware && !middleware()) return Promise.resolve();\r\n\r\n if(blurAfter) {\r\n return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\r\n });\r\n }\r\n\r\n return renderOnLoad(cacheContext.url);\r\n };\r\n\r\n let loadPromise: Promise;\r\n const canAttachPreloader = (\r\n (size as PhotoSize.photoSize).w >= 150 && \r\n (size as PhotoSize.photoSize).h >= 150\r\n ) || noAutoDownload;\r\n const load = () => {\r\n if(noAutoDownload && !withoutPreloader && preloader) {\r\n preloader.construct();\r\n preloader.setManual();\r\n }\r\n\r\n const promise = getDownloadPromise();\r\n\r\n if(preloader && \r\n !cacheContext.downloaded && \r\n !withoutPreloader && \r\n canAttachPreloader\r\n ) {\r\n preloader.attach(container, false, promise);\r\n }\r\n\r\n noAutoDownload = undefined;\r\n\r\n const renderPromise = promise.then(onLoad);\r\n renderPromise.catch(() => {});\r\n return {download: promise, render: renderPromise};\r\n };\r\n\r\n if(preloader) {\r\n preloader.setDownloadFunction(load);\r\n }\r\n \r\n if(cacheContext.downloaded) {\r\n loadThumbPromise = loadPromise = load().render;\r\n } else {\r\n if(!lazyLoadQueue) loadPromise = load().render;\r\n /* else if(noAutoDownload) {\r\n preloader.construct();\r\n preloader.setManual();\r\n preloader.attach(container);\r\n } */ else lazyLoadQueue.push({div: container, load: () => load().download});\r\n }\r\n\r\n if(loadPromises && loadThumbPromise) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n return {\r\n loadPromises: {\r\n thumb: loadThumbPromise,\r\n full: loadPromise || Promise.resolve()\r\n },\r\n images: {\r\n thumb: thumbImage,\r\n full: image\r\n },\r\n preloader,\r\n aspecter\r\n };\r\n}\r\n\r\nexport function renderImageWithFadeIn(container: HTMLElement, \r\n image: HTMLImageElement, \r\n url: string, \r\n needFadeIn: boolean, \r\n aspecter = container,\r\n thumbImage?: HTMLImageElement\r\n) {\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve) => {\r\n /* if(photo._ === 'document') {\r\n console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n return resolve();\r\n } */\r\n\r\n renderImageFromUrl(image, url, () => {\r\n sequentialDom.mutateElement(container, () => {\r\n aspecter.append(image);\r\n\r\n fastRaf(() => {\r\n resolve();\r\n });\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n image.classList.remove('fade-in');\r\n \r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n });\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n });\r\n}\r\n\r\n// export function renderImageWithFadeIn(container: HTMLElement, \r\n// image: HTMLImageElement, \r\n// url: string, \r\n// needFadeIn: boolean, \r\n// aspecter = container,\r\n// thumbImage?: HTMLImageElement\r\n// ) {\r\n// if(needFadeIn) {\r\n// // image.classList.add('fade-in-new', 'not-yet');\r\n// image.classList.add('fade-in');\r\n// }\r\n\r\n// return new Promise((resolve) => {\r\n// /* if(photo._ === 'document') {\r\n// console.error('wrapPhoto: will render document', photo, size, cacheContext);\r\n// return resolve();\r\n// } */\r\n\r\n// renderImageFromUrl(image, url, () => {\r\n// sequentialDom.mutateElement(container, () => {\r\n// aspecter.append(image);\r\n// // (needFadeIn ? getHeavyAnimationPromise() : Promise.resolve()).then(() => {\r\n\r\n// // fastRaf(() => {\r\n// resolve();\r\n// // });\r\n\r\n// if(needFadeIn) {\r\n// fastRaf(() => {\r\n// /* if(!image.isConnected) {\r\n// alert('aaaa');\r\n// } */\r\n// // fastRaf(() => {\r\n// image.classList.remove('not-yet');\r\n// // });\r\n// });\r\n\r\n// image.addEventListener('transitionend', () => {\r\n// sequentialDom.mutate(() => {\r\n// image.classList.remove('fade-in-new');\r\n \r\n// if(thumbImage) {\r\n// thumbImage.remove();\r\n// }\r\n// });\r\n// }, {once: true});\r\n// }\r\n// // });\r\n// });\r\n// });\r\n// });\r\n// }\r\n\r\nexport function wrapSticker({doc, div, middleware, lazyLoadQueue, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale}: {\r\n doc: MyDocument, \r\n div: HTMLElement, \r\n middleware?: () => boolean, \r\n lazyLoadQueue?: LazyLoadQueue, \r\n group?: string, \r\n play?: boolean, \r\n onlyThumb?: boolean,\r\n emoji?: string,\r\n width?: number,\r\n height?: number,\r\n withThumb?: boolean,\r\n loop?: boolean,\r\n loadPromises?: Promise[],\r\n needFadeIn?: boolean,\r\n needUpscale?: boolean\r\n}): Promise {\r\n const stickerType = doc.sticker;\r\n\r\n if(!width) {\r\n width = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(!height) {\r\n height = !emoji ? 200 : undefined;\r\n }\r\n\r\n if(stickerType === 2) {\r\n //LottieLoader.loadLottie();\r\n LottieLoader.loadLottieWorkers();\r\n }\r\n \r\n if(!stickerType) {\r\n console.error('wrong doc for wrapSticker!', doc);\r\n throw new Error('wrong doc for wrapSticker!');\r\n }\r\n\r\n div.dataset.docId = '' + doc.id;\r\n div.classList.add('media-sticker-wrapper');\r\n \r\n //console.log('wrap sticker', doc, div, onlyThumb);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n\r\n const toneIndex = emoji ? getEmojiToneIndex(emoji) : -1;\r\n const downloaded = cacheContext.downloaded && !needFadeIn;\r\n \r\n let loadThumbPromise = deferredPromise();\r\n let haveThumbCached = false;\r\n if((doc.thumbs?.length || doc.stickerCachedThumbs) && !div.firstElementChild && (!downloaded || stickerType === 2 || onlyThumb) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */) {\r\n let thumb = doc.stickerCachedThumbs && doc.stickerCachedThumbs[toneIndex] || doc.thumbs[0];\r\n \r\n //console.log('wrap sticker', thumb, div);\r\n\r\n let thumbImage: HTMLImageElement;\r\n const afterRender = () => {\r\n if(!div.childElementCount) {\r\n thumbImage.classList.add('media-sticker', 'thumbnail');\r\n \r\n sequentialDom.mutateElement(div, () => {\r\n div.append(thumbImage);\r\n loadThumbPromise.resolve();\r\n });\r\n }\r\n };\r\n\r\n if('url' in thumb) {\r\n thumbImage = new Image();\r\n renderImageFromUrl(thumbImage, thumb.url, afterRender);\r\n haveThumbCached = true;\r\n } else if('bytes' in thumb) {\r\n if(thumb._ === 'photoPathSize') {\r\n if(thumb.bytes.length) {\r\n const d = appPhotosManager.getPathFromPhotoPathSize(thumb);\r\n div.innerHTML = `\r\n \r\n `;\r\n } else {\r\n thumb = doc.thumbs.find(t => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\r\n }\r\n } \r\n \r\n if(thumb && thumb._ !== 'photoPathSize' && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n haveThumbCached = true;\r\n } else {\r\n webpWorkerController.convert('' + doc.id, (thumb as PhotoSize.photoStrippedSize).bytes as Uint8Array).then(bytes => {\r\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\r\n doc.pFlags.stickerThumbConverted = true;\r\n \r\n if(middleware && !middleware()) return;\r\n \r\n if(!div.childElementCount) {\r\n renderImageFromUrl(thumbImage, appPhotosManager.getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true), afterRender);\r\n }\r\n }).catch(() => {});\r\n }\r\n }\r\n } else if(stickerType === 2 && (withThumb || onlyThumb) && toneIndex <= 0) {\r\n thumbImage = new Image();\r\n\r\n const load = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n\r\n const r = () => {\r\n if(div.childElementCount || (middleware && !middleware())) return;\r\n renderImageFromUrl(thumbImage, cacheContext.url, afterRender);\r\n };\r\n \r\n if(cacheContext.url) {\r\n r();\r\n return Promise.resolve();\r\n } else {\r\n return appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\r\n }\r\n };\r\n \r\n if(lazyLoadQueue && onlyThumb) {\r\n lazyLoadQueue.push({div, load});\r\n return Promise.resolve();\r\n } else {\r\n load();\r\n\r\n if((thumb as any).url) {\r\n haveThumbCached = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if(loadPromises && haveThumbCached) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n\r\n if(onlyThumb) { // for sticker panel\r\n return Promise.resolve();\r\n }\r\n \r\n const load = async() => {\r\n if(middleware && !middleware()) return;\r\n\r\n if(stickerType === 2) {\r\n /* if(doc.id === '1860749763008266301') {\r\n console.log('loaded sticker:', doc, div);\r\n } */\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 500));\r\n //return;\r\n\r\n //console.time('download sticker' + doc.id);\r\n\r\n //appDocsManager.downloadDocNew(doc.id).promise.then(res => res.json()).then(async(json) => {\r\n //fetch(doc.url).then(res => res.json()).then(async(json) => {\r\n return await appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId)\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(async(json) => {\r\n //console.timeEnd('download sticker' + doc.id);\r\n //console.log('loaded sticker:', doc, div/* , blob */);\r\n if(middleware && !middleware()) return;\r\n\r\n let animation = await LottieLoader.loadAnimationWorker({\r\n container: div,\r\n loop: loop && !emoji,\r\n autoplay: play,\r\n animationData: json,\r\n width,\r\n height,\r\n name: 'doc' + doc.id,\r\n needUpscale\r\n }, group, toneIndex);\r\n\r\n //const deferred = deferredPromise();\r\n \r\n animation.addEventListener('firstFrame', () => {\r\n const element = div.firstElementChild;\r\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\r\n\r\n const cb = () => {\r\n if(element && element !== animation.canvas) {\r\n element.remove();\r\n }\r\n };\r\n\r\n if(!needFadeIn) {\r\n if(element) {\r\n sequentialDom.mutate(cb);\r\n }\r\n } else {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.add('fade-in');\r\n if(element) {\r\n element.classList.add('fade-out');\r\n }\r\n \r\n animation.canvas.addEventListener('animationend', () => {\r\n sequentialDom.mutate(() => {\r\n animation.canvas.classList.remove('fade-in');\r\n cb();\r\n });\r\n }, {once: true});\r\n });\r\n }\r\n\r\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\r\n\r\n //deferred.resolve();\r\n }, {once: true});\r\n \r\n if(emoji) {\r\n const data: SendMessageEmojiInteractionData = {\r\n a: [],\r\n v: 1\r\n };\r\n\r\n let sendInteractionThrottled: () => void;\r\n\r\n appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\r\n\r\n attachClickEvent(div, async(e) => {\r\n cancelEvent(e);\r\n const animation = LottieLoader.getAnimation(div);\r\n \r\n if(animation.paused) {\r\n const doc = appStickersManager.getAnimatedEmojiSoundDocument(emoji);\r\n if(doc) {\r\n const audio = document.createElement('audio');\r\n audio.style.display = 'none';\r\n div.parentElement.append(audio);\r\n\r\n try {\r\n await appDocsManager.downloadDoc(doc);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n audio.src = cacheContext.url;\r\n audio.play();\r\n await onMediaLoad(audio, undefined, true);\r\n \r\n audio.addEventListener('ended', () => {\r\n audio.src = '';\r\n audio.remove();\r\n }, {once: true});\r\n } catch(err) {\r\n \r\n }\r\n }\r\n\r\n animation.autoplay = true;\r\n animation.restart();\r\n }\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji, true);\r\n if(!doc) {\r\n return;\r\n }\r\n \r\n const animationDiv = document.createElement('div');\r\n animationDiv.classList.add('emoji-animation');\r\n\r\n const size = 280;\r\n animationDiv.style.width = size + 'px';\r\n animationDiv.style.height = size + 'px';\r\n\r\n wrapSticker({\r\n div: animationDiv,\r\n doc,\r\n middleware,\r\n withThumb: false,\r\n needFadeIn: false,\r\n loop: false,\r\n width: size,\r\n height: size,\r\n play: true,\r\n group: 'none'\r\n }).then(animation => {\r\n assumeType(animation);\r\n animation.addEventListener('enterFrame', (frameNo) => {\r\n if(frameNo === animation.maxFrame) {\r\n animation.remove();\r\n animationDiv.remove();\r\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\r\n }\r\n });\r\n\r\n if(IS_VIBRATE_SUPPORTED) {\r\n animation.addEventListener('firstFrame', () => {\r\n navigator.vibrate(100);\r\n }, {once: true});\r\n }\r\n });\r\n\r\n const generateRandomSigned = (max: number) => {\r\n const r = Math.random() * max * 2;\r\n return r > max ? -r % max : r;\r\n };\r\n\r\n const bubble = findUpClassName(div, 'bubble');\r\n const isOut = bubble.classList.contains('is-out');\r\n\r\n const randomOffsetX = generateRandomSigned(16);\r\n const randomOffsetY = generateRandomSigned(4);\r\n const stableOffsetX = size / 8 * (isOut ? 1 : -1);\r\n const setPosition = () => {\r\n if(!isInDOM(div)) {\r\n return;\r\n }\r\n \r\n const rect = div.getBoundingClientRect();\r\n /* const boxWidth = Math.max(rect.width, rect.height);\r\n const boxHeight = Math.max(rect.width, rect.height);\r\n const x = rect.left + ((boxWidth - size) / 2);\r\n const y = rect.top + ((boxHeight - size) / 2); */\r\n\r\n const rectX = isOut ? rect.right : rect.left;\r\n\r\n const addOffsetX = (isOut ? -size : 0) + stableOffsetX + randomOffsetX;\r\n const x = rectX + addOffsetX;\r\n // const y = rect.bottom - size + size / 4;\r\n const y = rect.top + ((rect.height - size) / 2) + randomOffsetY;\r\n // animationDiv.style.transform = `translate(${x}px, ${y}px)`;\r\n animationDiv.style.top = y + 'px';\r\n animationDiv.style.left = x + 'px';\r\n };\r\n\r\n const onScroll = throttleWithRaf(setPosition);\r\n\r\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\r\n\r\n setPosition();\r\n\r\n if(bubble) {\r\n if(isOut) {\r\n animationDiv.classList.add('is-out');\r\n } else {\r\n animationDiv.classList.add('is-in');\r\n }\r\n }\r\n\r\n appImManager.emojiAnimationContainer.append(animationDiv);\r\n\r\n if(!sendInteractionThrottled) {\r\n sendInteractionThrottled = throttle(() => {\r\n const length = data.a.length;\r\n if(!length) {\r\n return;\r\n }\r\n \r\n const firstTime = data.a[0].t;\r\n \r\n data.a.forEach((a) => {\r\n a.t = (a.t - firstTime) / 1000;\r\n });\r\n \r\n const bubble = findUpClassName(div, 'bubble');\r\n appMessagesManager.setTyping(appImManager.chat.peerId, {\r\n _: 'sendMessageEmojiInteraction',\r\n msg_id: appMessagesIdsManager.getServerMessageId(+bubble.dataset.mid),\r\n emoticon: emoji,\r\n interaction: {\r\n _: 'dataJSON',\r\n data: JSON.stringify(data)\r\n }\r\n }, true);\r\n \r\n data.a.length = 0;\r\n }, 1000, false);\r\n }\r\n\r\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\r\n if(e.isTrusted) {\r\n data.a.push({\r\n i: 1,\r\n t: Date.now()\r\n });\r\n \r\n sendInteractionThrottled();\r\n }\r\n });\r\n }\r\n\r\n return animation;\r\n\r\n //return deferred;\r\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\r\n });\r\n\r\n //console.timeEnd('render sticker' + doc.id);\r\n } else if(stickerType === 1) {\r\n const image = new Image();\r\n const thumbImage = div.firstElementChild !== image && div.firstElementChild;\r\n needFadeIn = (needFadeIn || !downloaded || thumbImage) && rootScope.settings.animationsEnabled;\r\n\r\n image.classList.add('media-sticker');\r\n\r\n if(needFadeIn) {\r\n image.classList.add('fade-in');\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const r = () => {\r\n if(middleware && !middleware()) return resolve();\r\n \r\n renderImageFromUrl(image, cacheContext.url, () => {\r\n sequentialDom.mutateElement(div, () => {\r\n div.append(image);\r\n if(thumbImage) {\r\n thumbImage.classList.add('fade-out');\r\n }\r\n\r\n resolve();\r\n\r\n if(needFadeIn) {\r\n image.addEventListener('animationend', () => {\r\n image.classList.remove('fade-in');\r\n if(thumbImage) {\r\n thumbImage.remove();\r\n }\r\n }, {once: true});\r\n }\r\n });\r\n });\r\n };\r\n \r\n if(cacheContext.url) r();\r\n else {\r\n appDocsManager.downloadDoc(doc, /* undefined, */lazyLoadQueue?.queueId).then(r, resolve);\r\n }\r\n });\r\n }\r\n };\r\n\r\n const loadPromise: Promise = lazyLoadQueue && (!downloaded || stickerType === 2) ? \r\n (lazyLoadQueue.push({div, load}), Promise.resolve()) : \r\n load();\r\n\r\n if(downloaded && stickerType === 1) {\r\n loadThumbPromise = loadPromise as any;\r\n if(loadPromises) {\r\n loadPromises.push(loadThumbPromise);\r\n }\r\n }\r\n\r\n return loadPromise;\r\n}\r\n\r\nexport async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height}: {\r\n set: StickerSet.stickerSet,\r\n lazyLoadQueue: LazyLoadQueue,\r\n container: HTMLElement,\r\n group: string,\r\n autoplay: boolean,\r\n width: number,\r\n height: number\r\n}) {\r\n if(set.thumbs?.length) {\r\n container.classList.add('media-sticker-wrapper');\r\n lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n const downloadOptions = appStickersManager.getStickerSetThumbDownloadOptions(set);\r\n const promise = appDownloadManager.download(downloadOptions);\r\n\r\n if(set.pFlags.animated) {\r\n return promise\r\n .then(readBlobAsText)\r\n //.then(JSON.parse)\r\n .then(json => {\r\n lottieLoader.loadAnimationWorker({\r\n container,\r\n loop: true,\r\n autoplay,\r\n animationData: json,\r\n width,\r\n height,\r\n needUpscale: true,\r\n name: 'setThumb' + set.id\r\n }, group);\r\n });\r\n } else {\r\n const image = new Image();\r\n image.classList.add('media-sticker');\r\n \r\n return promise.then(blob => {\r\n renderImageFromUrl(image, URL.createObjectURL(blob), () => {\r\n container.append(image);\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n const stickerSet = await promise;\r\n if(stickerSet.documents[0]._ !== 'documentEmpty') { // as thumb will be used first sticker\r\n wrapSticker({\r\n doc: stickerSet.documents[0],\r\n div: container, \r\n group: group,\r\n lazyLoadQueue\r\n }); // kostil\r\n }\r\n}\r\n\r\nexport function wrapLocalSticker({emoji, width, height}: {\r\n doc?: MyDocument,\r\n url?: string,\r\n emoji?: string,\r\n width: number,\r\n height: number,\r\n}) {\r\n const container = document.createElement('div');\r\n\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: container,\r\n loop: false,\r\n play: true,\r\n width,\r\n height,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n container.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n return {container};\r\n}\r\n\r\nexport function wrapReply(title: Parameters[0], subtitle: Parameters[1], message?: any) {\r\n const replyContainer = new ReplyContainer('reply');\r\n replyContainer.fill(title, subtitle, message);\r\n /////////console.log('wrapReply', title, subtitle, media);\r\n return replyContainer.container;\r\n}\r\n\r\nexport function prepareAlbum(options: {\r\n container: HTMLElement,\r\n items: {w: number, h: number}[],\r\n maxWidth: number,\r\n minWidth: number,\r\n spacing: number,\r\n maxHeight?: number,\r\n forMedia?: true\r\n}) {\r\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\r\n const layout = layouter.layout();\r\n\r\n const widthItem = layout.find(item => item.sides & RectPart.Right);\r\n const width = widthItem.geometry.width + widthItem.geometry.x;\r\n\r\n const heightItem = layout.find(item => item.sides & RectPart.Bottom);\r\n const height = heightItem.geometry.height + heightItem.geometry.y;\r\n\r\n const container = options.container;\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n const children = container.children;\r\n\r\n layout.forEach(({geometry, sides}, idx) => {\r\n let div: HTMLElement;\r\n div = children[idx] as HTMLElement;\r\n if(!div) {\r\n div = document.createElement('div');\r\n container.append(div);\r\n }\r\n\r\n div.classList.add('album-item', 'grouped-item');\r\n\r\n div.style.width = (geometry.width / width * 100) + '%';\r\n div.style.height = (geometry.height / height * 100) + '%';\r\n div.style.top = (geometry.y / height * 100) + '%';\r\n div.style.left = (geometry.x / width * 100) + '%';\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Top) {\r\n div.style.borderTopLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\r\n div.style.borderBottomLeftRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Top) {\r\n div.style.borderTopRightRadius = 'inherit';\r\n }\r\n\r\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\r\n div.style.borderBottomRightRadius = 'inherit';\r\n }\r\n\r\n if(options.forMedia) {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n div.append(mediaDiv);\r\n }\r\n\r\n // @ts-ignore\r\n //div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\r\n });\r\n\r\n /* if(options.forMedia) {\r\n layout.forEach((_, i) => {\r\n const mediaDiv = document.createElement('div');\r\n mediaDiv.classList.add('album-item-media');\r\n \r\n options.container.children[i].append(mediaDiv);\r\n });\r\n } */\r\n}\r\n\r\nexport function wrapAlbum({groupId, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, noAutoDownload}: {\r\n groupId: string, \r\n attachmentDiv: HTMLElement,\r\n middleware?: () => boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n uploading?: boolean,\r\n isOut: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n}) {\r\n const items: {size: PhotoSize.photoSize, media: any, message: any}[] = [];\r\n\r\n // !lowest msgID will be the FIRST in album\r\n const storage = appMessagesManager.getMidsByAlbum(groupId);\r\n for(const mid of storage) {\r\n const m = chat.getMessage(mid);\r\n const media = m.media.photo || m.media.document;\r\n\r\n const size: any = media._ === 'photo' ? appPhotosManager.choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\r\n items.push({size, media, message: m});\r\n }\r\n\r\n /* // * pending\r\n if(storage[0] < 0) {\r\n items.reverse();\r\n } */\r\n\r\n prepareAlbum({\r\n container: attachmentDiv,\r\n items: items.map(i => ({w: i.size.w, h: i.size.h})),\r\n maxWidth: mediaSizes.active.album.width,\r\n minWidth: 100,\r\n spacing: 2,\r\n forMedia: true\r\n });\r\n\r\n items.forEach((item, idx) => {\r\n const {size, media, message} = item;\r\n\r\n const div = attachmentDiv.children[idx] as HTMLElement;\r\n div.dataset.mid = '' + message.mid;\r\n div.dataset.peerId = '' + message.peerId;\r\n const mediaDiv = div.firstElementChild as HTMLElement;\r\n if(media._ === 'photo') {\r\n wrapPhoto({\r\n photo: media,\r\n message,\r\n container: mediaDiv,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n size,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n } else {\r\n wrapVideo({\r\n doc: message.media.document,\r\n container: mediaDiv,\r\n message,\r\n boxWidth: 0,\r\n boxHeight: 0,\r\n withTail: false,\r\n isOut,\r\n lazyLoadQueue,\r\n middleware,\r\n loadPromises,\r\n noAutoDownload\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, noAutoDownload, lazyLoadQueue, searchContext, useSearch}: {\r\n albumMustBeRenderedFull: boolean,\r\n message: any,\r\n messageDiv: HTMLElement,\r\n bubble: HTMLElement,\r\n uploading?: boolean,\r\n chat: Chat,\r\n loadPromises?: Promise[],\r\n noAutoDownload?: boolean,\r\n lazyLoadQueue?: LazyLoadQueue,\r\n searchContext?: MediaSearchContext,\r\n useSearch?: boolean,\r\n}) {\r\n let nameContainer: HTMLElement;\r\n const mids = albumMustBeRenderedFull ? chat.getMidsByMid(message.mid) : [message.mid];\r\n /* if(isPending) {\r\n mids.reverse();\r\n } */\r\n\r\n mids.forEach((mid, idx) => {\r\n const message = chat.getMessage(mid);\r\n const div = wrapDocument({\r\n message,\r\n loadPromises,\r\n noAutoDownload,\r\n lazyLoadQueue,\r\n searchContext\r\n });\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('document-container');\r\n container.dataset.mid = '' + mid;\r\n container.dataset.peerId = '' + message.peerId;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.classList.add('document-wrapper');\r\n \r\n if(message.message) {\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('document-message');\r\n\r\n const richText = RichTextProcessor.wrapRichText(message.message, {\r\n entities: message.totalEntities\r\n });\r\n\r\n messageDiv.innerHTML = richText;\r\n wrapper.append(messageDiv);\r\n }\r\n\r\n if(mids.length > 1) {\r\n const selection = document.createElement('div');\r\n selection.classList.add('document-selection');\r\n container.append(selection);\r\n \r\n container.classList.add('grouped-item');\r\n\r\n if(idx === 0) {\r\n nameContainer = wrapper;\r\n }\r\n }\r\n\r\n wrapper.append(div);\r\n container.append(wrapper);\r\n messageDiv.append(container);\r\n });\r\n\r\n if(mids.length > 1) {\r\n bubble.classList.add('is-multiple-documents', 'is-grouped');\r\n }\r\n\r\n return nameContainer;\r\n}\r\n\r\nexport function wrapPoll(message: any) {\r\n const elem = new PollElement();\r\n elem.message = message;\r\n elem.setAttribute('peer-id', '' + message.peerId);\r\n elem.setAttribute('poll-id', message.media.poll.id);\r\n elem.setAttribute('message-id', '' + message.mid);\r\n elem.render();\r\n return elem;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport whichChild from \"./whichChild\";\r\n\r\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\r\n if(prevPos === undefined) {\r\n prevPos = element.parentElement === container ? whichChild(element) : -1;\r\n }\r\n\r\n if(prevPos === pos) {\r\n return false;\r\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\r\n pos += 1;\r\n }\r\n\r\n if(!pos) {\r\n container.prepend(element);\r\n } else if(container.childElementCount > pos) {\r\n container.insertBefore(element, container.children[pos]);\r\n } else {\r\n container.append(element);\r\n }\r\n\r\n return true;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { insertInDescendSortedArray } from \"./array\";\nimport { getMiddleware } from \"./middleware\";\nimport { safeAssign } from \"./object\";\n\nexport type SortedElementId = PeerId;\nexport type SortedElementBase = {\n id: SortedElementId, \n index: number\n};\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase, batch: boolean) => SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware = getMiddleware();\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n }\n\n public clear() {\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach(element => {\n this.update(element.id, true);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n return callback(false);\n }\n\n this._updateList();\n \n callback(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public add(id: SortedElementId, batch = false, updateElementWith?: SortedList['updateElementWith'], updateBatch = batch) {\n let element = this.get(id);\n if(element) {\n return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n element = this.onElementCreate(base, batch);\n this.elements.set(id, element);\n this.update(id, updateBatch, element, updateElementWith);\n\n return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n \n this.elements.delete(id);\n \n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public update(id: SortedElementId, batch = false, element = this.get(id), updateElementWith?: SortedList['updateElementWith']) {\n if(!element) {\n return;\n }\n\n element.index = this.getIndex(element);\n this.onUpdate && this.onUpdate(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n if(!batch && this.onSort) {\n const middleware = this.middleware.get();\n (updateElementWith || this.updateElementWith)(() => {\n if(!middleware()) {\n return;\n }\n\n // * в случае пересортировки этого же элемента во время ожидания вызовется вторая такая же. нужно соблюдать последовательность событий\n this.onSort(element, idx);\n /* if(this.get(id) === element) {\n this.onSort(element, this.sorted.indexOf(element));\n } */\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\nimport appDialogsManager, { AppDialogsManager, DialogDom } from \"../lib/appManagers/appDialogsManager\";\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport isInDOM from \"../helpers/dom/isInDOM\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport { safeAssign } from \"../helpers/object\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../helpers/sortedList\";\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 48;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> = {}) {\n super({\n getIndex: options.getIndex || ((element) => appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || ((element) => {\n const status = appUsersManager.getUserStatusString(element.id);\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n \n await getHeavyAnimationPromise();\n \n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, { SwipeHandlerOptions } from \"../../components/swipeHandler\";\nimport { cancelEvent } from \"./cancelEvent\";\nimport findUpClassName from \"./findUpClassName\";\nimport isSwipingBackSafari from \"./isSwipingBackSafari\";\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') && \n !isSwipingBackSafari(e) && \n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelContextMenuOpening } from \"../../components/misc\";\nimport handleHorizontalSwipe, { SwipeHandlerHorizontalOptions } from \"./handleHorizontalSwipe\";\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport PopupPickUser from \"./pickUser\";\r\n\r\nexport default class PopupForward extends PopupPickUser {\r\n constructor(\r\n peerIdMids: {[fromPeerId: PeerId]: number[]}, \r\n onSelect?: (peerId: PeerId) => Promise | void, \r\n overrideOnSelect = false\r\n ) {\r\n super({\r\n peerTypes: ['dialogs', 'contacts'],\r\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\r\n if(onSelect) {\r\n const res = onSelect(peerId);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n }\r\n\r\n appImManager.setInnerPeer({peerId});\r\n appImManager.chat.input.initMessagesForward(peerIdMids);\r\n },\r\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\r\n chatRightsAction: 'send_messages',\r\n selfPresence: 'ChatYourSelf'\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport { ChatType } from \"../chat/chat\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\n\nexport default class PopupDeleteMessages {\n constructor(peerId: PeerId, mids: number[], type: ChatType, onConfirm?: () => void) {\n const peerTitleElement = new PeerTitle({peerId}).element;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[], buttons: PopupPeerOptions['buttons'], checkboxes: PopupPeerOptions['checkboxes'] = [];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n \n if(appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n \n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = appChatsManager.getChat(peerId.toChatId());\n\n const hasRights = appChatsManager.hasRights(peerId.toChatId(), 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = hasRights ? mids.slice() : mids.filter(mid => {\n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n //description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { PopupButton } from \".\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSendNow {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n let title: string, description: string, buttons: PopupButton[] = [];\n\n title = `Send Message${mids.length > 1 ? 's' : ''} Now`;\n description = mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?';\n\n const callback = () => {\n onConfirm && onConfirm();\n appMessagesManager.sendScheduledMessages(peerId, mids);\n };\n\n buttons.push({\n langKey: 'Send',\n callback\n });\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n title,\n description,\n buttons\n });\n\n popup.show();\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function cancelSelection() {\r\n if(window.getSelection) {\r\n if(window.getSelection().empty) { // Chrome\r\n window.getSelection().empty();\r\n } else if(window.getSelection().removeAllRanges) { // Firefox\r\n window.getSelection().removeAllRanges();\r\n }\r\n // @ts-ignore\r\n } else if(document.selection) { // IE?\r\n // @ts-ignore\r\n document.selection.empty();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatBubbles from \"./bubbles\";\nimport type ChatInput from \"./input\";\nimport type Chat from \"./chat\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport CheckboxField from \"../checkboxField\";\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\nimport PopupForward from \"../popups/forward\";\nimport { toast } from \"../toast\";\nimport SetTransition from \"../singleTransition\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport PopupSendNow from \"../popups/sendNow\";\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport I18n, { i18n, _i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\nimport getSelectedText from \"../../helpers/dom/getSelectedText\";\nimport rootScope from \"../../lib/rootScope\";\nimport { safeAssign } from \"../../helpers/object\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport { randomLong } from \"../../helpers/random\";\nimport { attachContextMenuListener } from \"../misc\";\nimport { attachClickEvent, AttachClickOptions } from \"../../helpers/dom/clickEvent\";\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n//const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected appMessagesManager: AppMessagesManager;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n\n constructor(options: {\n appMessagesManager: AppMessagesManager,\n listenElement: HTMLElement,\n listenerSetter: ListenerSetter,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.add(this.listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(this.listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n this.listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n //this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n //cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, this.listenerSetter);\n\n return;\n }\n\n const getElementsBetween = (first: HTMLElement, last: HTMLElement) => { \n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n this.listenerSetter.add(this.listenElement)('mousedown', (e) => {\n //console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n \n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(!seenSet.has(mid)) {\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n //bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach(element => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n }\n };\n\n //const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n //console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n //bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n });\n }\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n \n const checkboxField = new CheckboxField({\n name: element.dataset.mid, \n round: true\n });\n \n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n \n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' && \n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n \n let cantForward = !size, \n cantDelete = !size, \n cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storage = this.isScheduled ? this.appMessagesManager.getScheduledMessagesStorage(peerId) : this.appMessagesManager.getMessagesStorage(peerId);\n for(const mid of mids) {\n const message = this.appMessagesManager.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.appMessagesManager.canForward(message);\n }\n \n if(!cantDelete) {\n cantDelete = !this.appMessagesManager.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n if(cantForward && cantDelete) break;\n }\n \n this.onUpdateContainer && this.onUpdateContainer(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n \n // const bubblesContainer = this.bubbles.bubblesContainer;\n //bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n this.onToggleSelection && this.onToggleSelection(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n this.updateContainer(forceSelection);\n }\n\n return true;\n }\n\n public cancelSelection = (doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition(element, 'is-selected', isSelected, 200);\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n if(diff < 0) {\n toast(I18n.format('Chat.Selection.LimitToast', true));\n return false;\n /* const it = this.selectedMids.values();\n do {\n const mid = it.next().value;\n const mounted = this.appImManager.getMountedBubble(mid);\n if(mounted) {\n this.toggleByBubble(mounted.bubble);\n } else {\n const mids = this.appMessagesManager.getMidsByMid(mid);\n for(const mid of mids) {\n this.selectedMids.delete(mid);\n }\n }\n } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach(mid => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: searchSuper.container,\n listenerSetter: new ListenerSetter(),\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach(element => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition(this.searchSuper.navScrollableContainer, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n null;\n this.selectedText = undefined;\n }\n });\n\n SetTransition(this.searchSuper.container, 'is-selecting', forwards, 200);\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n this.listenerSetter.add(btnCancel)('click', () => this.cancelSelection(), {once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n rootScope.dispatchEvent('history_focus', {\n peerId,\n mid\n });\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel, \n this.selectionCountEl, \n this.selectionGotoBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n selectionLeft: HTMLDivElement;\n selectionRight: HTMLDivElement;\n\n constructor(private chat: Chat, private bubbles: ChatBubbles, private input: ChatInput, appMessagesManager: AppMessagesManager) {\n super({\n appMessagesManager,\n listenElement: bubbles.bubblesContainer,\n listenerSetter: bubbles.listenerSetter,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size \n && !(e.target as HTMLElement).classList.contains('bubble')\n && !(e.target as HTMLElement).classList.contains('document-selection')\n && target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element && \n !(e.target as HTMLElement).classList.contains('document-selection') && \n selecting === undefined && \n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach(item => this.toggleElementCheckbox(item, show));\n }\n }\n \n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement) => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.bubbles.peerId);\n if(set) {\n const mids = this.chat.getMidsByMid(mid);\n mids.forEach(mid => set.delete(mid));\n }\n }\n\n this.bubbles.getBubbleGroupedItems(bubble).forEach(this.toggleByElement);\n return;\n }\n\n if(!this.toggleMid(this.bubbles.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(mid);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.bubbles.peerId, mid));\n };\n\n protected toggleByMid = (peerId: PeerId, mid: number) => {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(+element.dataset.mid));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected isGroupedMidsSelected(mid: number) {\n const mids = this.chat.getMidsByMid(mid);\n const selectedMids = mids.filter(mid => this.isMidSelected(this.bubbles.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n \n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n \n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n \n return bubble.classList.contains('document-container') ? \n bubble.querySelector('label input') as HTMLInputElement : \n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') && \n !bubble.classList.contains('is-sending') && \n !bubble.classList.contains('bubble-first') && \n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = this.chat.input.center(animate);\n\n SetTransition(this.listenElement, 'is-selecting', forwards, animate ? 200 : 0, () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper = \n this.selectionContainer = \n this.selectionSendNowBtn = \n this.selectionForwardBtn = \n this.selectionDeleteBtn = \n this.selectionLeft = \n this.selectionRight = \n null;\n this.selectedText = undefined;\n }\n \n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n });\n\n //const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.bubbles.peerId, [...this.selectedMids.get(this.bubbles.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn, \n this.selectionForwardBtn, \n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n \n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = () => {\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n const mounted = this.bubbles.getMountedBubble(mid);\n if(mounted) {\n //this.toggleByBubble(mounted.message.grouped_id ? mounted.bubble.querySelector(`.grouped-item[data-mid=\"${mid}\"]`) : mounted.bubble);\n this.toggleByElement(mounted.bubble);\n }\n /* const bubble = this.appImManager.bubbles[mid];\n if(bubble) {\n this.toggleByBubble(bubble);\n } */\n }\n }\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedText(): string {\r\n if(window.getSelection) {\r\n return window.getSelection().toString();\r\n // @ts-ignore\r\n } else if(document.selection) {\r\n // @ts-ignore\r\n return document.selection.createRange().text;\r\n }\r\n \r\n return '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, getObjectKeysAndSort, safeAssign } from \"../helpers/object\";\nimport { escapeRegExp, limitSymbols } from \"../helpers/string\";\nimport appChatsManager from \"../lib/appManagers/appChatsManager\";\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, { MyInputMessagesFilter, MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\nimport { logger } from \"../lib/logger\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport rootScope from \"../lib/rootScope\";\nimport { SearchGroup, SearchGroupType } from \"./appSearch\";\nimport { horizontalMenu } from \"./horizontalMenu\";\nimport LazyLoadQueue from \"./lazyLoadQueue\";\nimport { attachContextMenuListener, openBtnMenu, positionMenu, putPreloader } from \"./misc\";\nimport { ripple } from \"./ripple\";\nimport Scrollable, { ScrollableX } from \"./scrollable\";\nimport { wrapDocument, wrapPhoto, wrapVideo } from \"./wrappers\";\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\nimport I18n, { LangPackKey, i18n } from \"../lib/langPack\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { getMiddleware } from \"../helpers/middleware\";\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\nimport { ChannelParticipant, ChatFull, ChatParticipant, ChatParticipants, Message, MessageMedia, Photo, WebPage } from \"../layer\";\nimport SortedUserList from \"./sortedUserList\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appSidebarRight from \"./sidebarRight\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport positionElementByIndex from \"../helpers/dom/positionElementByIndex\";\nimport cleanSearchText from \"../helpers/cleanSearchText\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport handleTabSwipe from \"../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../helpers/windowSize\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupForward from \"./popups/forward\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport Row from \"./row\";\nimport htmlToDocumentFragment from \"../helpers/dom/htmlToDocumentFragment\";\nimport { SearchSelection } from \"./chat/selection\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent, simulateClickEvent } from \"../helpers/dom/clickEvent\";\nimport { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport AppMediaViewer from \"./appMediaViewer\";\nimport lockTouchScroll from \"../helpers/dom/lockTouchScroll\";\n\n//const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper\n ) {\n const onContextMenu = (e: MouseEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n this.buttons.forEach(button => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n });\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: () => appMessagesManager.canForward(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected && \n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => appMessagesManager.canDeleteMessage(appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n rootScope.dispatchEvent('history_focus', {\n peerId: this.peerId,\n mid: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message, \n middleware: () => boolean, \n promises: Promise[], \n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n \n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n public urlsToRevoke: string[] = [];\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n \n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.searchContextMenu = new SearchContextMenu(this.container, this);\n this.selection = new SearchSelection(this, appMessagesManager);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.tabsContainer, \n onSwipe: (xDiff, yDiff, e) => {\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.mediaTab.contentTab.childElementCount/* && false */) {\n //this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n //this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n return;\n }\n \n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n \n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container, \n position: 'start'\n });\n scrollTop = offsetTop;\n }\n \n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n \n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n \n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n \n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n //console.log('what you gonna do', this.goingHard, diff);\n \n //this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n //}\n }\n }\n }\n \n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n //this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n \n //console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false});\n \n const onMediaClick = (className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n \n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map(el => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el, \n mid: +containerEl.dataset.mid, \n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n //const ids = Object.keys(this.mediaDivsByIds).map(k => +k).sort((a, b) => a - b);\n const idx = targets.findIndex(item => item.mid === mid && item.peerId === peerId);\n \n const message = appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'));\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'));\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n });\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: message.peerId, \n container: searchGroup.list, \n drawStatus: false,\n avatarSize: 54\n });\n\n appDialogsManager.setLastMessage(dialog, message, dom, this.searchContext.query);\n }\n\n private processPhotoVideoFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n //this.log(message, photo);\n\n let wrapped: ReturnType;\n const size = appPhotosManager.choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n size\n }).thumb;\n } else {\n wrapped = wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n [wrapped.images.thumb, wrapped.images.full].filter(Boolean).forEach(image => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n elemsToAppend.push({element: div, message});\n }\n\n private processDocumentFilter({message, elemsToAppend, inputFilter}: ProcessSearchSuperResult) {\n const document = appMessagesManager.getMediaFromMessage(message);\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n const div = wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n noAutoDownload: true\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n elemsToAppend.push({element: div, message});\n }\n\n private processUrlFilter({message, promises, middleware, elemsToAppend}: ProcessSearchSuperResult) {\n let webpage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage;\n\n if(!webpage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n //this.log.error('NO ENTITY:', message);\n const match = RichTextProcessor.matchUrl(message.message);\n if(!match) {\n //this.log.error('NO ENTITY AND NO MATCH:', message);\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n //display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webpage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webpage.description = message.message;\n webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\n }\n }\n\n let previewDiv = document.createElement('div');\n previewDiv.classList.add('preview', 'row-media');\n \n //this.log('wrapping webpage', webpage);\n \n if(webpage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webpage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: appPhotosManager.choosePhotoSize(webpage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\n const aFragment = htmlToDocumentFragment(RichTextProcessor.wrapRichText(webpage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', appMessagesManager.wrapSenderToPeer(message));\n }\n \n if(!title) {\n //title = new URL(webpage.url).hostname;\n title = RichTextProcessor.wrapPlainText(webpage.display_url.split('/', 1)[0]);\n }\n\n const row = new Row({\n title,\n titleRight: appMessagesManager.wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n /* const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('row-media'); */\n\n row.container.append(previewDiv);\n \n /* ripple(div);\n div.append(previewDiv);\n div.insertAdjacentHTML('beforeend', `\n
${title}${titleAdditionHTML}
\n
${subtitle}
\n
${url}
\n ${sender}\n `); */\n \n if(row.container.innerText.trim().length) {\n elemsToAppend.push({element: row.container, message});\n }\n }\n \n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n \n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n \n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n \n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n //this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n for(const message of messages) {\n try {\n options.message = message;\n processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n }\n }\n \n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n }\n \n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach(details => {\n const {element, message} = details;\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n \n //if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : messages.length, sharedMediaDiv);\n //}\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach(child => {\n child.remove();\n });\n\n //this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(let i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.forEach((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n \n renderedPeerIds.add(peerId);\n \n const peer = appPeersManager.getPeer(peerId);\n \n //////////this.log('contacts peer', peer);\n \n const {dom} = appDialogsManager.addDialogNew({\n dialog: peerId, \n container: group.list, \n drawStatus: false,\n avatarSize: 48,\n autonomous: group.autonomous\n });\n \n if(showMembersCount && (peer.participants_count || peer.participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(appProfileManager.getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n \n dom.lastMessageSpan.innerHTML = '' + username + '';\n }\n });\n \n group.toggle();\n };\n \n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n \n //this.loadedContacts = true;\n \n return arg;\n };\n \n return Promise.all([\n appUsersManager.getContactsPeerIds(query, true)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n \n appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n \n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n showMore.addEventListener('click', () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n \n appMessagesManager.getConversations(query, 0, 20, 0).promise\n .then(onLoad)\n .then(value => {\n if(value) {\n setResults(value.dialogs.map(d => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return appStateManager.getState().then(state => {\n if(!middleware()) {\n return;\n }\n \n this.searchGroups.recent.list.innerHTML = '';\n \n state.recentSearch.slice(0, 20).forEach(peerId => {\n let {dialog, dom} = appDialogsManager.addDialogNew({\n dialog: peerId,\n container: this.searchGroups.recent.list,\n drawStatus: false,\n meAsSaved: true,\n avatarSize: 48,\n autonomous: true\n });\n \n dom.lastMessageSpan.append(peerId.isUser() ? appUsersManager.getUserStatusString(peerId) : appProfileManager.getChatMembersString(peerId.toChatId()));\n });\n \n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n appUsersManager.getTopPeers('correspondents').then(peers => {\n if(!middleware()) return;\n\n const idx = peers.findIndex(peer => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n //console.log('got top categories:', categories);\n if(peers.length) {\n peers.forEach((peer) => {\n appDialogsManager.addDialogNew({\n dialog: peer.id, \n container: this.searchGroups.people.list, \n drawStatus: false,\n onlyFirstName: true,\n avatarSize: 54,\n autonomous: false\n });\n });\n }\n \n this.searchGroups.people.setActive();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n \n if(!this.membersList) {\n this.membersList = new SortedUserList({lazyLoadQueue: this.lazyLoadQueue, rippleEnabled: false});\n this.membersList.list.addEventListener('click', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n \n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n participants.forEach(participant => {\n const peerId = appChatsManager.getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n return;\n }\n\n const user = appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n return;\n }\n\n this.membersList.add(peerId);\n });\n };\n\n if(appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then(participants => {\n if(!middleware()) {\n return;\n }\n\n let list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = (appProfileManager.getChatFull(id) as Promise).then(chatFull => {\n if(!middleware()) {\n return;\n }\n\n //console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = chatFull.participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n \n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => { \n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ?? (this.historyStorage[type] = []);\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const logStr = 'load [' + type + ']: ';\n\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n let messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n let ids = history.slice(used, used + loadCount);\n //this.log(logStr + 'will render from cache', used, history, ids, loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n messages.push(...this.filterMessagesByType(ids.map(m => appMessagesManager.getMessageByPeer(m.peerId, m.mid)), type));\n } while(slicedLength < loadCount && used < history.length);\n \n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n //if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n //}\n\n return Promise.resolve();\n }\n \n let maxId = history.length ? history[history.length - 1].mid : 0;\n \n //this.log(logStr + 'search house of glass pre', type, maxId);\n \n //let loadCount = history.length ? 50 : 15;\n return this.loadPromises[type] = appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId, \n limit: loadCount,\n nextRate: this.nextRates[type] ?? (this.nextRates[type] = 0)\n }).then(value => {\n history.push(...value.history.map(m => ({mid: m.mid, peerId: m.peerId})));\n \n this.log(logStr + 'search house of glass', type, value);\n\n if(!middleware()) {\n //this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n //if((value.count || history.length === value.count) && history.length >= value.count) {\n //this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return Promise.resolve();\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n (this.loadPromises[type] || Promise.resolve()).then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n //this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n //this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n //if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n //}\n }).catch(err => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n }\n \n public async load(single = false, justLoad = false) {\n // if(testScroll/* || 1 === 1 */) {\n // return;\n // }\n\n //return;\n \n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n if(this.hideEmptyTabs) {\n const mediaTabs = this.mediaTabs.filter(mediaTab => mediaTab.inputFilter !== 'inputMessagesFilterEmpty')\n const filters = mediaTabs.map(mediaTab => ({_: mediaTab.inputFilter}));\n\n const counters = await appMessagesManager.getSearchCounters(peerId, filters);\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach(mediaTab => {\n const counter = counters.find(c => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n //mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count && firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n if(counter.count) ++count;\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n const canViewMembers = this.canViewMembers();\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n this.firstLoad = false;\n }\n \n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter(t => t !== this.mediaTab);\n toLoad = toLoad.filter(mediaTab => {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n });\n\n if(peerId.isUser()) {\n toLoad.findAndSplice(mediaTab => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map(mediaTab => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware)\n });\n\n return Promise.all(promises).catch(err => {\n this.log.error('Load error all promises:', err);\n });\n }\n \n public getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n \n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n return this.searchContext.peerId.isAnyChat() && !appChatsManager.isBroadcast(this.searchContext.peerId.toChatId()) && appChatsManager.hasRights(this.searchContext.peerId.toChatId(), 'view_participants');\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach(mediaTab => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach(mediaTab => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n if(this.urlsToRevoke.length) {\n this.urlsToRevoke.forEach(url => {\n URL.revokeObjectURL(url);\n });\n this.urlsToRevoke.length = 0;\n }\n\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.innerHTML = '';\n\n if(this.hideEmptyTabs) {\n //tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n \n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n //if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n //}\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId, \n query?: string, \n threadId?: number, \n historyStorage?: AppSearchSuper['historyStorage'], \n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n \n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"./cancelEvent\";\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { InputPrivacyKey, InputPrivacyRule, PrivacyRule, Update, PrivacyKey } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\n\r\nexport enum PrivacyType {\r\n Everybody = 2,\r\n Contacts = 1,\r\n Nobody = 0\r\n}\r\n\r\nexport class AppPrivacyManager {\r\n private privacy: Partial<{\r\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\r\n }> = {};\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updatePrivacy: (update) => {\r\n const key = update.key._;\r\n this.privacy[key] = update.rules;\r\n rootScope.dispatchEvent('privacy_update', update);\r\n }\r\n });\r\n }\r\n\r\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\r\n return apiManager.invokeApi('account.setPrivacy', {\r\n key: {\r\n _: inputKey\r\n },\r\n rules\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updatePrivacy',\r\n key: {\r\n _: convertInputKeyToKey(inputKey)\r\n },\r\n rules: rules.map(inputRule => {\r\n const rule: PrivacyRule = {} as any;\r\n Object.assign(rule, inputRule);\r\n rule._ = convertInputKeyToKey(rule._) as any;\r\n return rule;\r\n })\r\n });\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\r\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\r\n const rules = this.privacy[privacyKey];\r\n if(rules) {\r\n return Promise.resolve(rules);\r\n }\r\n \r\n return this.privacy[privacyKey] = apiManager.invokeApi('account.getPrivacy', {\r\n key: {\r\n _: inputKey\r\n }\r\n }).then(privacyRules => {\r\n appUsersManager.saveApiUsers(privacyRules.users);\r\n appChatsManager.saveApiChats(privacyRules.chats);\r\n\r\n //console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\r\n\r\n return this.privacy[privacyKey] = privacyRules.rules;\r\n });\r\n }\r\n\r\n public getPrivacyRulesDetails(rules: PrivacyRule[]) {\r\n const types: PrivacyType[] = [];\r\n\r\n type peers = {users: UserId[], chats: ChatId[]};\r\n let allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\r\n rules.forEach(rule => {\r\n switch(rule._) {\r\n case 'privacyValueAllowAll':\r\n types.push(2);\r\n break;\r\n case 'privacyValueDisallowAll':\r\n types.push(0);\r\n break;\r\n case 'privacyValueAllowContacts': \r\n types.push(1);\r\n break;\r\n /* case 'privacyValueDisallowContacts':\r\n types.push('Except My Contacts');\r\n break; */\r\n case 'privacyValueAllowChatParticipants':\r\n allowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueAllowUsers':\r\n allowPeers.users.push(...rule.users);\r\n break;\r\n case 'privacyValueDisallowChatParticipants':\r\n disallowPeers.chats.push(...rule.chats);\r\n break;\r\n case 'privacyValueDisallowUsers':\r\n disallowPeers.users.push(...rule.users);\r\n break;\r\n }\r\n });\r\n\r\n return {type: types[0], disallowPeers, allowPeers};\r\n }\r\n}\r\n\r\nconst appPrivacyManager = new AppPrivacyManager();\r\nMOUNT_CLASS_TO.appPrivacyManager = appPrivacyManager;\r\nexport default appPrivacyManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { randomLong } from \"../helpers/random\";\r\nimport { InputPrivacyKey, InputPrivacyRule } from \"../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../lib/appManagers/appPrivacyManager\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport { i18n, join, LangPackKey, _i18n } from \"../lib/langPack\";\r\nimport RadioField from \"./radioField\";\r\nimport Row, { RadioFormFromRows } from \"./row\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { SettingSection, generateSection } from \"./sidebarLeft\";\r\nimport AppAddMembersTab from \"./sidebarLeft/tabs/addMembers\";\r\nimport { SliderSuperTabEventable } from \"./sliderTab\";\r\n\r\ntype PrivacySectionStr = LangPackKey | '';\r\nexport default class PrivacySection {\r\n public radioRows: Map;\r\n public radioSection: SettingSection;\r\n public exceptions: Map;\r\n public peerIds: {\r\n disallow?: PeerId[],\r\n allow?: PeerId[]\r\n };\r\n public type: PrivacyType;\r\n\r\n constructor(public options: {\r\n tab: SliderSuperTabEventable,\r\n title: LangPackKey, \r\n inputKey: InputPrivacyKey['_'], \r\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\r\n appendTo?: Scrollable,\r\n noExceptions?: boolean,\r\n onRadioChange?: (value: number) => any,\r\n skipTypes?: PrivacyType[],\r\n exceptionTexts?: [LangPackKey, LangPackKey]\r\n }) {\r\n if(options.captions) {\r\n options.captions.reverse();\r\n }\r\n\r\n this.radioSection = new SettingSection({name: options.title, caption: true});\r\n\r\n this.radioRows = new Map();\r\n\r\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\r\n type: PrivacyType.Everybody,\r\n langKey: 'PrivacySettingsController.Everbody'\r\n }, {\r\n type: PrivacyType.Contacts,\r\n langKey: 'PrivacySettingsController.MyContacts'\r\n }, {\r\n type: PrivacyType.Nobody,\r\n langKey: 'PrivacySettingsController.Nobody'\r\n }];\r\n\r\n if(options.skipTypes) {\r\n r = r.filter(r => !options.skipTypes.includes(r.type));\r\n }\r\n \r\n const random = randomLong();\r\n r.forEach(({type, langKey}) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey, \r\n name: random, \r\n value: '' + type\r\n })\r\n });\r\n \r\n this.radioRows.set(type, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\r\n\r\n this.radioSection.content.append(form);\r\n if(options.appendTo) {\r\n options.appendTo.append(this.radioSection.container);\r\n }\r\n\r\n if(!options.noExceptions) {\r\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\r\n\r\n this.exceptions = new Map([[\r\n 'disallow', \r\n {\r\n titleLangKey: options.exceptionTexts[0],\r\n key: 'disallow',\r\n row: null,\r\n icon: 'deleteuser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ], [\r\n 'allow', \r\n {\r\n titleLangKey: options.exceptionTexts[1],\r\n key: 'allow',\r\n row: null,\r\n icon: 'adduser',\r\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\r\n clickable: true\r\n }\r\n ]]);\r\n\r\n this.exceptions.forEach((exception) => {\r\n exception.row = new Row(exception);\r\n\r\n exception.row.container.addEventListener('click', () => {\r\n promise.then(() => {\r\n const _peerIds = this.peerIds[exception.key];\r\n new AppAddMembersTab(options.tab.slider).open({\r\n type: 'privacy',\r\n skippable: true,\r\n title: exception.titleLangKey,\r\n placeholder: 'PrivacyModal.Search.Placeholder',\r\n takeOut: (newPeerIds) => {\r\n _peerIds.length = 0;\r\n _peerIds.push(...newPeerIds);\r\n exception.row.subtitle.innerHTML = '';\r\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\r\n },\r\n selectedPeerIds: _peerIds\r\n });\r\n });\r\n });\r\n\r\n container.append(exception.row.container);\r\n });\r\n }\r\n\r\n /* setTimeout(() => {\r\n this.setRadio(PrivacyType.Contacts);\r\n }, 0); */\r\n\r\n const promise = appPrivacyManager.getPrivacy(options.inputKey).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n this.setRadio(details.type);\r\n\r\n if(this.exceptions) {\r\n this.peerIds = {};\r\n ['allow' as const, 'disallow' as const].forEach(k => {\r\n const arr = [];\r\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\r\n arr.push(...from.users.map(id => id.toPeerId()));\r\n arr.push(...from.chats.map(id => id.toPeerId(true)));\r\n this.peerIds[k] = arr;\r\n const s = this.exceptions.get(k).row.subtitle;\r\n s.innerHTML = '';\r\n s.append(...this.generateStr(from));\r\n });\r\n }\r\n\r\n options.tab.eventListener.addEventListener('destroy', () => {\r\n const rules: InputPrivacyRule[] = [];\r\n\r\n switch(this.type) {\r\n case PrivacyType.Everybody:\r\n rules.push({_: 'inputPrivacyValueAllowAll'});\r\n break;\r\n case PrivacyType.Contacts:\r\n rules.push({_: 'inputPrivacyValueAllowContacts'});\r\n break;\r\n case PrivacyType.Nobody:\r\n rules.push({_: 'inputPrivacyValueDisallowAll'});\r\n break;\r\n }\r\n\r\n if(this.exceptions) {\r\n ([\r\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\r\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\r\n ] as Array<[\r\n 'allow' | 'disallow', \r\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants', \r\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\r\n ]>).forEach(([k, chatKey, usersKey], idx) => {\r\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\r\n return;\r\n }\r\n\r\n const _peerIds = this.peerIds[k];\r\n if(_peerIds) {\r\n const splitted = this.splitPeersByType(_peerIds);\r\n if(splitted.chats.length) {\r\n rules.push({_: chatKey, chats: splitted.chats});\r\n }\r\n \r\n if(splitted.users.length) {\r\n rules.push({_: usersKey, users: splitted.users.map(id => appUsersManager.getUserInput(id))});\r\n }\r\n }\r\n });\r\n }\r\n \r\n appPrivacyManager.setPrivacy(options.inputKey, rules);\r\n }, {once: true});\r\n });\r\n }\r\n\r\n private onRadioChange = (value: string | PrivacySection['type']) => {\r\n value = +value as PrivacySection['type'];\r\n this.type = value;\r\n\r\n const caption = this.options.captions[this.type];\r\n const captionElement = this.radioSection.caption;\r\n if(!caption) {\r\n captionElement.innerHTML = '';\r\n } else {\r\n _i18n(captionElement, caption);\r\n }\r\n captionElement.classList.toggle('hide', !caption);\r\n\r\n if(this.exceptions) {\r\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\r\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\r\n }\r\n\r\n this.options.onRadioChange && this.options.onRadioChange(value);\r\n };\r\n\r\n public setRadio(type: PrivacySection['type']) {\r\n const row = this.radioRows.get(type);\r\n this.onRadioChange(type);\r\n row.radioField.input.checked = true;\r\n }\r\n \r\n private splitPeersByType(peerIds: PeerId[]) {\r\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\r\n peerIds.forEach(peerId => {\r\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\r\n });\r\n\r\n return peers;\r\n }\r\n\r\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\r\n if(!peers.users.length && !peers.chats.length) {\r\n return [i18n('PrivacySettingsController.AddUsers')];\r\n }\r\n\r\n return join([\r\n peers.users.length ? i18n('Users', [peers.users.length]) : null, \r\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\r\n ].filter(Boolean), false);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\r\n this.setTitle('PrivacyPhone');\r\n\r\n const phoneCaption: LangPackKey = 'PrivacyPhoneInfo';\r\n const phoneSection = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle',\r\n inputKey: 'inputPrivacyKeyPhoneNumber',\r\n captions: [phoneCaption, phoneCaption, ''],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n onRadioChange: (type) => {\r\n s.setRadio(PrivacyType.Everybody);\r\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\r\n }\r\n });\r\n\r\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\r\n const s = new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyPhoneTitle2',\r\n inputKey: 'inputPrivacyKeyAddedByPhone',\r\n captions: [sCaption, sCaption, ''],\r\n noExceptions: true,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n\r\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\n\r\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\r\n this.setTitle('TwoStepVerificationPasswordSet');\r\n\r\n const section = new SettingSection({\r\n caption: 'TwoStepVerificationPasswordSetInfo',\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🥳';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: true,\r\n play: true,\r\n width: 160,\r\n height: 160\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\r\n\r\n attachClickEvent(btnReturn, (e) => {\r\n this.close();\r\n });\r\n\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n\r\n inputWrapper.append(btnReturn);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport function canFocus(isFirstInput: boolean) {\r\n return !IS_MOBILE_SAFARI || !isFirstInput;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport CodeInputField from \"../../../codeInputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport { i18n, _i18n } from \"../../../../lib/langPack\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\r\n public codeInputField: CodeInputField;\r\n public state: AccountPassword;\r\n public email: string;\r\n public length: number;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\r\n this.setTitle('TwoStepAuth.RecoveryTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\r\n\r\n const emoji = '📬';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.codeInputField = new CodeInputField({\r\n name: 'recovery-email-code',\r\n label: 'TwoStepAuth.RecoveryCode',\r\n length: this.length,\r\n onFill: (code) => {\r\n freeze(true);\r\n \r\n passwordManager.confirmPasswordEmail('' + code)\r\n .then(value => {\r\n if(!value) {\r\n\r\n }\r\n\r\n goNext();\r\n })\r\n .catch(err => {\r\n switch(err.type) {\r\n case 'CODE_INVALID':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\r\n break;\r\n\r\n case 'EMAIL_HASH_EXPIRED':\r\n inputField.input.classList.add('error');\r\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\r\n break;\r\n \r\n default:\r\n console.error('confirm error', err);\r\n break;\r\n }\r\n\r\n freeze(false);\r\n });\r\n }\r\n });\r\n\r\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\r\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const freeze = (disable: boolean) => {\r\n toggleDisability([inputField.input, btnChange, btnResend], disable);\r\n };\r\n\r\n attachClickEvent(btnChange, (e) => {\r\n freeze(true);\r\n passwordManager.cancelPasswordEmail().then(value => {\r\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\r\n this.close();\r\n }, () => {\r\n freeze(false);\r\n });\r\n });\r\n\r\n attachClickEvent(btnResend, (e) => {\r\n freeze(true);\r\n const d = putPreloader(btnResend);\r\n passwordManager.resendPasswordEmail().then(value => {\r\n d.remove();\r\n freeze(false);\r\n });\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnChange, btnResend);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.codeInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationSetTab from \"./passwordSet\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./emailConfirmation\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n public hint: string;\r\n public isFirst = false;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\r\n this.setTitle('RecoveryEmailTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💌';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputContent = section.generateContentElement();\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'recovery-email',\r\n label: 'RecoveryEmail',\r\n plainText: true\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n inputField.input.addEventListener('input', (e) => {\r\n inputField.input.classList.remove('error');\r\n });\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const goNext = () => {\r\n new AppTwoStepVerificationSetTab(this.slider).open();\r\n };\r\n\r\n const onContinueClick = () => {\r\n const email = inputField.value.trim();\r\n const match = RichTextProcessor.matchEmail(email);\r\n if(!match || match[0].length !== email.length) {\r\n inputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n toggleButtons(true);\r\n const d = putPreloader(btnContinue);\r\n\r\n passwordManager.updateSettings({\r\n hint: this.hint,\r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email\r\n }).then((value) => {\r\n goNext();\r\n }, (err) => {\r\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\r\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\r\n\r\n const tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.state = this.state;\r\n tab.email = email;\r\n tab.length = symbols;\r\n tab.open();\r\n } else {\r\n console.log('password set error', err);\r\n }\r\n\r\n toggleButtons(false);\r\n d.remove();\r\n });\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n const toggleButtons = (freeze: boolean) => {\r\n if(freeze) {\r\n btnContinue.setAttribute('disabled', 'true');\r\n btnSkip.setAttribute('disabled', 'true');\r\n } else {\r\n btnContinue.removeAttribute('disabled');\r\n btnSkip.removeAttribute('disabled');\r\n }\r\n };\r\n\r\n attachClickEvent(btnSkip, (e) => {\r\n const popup = new PopupPeer('popup-skip-email', {\r\n buttons: [{\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }, {\r\n langKey: 'YourEmailSkip',\r\n callback: () => {\r\n //inputContent.classList.add('sidebar-left-section-disabled');\r\n toggleButtons(true);\r\n putPreloader(btnSkip);\r\n passwordManager.updateSettings({\r\n hint: this.hint, \r\n currentPassword: this.plainPassword,\r\n newPassword: this.newPassword,\r\n email: ''\r\n }).then(() => {\r\n goNext();\r\n }, (err) => {\r\n toggleButtons(false);\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'YourEmailSkipWarning',\r\n descriptionLangKey: 'YourEmailSkipWarningText'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n inputContent.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport Button from \"../../../button\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport InputField from \"../../../inputField\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport { toast } from \"../../../toast\";\r\nimport I18n from \"../../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\r\n public inputField: InputField;\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\r\n this.setTitle('TwoStepAuth.SetupHintTitle');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '💡';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 160,\r\n height: 160,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const inputField = this.inputField = new InputField({\r\n name: 'hint',\r\n label: 'TwoStepAuth.SetupHintPlaceholder'\r\n });\r\n\r\n inputField.input.addEventListener('keypress', (e) => {\r\n if(e.key === 'Enter') {\r\n cancelEvent(e);\r\n return inputField.value ? onContinueClick() : onSkipClick();\r\n }\r\n });\r\n\r\n const goNext = (e?: Event, saveHint?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n const hint = saveHint ? inputField.value : undefined;\r\n if(hint && this.newPassword === hint) {\r\n toast(I18n.format('PasswordAsHintError', true));\r\n return;\r\n }\r\n\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.hint = hint;\r\n\r\n tab.open();\r\n };\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\r\n\r\n const onContinueClick = (e?: Event) => goNext(e, true);\r\n const onSkipClick = (e?: Event) => goNext(e, false);\r\n attachClickEvent(btnContinue, onContinueClick);\r\n attachClickEvent(btnSkip, onSkipClick);\r\n\r\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\r\n\r\n section.content.append(inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.inputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport Button from \"../../../button\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport TrackingMonkey from \"../../../monkeys/tracking\";\r\nimport AppTwoStepVerificationHintTab from \"./hint\";\r\nimport { InputState } from \"../../../inputField\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public newPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\r\n this.setTitle('PleaseReEnterPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 're-enter-password',\r\n label: 'PleaseReEnterPassword'\r\n });\r\n\r\n const monkey = new TrackingMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.setState(InputState.Neutral);\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(this.newPassword !== passwordInputField.value) {\r\n passwordInputField.setError();\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n const onContinueClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationHintTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.newPassword;\r\n tab.open();\r\n };\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n \r\n onOpenAfterTimeout() {\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport AppTwoStepVerificationTab from \".\";\r\nimport { SettingSection } from \"../..\";\r\nimport { cancelEvent } from \"../../../../helpers/dom/cancelEvent\";\r\nimport { canFocus } from \"../../../../helpers/dom/canFocus\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../../../../helpers/dom/replaceContent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport I18n, { i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport RichTextProcessor from \"../../../../lib/richtextprocessor\";\r\nimport Button from \"../../../button\";\r\nimport { putPreloader } from \"../../../misc\";\r\nimport PasswordMonkey from \"../../../monkeys/password\";\r\nimport PasswordInputField from \"../../../passwordInputField\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport AppTwoStepVerificationReEnterPasswordTab from \"./reEnterPassword\";\r\n\r\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public passwordInputField: PasswordInputField;\r\n public plainPassword: string;\r\n public isFirst = true;\r\n \r\n protected init() {\r\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\r\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\r\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\r\n\r\n const section = new SettingSection({\r\n noDelimiter: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const passwordInputField = this.passwordInputField = new PasswordInputField({\r\n name: 'enter-password',\r\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\r\n labelText: !isNew && this.state.hint ? RichTextProcessor.wrapEmojiText(this.state.hint) : undefined\r\n });\r\n\r\n const monkey = new PasswordMonkey(passwordInputField, 157);\r\n\r\n const btnContinue = Button('btn-primary btn-color-primary');\r\n const textEl = new I18n.IntlElement({key: 'Continue'});\r\n\r\n btnContinue.append(textEl.element);\r\n\r\n inputWrapper.append(passwordInputField.container, btnContinue);\r\n section.content.append(monkey.container, inputWrapper);\r\n\r\n this.scrollable.container.append(section.container);\r\n\r\n passwordInputField.input.addEventListener('keypress', (e) => {\r\n if(passwordInputField.input.classList.contains('error')) {\r\n passwordInputField.input.classList.remove('error');\r\n textEl.key = 'Continue';\r\n textEl.update();\r\n }\r\n \r\n if(e.key === 'Enter') {\r\n return onContinueClick();\r\n }\r\n });\r\n\r\n const verifyInput = () => {\r\n if(!passwordInputField.value.length) {\r\n passwordInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n let onContinueClick: (e?: Event) => void;\r\n if(!isNew) {\r\n let getStateInterval: number;\r\n\r\n let getState = () => {\r\n // * just to check session relevance\r\n if(!getStateInterval) {\r\n getStateInterval = window.setInterval(getState, 10e3);\r\n }\r\n \r\n return passwordManager.getState().then(_state => {\r\n this.state = _state;\r\n \r\n if(this.state.hint) {\r\n passwordInputField.label.innerHTML = RichTextProcessor.wrapEmojiText(this.state.hint);\r\n } else {\r\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\r\n }\r\n });\r\n };\r\n \r\n const submit = (e?: Event) => {\r\n if(!verifyInput()) {\r\n cancelEvent(e);\r\n return;\r\n }\r\n\r\n btnContinue.setAttribute('disabled', 'true');\r\n textEl.key = 'PleaseWait';\r\n textEl.update();\r\n const preloader = putPreloader(btnContinue);\r\n \r\n const plainPassword = passwordInputField.value;\r\n passwordManager.check(passwordInputField.value, this.state).then(auth => {\r\n console.log(auth);\r\n \r\n if(auth._ === 'auth.authorization') {\r\n clearInterval(getStateInterval);\r\n if(monkey) monkey.remove();\r\n const tab = new AppTwoStepVerificationTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = plainPassword;\r\n tab.open();\r\n this.slider.removeTabFromHistory(this);\r\n }\r\n }, (err) => {\r\n btnContinue.removeAttribute('disabled');\r\n passwordInputField.input.classList.add('error');\r\n \r\n switch(err.type) {\r\n default:\r\n //btnContinue.innerText = err.type;\r\n textEl.key = 'TwoStepAuth.InvalidPassword';\r\n textEl.update();\r\n preloader.remove();\r\n passwordInputField.select();\r\n break;\r\n }\r\n \r\n getState();\r\n });\r\n };\r\n \r\n onContinueClick = submit;\r\n\r\n getState();\r\n } else {\r\n onContinueClick = (e) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(!verifyInput()) return;\r\n\r\n const tab = new AppTwoStepVerificationReEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.newPassword = passwordInputField.value;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n };\r\n }\r\n\r\n attachClickEvent(btnContinue, onContinueClick);\r\n\r\n return monkey.load();\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n if(!canFocus(this.isFirst)) return;\r\n this.passwordInputField.input.focus();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"../..\";\r\nimport { attachClickEvent } from \"../../../../helpers/dom/clickEvent\";\r\nimport { AccountPassword } from \"../../../../layer\";\r\nimport appStickersManager from \"../../../../lib/appManagers/appStickersManager\";\r\nimport { _i18n } from \"../../../../lib/langPack\";\r\nimport passwordManager from \"../../../../lib/mtproto/passwordManager\";\r\nimport Button from \"../../../button\";\r\nimport PopupPeer from \"../../../popups/peer\";\r\nimport { SliderSuperTab } from \"../../../slider\";\r\nimport { wrapSticker } from \"../../../wrappers\";\r\nimport AppSettingsTab from \"../settings\";\r\nimport AppTwoStepVerificationEmailTab from \"./email\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./enterPassword\";\r\n\r\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\r\n public state: AccountPassword;\r\n public plainPassword: string;\r\n\r\n protected init() {\r\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\r\n this.setTitle('TwoStepVerificationTitle');\r\n\r\n const section = new SettingSection({\r\n caption: true,\r\n noDelimiter: true\r\n });\r\n\r\n const emoji = '🔐';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 168,\r\n height: 168,\r\n emoji\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n section.content.append(stickerContainer);\r\n\r\n const c = section.generateContentElement();\r\n if(this.state.pFlags.has_password) {\r\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\r\n\r\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\r\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\r\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\r\n\r\n attachClickEvent(btnChangePassword, () => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.plainPassword = this.plainPassword;\r\n tab.open();\r\n });\r\n\r\n attachClickEvent(btnDisablePassword, () => {\r\n const popup = new PopupPeer('popup-disable-password', {\r\n buttons: [{\r\n langKey: 'Disable',\r\n callback: () => {\r\n passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\r\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\r\n this.close();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'TurnPasswordOffQuestionTitle',\r\n descriptionLangKey: 'TurnPasswordOffQuestion'\r\n });\r\n\r\n popup.show();\r\n });\r\n\r\n attachClickEvent(btnSetRecoveryEmail, () => {\r\n const tab = new AppTwoStepVerificationEmailTab(this.slider);\r\n tab.state = this.state;\r\n tab.hint = this.state.hint;\r\n tab.plainPassword = this.plainPassword;\r\n tab.newPassword = this.plainPassword;\r\n tab.isFirst = true;\r\n tab.open();\r\n });\r\n\r\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\r\n } else {\r\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\r\n \r\n inputWrapper.append(btnSetPassword);\r\n c.append(inputWrapper);\r\n\r\n attachClickEvent(btnSetPassword, (e) => {\r\n const tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n tab.state = this.state;\r\n tab.open();\r\n });\r\n }\r\n\r\n this.scrollable.container.append(section.container);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\r\n this.setTitle('PrivacyLastSeen');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'LastSeenTitle',\r\n inputKey: 'inputPrivacyKeyStatusTimestamp',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\r\n this.setTitle('PrivacyProfilePhoto');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyProfilePhotoTitle',\r\n inputKey: 'inputPrivacyKeyProfilePhoto',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\r\n this.setTitle('PrivacySettings.Forwards');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyForwardsTitle',\r\n inputKey: 'inputPrivacyKeyForwards',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\nimport { PrivacyType } from \"../../../../lib/appManagers/appPrivacyManager\";\r\n\r\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\r\n this.setTitle('PrivacySettings.Groups');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanAddMe',\r\n inputKey: 'inputPrivacyKeyChatInvite',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable,\r\n skipTypes: [PrivacyType.Nobody]\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../../sliderTab\";\r\nimport PrivacySection from \"../../../privacySection\";\r\nimport { LangPackKey } from \"../../../../lib/langPack\";\r\n\r\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('privacy-tab', 'privacy-calls');\r\n this.setTitle('PrivacySettings.VoiceCalls');\r\n\r\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'WhoCanCallMe',\r\n inputKey: 'inputPrivacyKeyPhoneCall',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n\r\n {\r\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\r\n new PrivacySection({\r\n tab: this,\r\n title: 'PrivacyP2PHeader',\r\n inputKey: 'inputPrivacyKeyPhoneP2P',\r\n captions: [caption, caption, caption],\r\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\r\n appendTo: this.scrollable\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport Button from \"../../button\";\r\nimport Row from \"../../row\";\r\nimport { Authorization } from \"../../../layer\";\r\nimport { formatDateAccordingToTodayNew } from \"../../../helpers/date\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport { toast } from \"../../toast\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppActiveSessionsTab extends SliderSuperTab {\r\n public privacyTab: AppPrivacyAndSecurityTab;\r\n public authorizations: Authorization.authorization[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('active-sessions-container');\r\n this.setTitle('SessionsTitle');\r\n\r\n const Session = (auth: Authorization.authorization) => {\r\n const row = new Row({\r\n title: [auth.app_name, auth.app_version].join(' '),\r\n subtitle: [auth.ip, auth.country].join(' - '),\r\n clickable: true,\r\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\r\n });\r\n\r\n row.container.dataset.hash = '' + auth.hash;\r\n\r\n const midtitle = document.createElement('div');\r\n midtitle.classList.add('row-midtitle');\r\n midtitle.innerHTML = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\r\n\r\n row.subtitle.parentElement.insertBefore(midtitle, row.subtitle);\r\n\r\n return row;\r\n };\r\n\r\n const authorizations = this.authorizations.slice();\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'CurrentSession',\r\n caption: 'ClearOtherSessionsHelp'\r\n });\r\n\r\n const auth = authorizations.findAndSplice(auth => auth.pFlags.current);\r\n const session = Session(auth);\r\n\r\n section.content.append(session.container);\r\n\r\n if(authorizations.length) {\r\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\r\n attachClickEvent(btnTerminate, (e) => {\r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n const toggle = toggleDisability([btnTerminate], true);\r\n apiManager.invokeApi('auth.resetAuthorizations').then(value => {\r\n //toggleDisability([btnTerminate], false);\r\n btnTerminate.remove();\r\n otherSection.container.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }, onError).finally(() => {\r\n toggle();\r\n });\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionsTitle',\r\n descriptionLangKey: 'AreYouSureSessions'\r\n }).show();\r\n });\r\n \r\n section.content.append(btnTerminate);\r\n }\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n if(!authorizations.length) {\r\n return;\r\n }\r\n\r\n const otherSection = new SettingSection({\r\n name: 'OtherSessions',\r\n caption: 'SessionsListInfo'\r\n });\r\n\r\n authorizations.forEach(auth => {\r\n otherSection.content.append(Session(auth).container);\r\n });\r\n\r\n this.scrollable.append(otherSection.container);\r\n\r\n const onError = (err: any) => {\r\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\r\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\r\n }\r\n };\r\n\r\n let target: HTMLElement;\r\n const onTerminateClick = () => {\r\n const hash = target.dataset.hash;\r\n \r\n new PopupPeer('revoke-session', {\r\n buttons: [{\r\n langKey: 'Terminate',\r\n isDanger: true,\r\n callback: () => {\r\n apiManager.invokeApi('account.resetAuthorization', {hash})\r\n .then(value => {\r\n if(value) {\r\n target.remove();\r\n this.privacyTab.updateActiveSessions();\r\n }\r\n }, onError);\r\n }\r\n }],\r\n titleLangKey: 'AreYouSureSessionTitle',\r\n descriptionLangKey: 'TerminateSessionText'\r\n }).show();\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'stop',\r\n text: 'Terminate',\r\n onClick: onTerminateClick\r\n }]);\r\n element.id = 'active-sessions-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n });\r\n\r\n attachClickEvent(this.scrollable.container, (e) => {\r\n target = findUpClassName(e.target, 'row');\r\n if(!target || target.dataset.hash === '0') {\r\n return;\r\n }\r\n\r\n onTerminateClick();\r\n });\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { SettingSection } from \"..\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../../misc\";\r\nimport ButtonMenu from \"../../buttonMenu\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport PopupPickUser from \"../../popups/pickUser\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport findUpTag from \"../../../helpers/dom/findUpTag\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppBlockedUsersTab extends SliderSuperTab {\r\n public peerIds: PeerId[];\r\n private menuElement: HTMLElement;\r\n \r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('blocked-users-container');\r\n this.setTitle('BlockedUsers');\r\n\r\n {\r\n const section = new SettingSection({\r\n caption: 'BlockedUsersInfo'\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\r\n this.content.append(btnAdd);\r\n\r\n attachClickEvent(btnAdd, (e) => {\r\n new PopupPickUser({\r\n peerTypes: ['contacts'],\r\n placeholder: 'BlockModal.Search.Placeholder',\r\n onSelect: (peerId) => {\r\n //console.log('block', peerId);\r\n appUsersManager.toggleBlock(peerId, true);\r\n },\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const list = appDialogsManager.createChatList();\r\n this.scrollable.container.classList.add('chatlist-container');\r\n this.scrollable.append(list);\r\n\r\n const add = (peerId: PeerId, append: boolean) => {\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: list,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 48,\r\n append\r\n });\r\n\r\n const user = appUsersManager.getUser(peerId);\r\n if(user.pFlags.bot) {\r\n dom.lastMessageSpan.append('@' + user.username);\r\n } else {\r\n if(user.phone) dom.lastMessageSpan.innerHTML = appUsersManager.formatUserPhone(user.phone);\r\n else dom.lastMessageSpan.append(user.username ? '@' + user.username : appUsersManager.getUserStatusString(peerId));\r\n }\r\n\r\n //dom.titleSpan.innerHTML = 'Raaid El Syed';\r\n //dom.lastMessageSpan.innerHTML = '+1 234 567891';\r\n };\r\n\r\n for(const peerId of this.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n let target: HTMLElement;\r\n const onUnblock = () => {\r\n const peerId = target.dataset.peerId.toPeerId();\r\n appUsersManager.toggleBlock(peerId, false);\r\n };\r\n\r\n const element = this.menuElement = ButtonMenu([{\r\n icon: 'lockoff',\r\n text: 'Unblock',\r\n onClick: onUnblock,\r\n options: {listenerSetter: this.listenerSetter}\r\n }]);\r\n element.id = 'blocked-users-contextmenu';\r\n element.classList.add('contextmenu');\r\n\r\n document.getElementById('page-chats').append(element);\r\n\r\n attachContextMenuListener(this.scrollable.container, (e) => {\r\n target = findUpTag(e.target, 'LI');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n if(e instanceof MouseEvent) e.preventDefault();\r\n // smth\r\n if(e instanceof MouseEvent) e.cancelBubble = true;\r\n\r\n positionMenu(e, element);\r\n openBtnMenu(element);\r\n }, this.listenerSetter);\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\r\n const {peerId, blocked} = update;\r\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\r\n if(blocked) {\r\n if(!li) {\r\n add(peerId, false);\r\n }\r\n } else {\r\n if(li) {\r\n li.remove();\r\n }\r\n }\r\n });\r\n\r\n const LOAD_COUNT = 50;\r\n let loading = false;\r\n this.scrollable.onScrolledBottom = () => {\r\n if(loading) {\r\n return;\r\n }\r\n\r\n loading = true;\r\n appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then(res => {\r\n for(const peerId of res.peerIds) {\r\n add(peerId, true);\r\n }\r\n\r\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\r\n this.scrollable.onScrolledBottom = null;\r\n }\r\n\r\n this.scrollable.checkForTriggers();\r\n }).finally(() => {\r\n loading = false;\r\n });\r\n };\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.scrollable.onScroll();\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n if(this.menuElement) {\r\n this.menuElement.remove();\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport { AccountPassword, Authorization, InputPrivacyKey, Updates } from \"../../../layer\";\r\nimport appPrivacyManager, { PrivacyType } from \"../../../lib/appManagers/appPrivacyManager\";\r\nimport AppPrivacyPhoneNumberTab from \"./privacy/phoneNumber\";\r\nimport AppTwoStepVerificationTab from \"./2fa\";\r\nimport passwordManager from \"../../../lib/mtproto/passwordManager\";\r\nimport AppTwoStepVerificationEnterPasswordTab from \"./2fa/enterPassword\";\r\nimport AppTwoStepVerificationEmailConfirmationTab from \"./2fa/emailConfirmation\";\r\nimport AppPrivacyLastSeenTab from \"./privacy/lastSeen\";\r\nimport AppPrivacyProfilePhotoTab from \"./privacy/profilePhoto\";\r\nimport AppPrivacyForwardMessagesTab from \"./privacy/forwardMessages\";\r\nimport AppPrivacyAddToGroupsTab from \"./privacy/addToGroups\";\r\nimport AppPrivacyCallsTab from \"./privacy/calls\";\r\nimport AppActiveSessionsTab from \"./activeSessions\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport AppBlockedUsersTab from \"./blockedUsers\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { i18n, LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport appDraftsManager from \"../../../lib/appManagers/appDraftsManager\";\r\nimport Button from \"../../button\";\r\nimport toggleDisability from \"../../../helpers/dom/toggleDisability\";\r\n\r\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\r\n private activeSessionsRow: Row;\r\n private authorizations: Authorization.authorization[];\r\n\r\n protected init() {\r\n this.container.classList.add('dont-u-dare-block-me');\r\n this.setTitle('PrivacySettings');\r\n\r\n const SUBTITLE: LangPackKey = 'Loading';\r\n\r\n {\r\n const section = new SettingSection({noDelimiter: true});\r\n\r\n let blockedPeerIds: PeerId[];\r\n const blockedUsersRow = new Row({\r\n icon: 'deleteuser',\r\n titleLangKey: 'BlockedUsers',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppBlockedUsersTab(this.slider);\r\n tab.peerIds = blockedPeerIds;\r\n tab.open();\r\n }\r\n });\r\n blockedUsersRow.freezed = true;\r\n\r\n let passwordState: AccountPassword;\r\n const twoFactorRowOptions = {\r\n icon: 'lock',\r\n titleLangKey: 'TwoStepVerification' as LangPackKey,\r\n subtitleLangKey: SUBTITLE,\r\n clickable: (e: Event) => {\r\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\r\n if(passwordState.pFlags.has_password) {\r\n tab = new AppTwoStepVerificationEnterPasswordTab(this.slider);\r\n } else if(passwordState.email_unconfirmed_pattern) {\r\n tab = new AppTwoStepVerificationEmailConfirmationTab(this.slider);\r\n tab.email = passwordState.email_unconfirmed_pattern;\r\n tab.length = 6;\r\n tab.isFirst = true;\r\n passwordManager.resendPasswordEmail();\r\n } else {\r\n tab = new AppTwoStepVerificationTab(this.slider);\r\n }\r\n \r\n tab.state = passwordState;\r\n tab.open();\r\n }\r\n };\r\n \r\n const twoFactorRow = new Row(twoFactorRowOptions);\r\n twoFactorRow.freezed = true;\r\n\r\n const activeSessionsRow = this.activeSessionsRow = new Row({\r\n icon: 'activesessions',\r\n titleLangKey: 'SessionsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n const tab = new AppActiveSessionsTab(this.slider);\r\n tab.privacyTab = this;\r\n tab.authorizations = this.authorizations;\r\n tab.open();\r\n }\r\n });\r\n activeSessionsRow.freezed = true;\r\n\r\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n const setBlockedCount = (count: number) => {\r\n if(count) {\r\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\r\n } else {\r\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\r\n }\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('peer_block', () => {\r\n /* const {blocked, peerId} = update;\r\n if(!blocked) blockedPeerIds.findAndSplice(p => p === peerId);\r\n else blockedPeerIds.unshift(peerId);\r\n blockedCount += blocked ? 1 : -1;\r\n setBlockedCount(blockedCount); */\r\n updateBlocked();\r\n });\r\n\r\n const updateBlocked = () => {\r\n appUsersManager.getBlocked().then(res => {\r\n blockedUsersRow.freezed = false;\r\n setBlockedCount(res.count);\r\n blockedPeerIds = res.peerIds;\r\n });\r\n };\r\n\r\n updateBlocked();\r\n\r\n passwordManager.getState().then(state => {\r\n passwordState = state;\r\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\r\n twoFactorRow.freezed = false;\r\n \r\n //console.log('password state', state);\r\n });\r\n\r\n this.updateActiveSessions();\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'PrivacyTitle'});\r\n\r\n section.content.classList.add('privacy-navigation-container');\r\n\r\n const rowsByKeys: Partial<{\r\n [key in InputPrivacyKey['_']]: Row\r\n }> = {};\r\n\r\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\r\n titleLangKey: 'PrivacyPhoneTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyPhoneNumberTab(this.slider).open();\r\n }\r\n });\r\n\r\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\r\n titleLangKey: 'LastSeenTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyLastSeenTab(this.slider).open();\r\n }\r\n });\r\n\r\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\r\n titleLangKey: 'PrivacyProfilePhotoTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyProfilePhotoTab(this.slider).open();\r\n }\r\n });\r\n\r\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\r\n titleLangKey: 'WhoCanCallMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyCallsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\r\n titleLangKey: 'PrivacyForwardsTitle',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyForwardMessagesTab(this.slider).open();\r\n }\r\n });\r\n\r\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\r\n titleLangKey: 'WhoCanAddMe',\r\n subtitleLangKey: SUBTITLE,\r\n clickable: () => {\r\n new AppPrivacyAddToGroupsTab(this.slider).open();\r\n }\r\n });\r\n\r\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\r\n const row = rowsByKeys[key];\r\n if(!row) {\r\n return;\r\n }\r\n\r\n appPrivacyManager.getPrivacy(key).then(rules => {\r\n const details = appPrivacyManager.getPrivacyRulesDetails(rules);\r\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\r\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\r\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\r\n\r\n row.subtitle.innerHTML = '';\r\n const s = i18n(langKey);\r\n row.subtitle.append(s);\r\n if(disallowLength || allowLength) {\r\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\r\n }\r\n });\r\n };\r\n\r\n section.content.append(numberVisibilityRow.container, lastSeenTimeRow.container, photoVisibilityRow.container, callRow.container, linkAccountRow.container, groupChatsAddRow.container);\r\n this.scrollable.append(section.container);\r\n\r\n for(const key in rowsByKeys) {\r\n updatePrivacyRow(key as keyof typeof rowsByKeys);\r\n }\r\n\r\n rootScope.addEventListener('privacy_update', (update) => {\r\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\r\n });\r\n }\r\n\r\n const promises: Promise[] = [];\r\n {\r\n const section = new SettingSection({name: 'Privacy.SensitiveContent'});\r\n section.container.classList.add('hide');\r\n\r\n promises.push(apiManager.invokeApi('account.getContentSettings').then(settings => {\r\n if(!settings.pFlags.sensitive_can_change) {\r\n return;\r\n }\r\n \r\n const enabled = settings.pFlags.sensitive_enabled;\r\n\r\n const sensitiveRow = new Row({\r\n checkboxField: new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText', checked: enabled}),\r\n subtitleLangKey: 'PrivacyAndSecurity.SensitiveDesc',\r\n noCheckboxSubtitle: true\r\n });\r\n \r\n section.content.append(sensitiveRow.container);\r\n section.container.classList.remove('hide');\r\n \r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = sensitiveRow.checkboxField.checked;\r\n const isChanged = _enabled !== enabled;\r\n if(!isChanged) {\r\n return;\r\n }\r\n \r\n apiManager.invokeApi('account.setContentSettings', {\r\n sensitive_enabled: _enabled\r\n });\r\n }, {once: true});\r\n }));\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n {\r\n const section = new SettingSection({name: 'FilterChats'});\r\n\r\n const onDeleteClick = () => {\r\n const popup = new PopupPeer('popup-delete-drafts', {\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n const toggle = toggleDisability([deleteButton], true);\r\n appDraftsManager.clearAllDrafts().then(() => {\r\n toggle();\r\n });\r\n },\r\n isDanger: true,\r\n }], \r\n titleLangKey: 'AreYouSureClearDraftsTitle',\r\n descriptionLangKey: 'AreYouSureClearDrafts'\r\n });\r\n \r\n popup.show();\r\n };\r\n\r\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\r\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\r\n section.content.append(deleteButton);\r\n\r\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then(drafts => {\r\n const draftsRow = new Row({\r\n titleLangKey: 'PrivacyDeleteCloudDrafts',\r\n subtitleLangKey: 'Drafts',\r\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\r\n icon: 'delete',\r\n clickable: onDeleteClick\r\n });\r\n \r\n section.content.append(draftsRow.container);\r\n })); */\r\n\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n return Promise.all(promises);\r\n }\r\n\r\n public updateActiveSessions() {\r\n apiManager.invokeApi('account.getAuthorizations').then(auths => {\r\n this.activeSessionsRow.freezed = false;\r\n this.authorizations = auths.authorizations;\r\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\r\n //console.log('auths', auths);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type ColorHsla = {\r\n h: number,\r\n s: number,\r\n l: number,\r\n a: number\r\n};\r\n\r\nexport type ColorRgba = [number, number, number, number];\r\nexport type ColorRgb = [number, number, number];\r\n\r\n/**\r\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\r\n */\r\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\r\n r /= 255, g /= 255, b /= 255;\r\n const max = Math.max(r, g, b),\r\n min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if(max === min) {\r\n h = s = 0; // achromatic\r\n } else {\r\n let d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 360,\r\n s: s * 100,\r\n l: l * 100,\r\n a\r\n };\r\n}\r\n\r\n// * https://stackoverflow.com/a/9493060/6758968\r\n/**\r\n * Converts an HSL color value to RGB. Conversion formula\r\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\r\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\r\n * returns r, g, and b in the set [0, 255].\r\n *\r\n * @param {number} h The hue\r\n * @param {number} s The saturation\r\n * @param {number} l The lightness\r\n * @return {Array} The RGB representation\r\n */\r\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\r\n h /= 360, s /= 100, l /= 100;\r\n let r: number, g: number, b: number;\r\n\r\n if(s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\r\n if(t < 0) t += 1;\r\n if(t > 1) t -= 1;\r\n if(t < 1/6) return p + (q - p) * 6 * t;\r\n if(t < 1/2) return q;\r\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\r\n return p;\r\n }\r\n\r\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n const p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1/3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1/3);\r\n }\r\n\r\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\r\n}\r\n\r\nexport function hslaStringToRgba(hsla: string) {\r\n const splitted = hsla.slice(5, -1).split(', ');\r\n const alpha = +splitted.pop();\r\n const arr = splitted.map((val) => {\r\n if(val.endsWith('%')) {\r\n return +val.slice(0, -1);\r\n }\r\n \r\n return +val;\r\n });\r\n\r\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\r\n}\r\n\r\nexport function hexaToRgba(hexa: string) {\r\n const arr: ColorRgba = [] as any;\r\n const offset = 1;\r\n if(hexa.length === (3 + offset)) {\r\n for(let i = offset; i < hexa.length; ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n } else if(hexa.length === (4 + offset)) {\r\n for(let i = offset; i < (hexa.length - 1); ++i) {\r\n arr.push(parseInt(hexa[i] + hexa[i], 16));\r\n }\r\n\r\n arr.push(parseInt(hexa[hexa.length - 1], 16));\r\n } else {\r\n for(let i = offset; i < hexa.length; i += 2) {\r\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function hexToRgb(hex: string) {\r\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\r\n}\r\n\r\nexport function hexaToHsla(hexa: string) {\r\n const rgba = hexaToRgba(hexa);\r\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\r\n}\r\n\r\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\r\n return '#' + rgba.map(v => ('0' + v.toString(16)).slice(-2)).join('');\r\n}\r\n\r\nexport function hslaStringToHexa(hsla: string) {\r\n return rgbaToHexa(hslaStringToRgba(hsla));\r\n}\r\n\r\nexport function hslaStringToHex(hsla: string) {\r\n return hslaStringToHexa(hsla).slice(0, -2);\r\n}\r\n","import { rgbaToHsla } from \"./color\";\r\n\r\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\r\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\r\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\r\n if(s > 0) {\r\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\r\n }\r\n l = Math.max(0, l * .65);\r\n \r\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\r\n return hsla;\r\n}\r\n","import { ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla } from \"../helpers/color\";\r\nimport attachGrabListeners from \"../helpers/dom/attachGrabListeners\";\r\nimport { clamp } from \"../helpers/number\";\r\nimport InputField, { InputState } from \"./inputField\";\r\n\r\nexport type ColorPickerColor = { \r\n hsl: string; \r\n rgb: string; \r\n hex: string; \r\n hsla: string; \r\n rgba: string; \r\n hexa: string; \r\n rgbaArray: ColorRgba; \r\n};\r\n\r\nexport default class ColorPicker {\r\n private static BASE_CLASS = 'color-picker';\r\n public container: HTMLElement;\r\n\r\n private boxRect: DOMRect;\r\n //private boxDraggerRect: DOMRect;\r\n private hueRect: DOMRect;\r\n //private hueDraggerRect: DOMRect;\r\n\r\n\tprivate hue = 0;\r\n\tprivate saturation = 100;\r\n\tprivate lightness = 50;\r\n\tprivate alpha = 1;\r\n private elements: {\r\n box: SVGSVGElement,\r\n boxDragger: SVGSVGElement,\r\n sliders: HTMLElement,\r\n hue: SVGSVGElement,\r\n hueDragger: SVGSVGElement,\r\n saturation: SVGLinearGradientElement,\r\n } = {} as any;\r\n private hexInputField: InputField;\r\n private rgbInputField: InputField;\r\n public onChange: (color: ReturnType) => void;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add(ColorPicker.BASE_CLASS);\r\n\r\n const html = `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n\r\n this.container.innerHTML = html;\r\n\r\n this.elements.box = this.container.firstElementChild as any;\r\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\r\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\r\n\r\n this.elements.sliders = this.elements.box.nextElementSibling as any;\r\n\r\n this.elements.hue = this.elements.sliders.firstElementChild as any;\r\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\r\n\r\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\r\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\r\n\r\n const inputs = document.createElement('div');\r\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\r\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\r\n this.container.append(inputs);\r\n\r\n this.hexInputField.input.addEventListener('input', () => {\r\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\r\n\r\n const match = value.match(/([a-fA-F\\d]+)/);\r\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\r\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\r\n\r\n value = '#' + value;\r\n this.hexInputField.setValueSilently(value);\r\n \r\n if(valid) {\r\n this.setColor(value, false, true);\r\n }\r\n });\r\n\r\n // patched https://stackoverflow.com/a/34029238/6758968\r\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\r\n this.rgbInputField.input.addEventListener('input', () => {\r\n const match = this.rgbInputField.value.match(rgbRegExp);\r\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\r\n\r\n if(match) {\r\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\r\n }\r\n });\r\n\r\n this.attachBoxListeners();\r\n this.attachHueListeners();\r\n }\r\n\r\n private onGrabStart = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\r\n };\r\n\r\n private onGrabEnd = () => {\r\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\r\n };\r\n\r\n private attachBoxListeners() {\r\n attachGrabListeners(this.elements.box as any, () => {\r\n this.onGrabStart();\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n //this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.saturationHandler(pos.x, pos.y);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n private attachHueListeners() {\r\n attachGrabListeners(this.elements.hue as any, () => {\r\n this.onGrabStart();\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n //this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\r\n }, (pos) => {\r\n this.hueHandler(pos.x);\r\n }, () => {\r\n this.onGrabEnd();\r\n });\r\n }\r\n\r\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\r\n if(color === undefined) { // * set to red\r\n color = {\r\n h: 0,\r\n s: 100,\r\n l: 50,\r\n a: 1\r\n };\r\n } else if(typeof(color) === 'string') {\r\n if(color[0] === '#') {\r\n color = hexaToHsla(color);\r\n } else {\r\n const rgb = color.match(/[.?\\d]+/g);\r\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\r\n }\r\n }\r\n\r\n // Set box\r\n this.boxRect = this.elements.box.getBoundingClientRect();\r\n\r\n const boxX = this.boxRect.width / 100 * color.s;\r\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\r\n const boxY = this.boxRect.height / 100 * percentY;\r\n\r\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\r\n\r\n // Set hue\r\n this.hueRect = this.elements.hue.getBoundingClientRect();\r\n\r\n const percentHue = color.h / 360;\r\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\r\n\r\n this.hueHandler(hueX, false);\r\n\r\n // Set values\r\n this.hue = color.h;\r\n this.saturation = color.s;\r\n this.lightness = color.l;\r\n this.alpha = color.a;\r\n\r\n this.updatePicker(updateHexInput, updateRgbInput);\r\n };\r\n\r\n public getCurrentColor(): ColorPickerColor {\r\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\r\n const hexa = rgbaToHexa(rgbaArray);\r\n const hex = hexa.slice(0, -2);\r\n\r\n return {\r\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\r\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\r\n hex: hex,\r\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\r\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\r\n hexa: hexa,\r\n rgbaArray: rgbaArray\r\n };\r\n }\r\n\r\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\r\n const color = this.getCurrentColor();\r\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\r\n\r\n if(updateHexInput) {\r\n this.hexInputField.setValueSilently(color.hex);\r\n this.hexInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(updateRgbInput) {\r\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\r\n this.rgbInputField.setState(InputState.Neutral);\r\n }\r\n\r\n if(this.onChange) {\r\n this.onChange(color);\r\n }\r\n }\r\n\r\n private hueHandler(pageX: number, update = true) {\r\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\r\n\r\n const percents = eventX / this.hueRect.width;\r\n this.hue = Math.round(360 * percents);\r\n \r\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\r\n\r\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\r\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\r\n \r\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n }\r\n\r\n private saturationHandler(pageX: number, pageY: number, update = true) {\r\n const maxX = this.boxRect.width;\r\n const maxY = this.boxRect.height;\r\n\r\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\r\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\r\n\r\n const posX = eventX / maxX * 100;\r\n const posY = eventY / maxY * 100;\r\n \r\n const boxDragger = this.elements.boxDragger;\r\n boxDragger.setAttributeNS(null, 'x', posX + '%');\r\n boxDragger.setAttributeNS(null, 'y', posY + '%');\r\n\r\n const saturation = clamp(posX, 0, 100);\r\n\r\n const lightnessX = 100 - saturation / 2;\r\n const lightnessY = 100 - clamp(posY, 0, 100);\r\n\r\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\r\n\r\n this.saturation = saturation;\r\n this.lightness = lightness;\r\n\r\n if(update) {\r\n this.updatePicker();\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { hexaToRgba } from \"../../../helpers/color\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport throttle from \"../../../helpers/schedulers/throttle\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStateManager, { Theme } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport ColorPicker, { ColorPickerColor } from \"../../colorPicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppBackgroundColorTab extends SliderSuperTab {\r\n private colorPicker: ColorPicker;\r\n private grid: HTMLElement;\r\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\r\n private theme: Theme;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-color-container');\r\n this.setTitle('SetColor');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n const section = new SettingSection({});\r\n this.colorPicker = new ColorPicker();\r\n\r\n section.content.append(this.colorPicker.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const gridSection = new SettingSection({});\r\n\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n\r\n const colors = [\r\n '#E6EBEE',\r\n '#B2CEE1',\r\n '#008DD0',\r\n '#C6E7CB',\r\n '#C4E1A6',\r\n '#60B16E',\r\n '#CCD0AF',\r\n '#A6A997',\r\n '#7A7072',\r\n '#FDD7AF',\r\n '#FDB76E',\r\n '#DD8851'\r\n ];\r\n\r\n colors.forEach(color => {\r\n const item = document.createElement('div');\r\n item.classList.add('grid-item');\r\n item.dataset.color = color.toLowerCase();\r\n\r\n // * need for transform scale\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n media.style.backgroundColor = color;\r\n\r\n item.append(media);\r\n grid.append(item);\r\n });\r\n\r\n attachClickEvent(grid, (e) => {\r\n const target = findUpClassName(e.target, 'grid-item');\r\n if(!target || target.classList.contains('active')) {\r\n return;\r\n }\r\n\r\n const color = target.dataset.color;\r\n if(!color) {\r\n return;\r\n }\r\n\r\n this.applyColor(color);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n gridSection.content.append(grid);\r\n this.scrollable.append(gridSection.container);\r\n\r\n this.applyColor = throttle(this._applyColor, 16, true);\r\n }\r\n\r\n private setActive() {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'color' ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n }\r\n\r\n private _applyColor = (hex: string, updateColorPicker = true) => {\r\n if(updateColorPicker) {\r\n this.colorPicker.setColor(hex);\r\n } else {\r\n const rgba = hexaToRgba(hex);\r\n const background = this.theme.background;\r\n const hsla = highlightningColor(rgba);\r\n \r\n background.color = hex.toLowerCase();\r\n background.type = 'color';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n \r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.setActive();\r\n }\r\n };\r\n\r\n private onColorChange = (color: ColorPickerColor) => {\r\n this.applyColor(color.hex, false);\r\n };\r\n\r\n onOpen() {\r\n setTimeout(() => {\r\n const background = this.theme.background;\r\n\r\n // * set active if type is color\r\n if(background.type === 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n\r\n this.colorPicker.setColor(background.color || '#cccccc');\r\n \r\n if(background.type !== 'color') {\r\n this.colorPicker.onChange = this.onColorChange;\r\n }\r\n }, 0);\r\n }\r\n\r\n onCloseAfterTimeout() {\r\n this.colorPicker.onChange = undefined;\r\n this.colorPicker = undefined;\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport { averageColor } from \"../../../helpers/averageColor\";\r\nimport blur from \"../../../helpers/blur\";\r\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { requestFile } from \"../../../helpers/files\";\r\nimport highlightningColor from \"../../../helpers/highlightningColor\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport sequentialDom from \"../../../helpers/sequentialDom\";\r\nimport { AccountWallPapers, PhotoSize, WallPaper } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../../lib/appManagers/appDownloadManager\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appPhotosManager from \"../../../lib/appManagers/appPhotosManager\";\r\nimport appStateManager, { Theme, STATE_INIT } from \"../../../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport ProgressivePreloader from \"../../preloader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { wrapPhoto } from \"../../wrappers\";\r\nimport AppBackgroundColorTab from \"./backgroundColor\";\r\n\r\nlet uploadTempId = 0;\r\n\r\nexport default class AppBackgroundTab extends SliderSuperTab {\r\n private grid: HTMLElement;\r\n private tempId = 0;\r\n private theme: Theme;\r\n private clicked: Set = new Set();\r\n private blurCheckboxField: CheckboxField;\r\n\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('background-container', 'background-image-container');\r\n this.setTitle('ChatBackground');\r\n\r\n this.theme = rootScope.getTheme();\r\n\r\n {\r\n const container = generateSection(this.scrollable);\r\n\r\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\r\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\r\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\r\n\r\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(colorButton, () => {\r\n new AppBackgroundColorTab(this.slider).open();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\r\n\r\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\r\n text: 'ChatBackground.Blur', \r\n name: 'blur', \r\n checked: this.theme.background.blur,\r\n withRipple: true\r\n });\r\n\r\n this.listenerSetter.add(blurCheckboxField.input)('change', () => {\r\n this.theme.background.blur = blurCheckboxField.input.checked;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n const active = grid.querySelector('.active') as HTMLElement;\r\n if(!active) return;\r\n\r\n // * wait for animation end\r\n setTimeout(() => {\r\n this.setBackgroundDocument(active.dataset.slug, appDocsManager.getDoc(active.dataset.docId));\r\n }, 100);\r\n });\r\n\r\n container.append(uploadButton, colorButton, resetButton, blurCheckboxField.label);\r\n }\r\n\r\n rootScope.addEventListener('background_change', this.setActive);\r\n\r\n apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\r\n const wallpapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\r\n wallpapers.forEach((wallpaper) => {\r\n this.addWallPaper(wallpaper);\r\n });\r\n\r\n //console.log(accountWallpapers);\r\n });\r\n\r\n const gridContainer = generateSection(this.scrollable);\r\n const grid = this.grid = document.createElement('div');\r\n grid.classList.add('grid');\r\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\r\n gridContainer.append(grid);\r\n }\r\n\r\n private onUploadClick = () => {\r\n requestFile('image/x-png,image/png,image/jpeg').then(file => {\r\n const id = 'wallpaper-upload-' + ++uploadTempId;\r\n\r\n const thumb = {\r\n _: 'photoSize',\r\n h: 0,\r\n w: 0,\r\n location: {} as any,\r\n size: file.size,\r\n type: 'full',\r\n } as PhotoSize.photoSize;\r\n let document: MyDocument = {\r\n _: 'document',\r\n access_hash: '',\r\n attributes: [],\r\n dc_id: 0,\r\n file_reference: [],\r\n id,\r\n mime_type: file.type,\r\n size: file.size,\r\n date: Date.now() / 1000,\r\n pFlags: {},\r\n thumbs: [thumb],\r\n file_name: file.name\r\n };\r\n\r\n document = appDocsManager.saveDoc(document);\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(document);\r\n cacheContext.downloaded = file.size;\r\n cacheContext.url = URL.createObjectURL(file);\r\n\r\n let wallpaper: WallPaper.wallPaper = {\r\n _: 'wallPaper',\r\n access_hash: '',\r\n document: document,\r\n id,\r\n slug: id,\r\n pFlags: {}\r\n };\r\n\r\n const upload = appDownloadManager.upload(file, file.name);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = upload.addNotifyListener;\r\n deferred.cancel = upload.cancel;\r\n\r\n upload.then(inputFile => {\r\n apiManager.invokeApi('account.uploadWallPaper', {\r\n file: inputFile,\r\n mime_type: file.type,\r\n settings: {\r\n _: 'wallPaperSettings'\r\n }\r\n }).then(_wallpaper => {\r\n const newDoc = (_wallpaper as WallPaper.wallPaper).document as MyDocument;\r\n const newCacheContext = appDownloadManager.getCacheContext(newDoc);\r\n Object.assign(newCacheContext, cacheContext);\r\n\r\n wallpaper = _wallpaper as WallPaper.wallPaper;\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n \r\n this.setBackgroundDocument(wallpaper.slug, wallpaper.document).then(deferred.resolve, deferred.reject);\r\n }, deferred.reject);\r\n }, deferred.reject);\r\n\r\n deferred.then(() => {\r\n this.clicked.delete(wallpaper.document.id);\r\n }, (err) => {\r\n container.remove();\r\n //console.error('i saw the body drop', err);\r\n });\r\n\r\n const preloader = new ProgressivePreloader({\r\n isUpload: true,\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const container = this.addWallPaper(wallpaper, false);\r\n this.clicked.add(wallpaper.document.id);\r\n\r\n preloader.attach(container, false, deferred);\r\n });\r\n };\r\n\r\n private onResetClick = () => {\r\n const defaultTheme = STATE_INIT.settings.themes.find(t => t.name === this.theme.name);\r\n if(defaultTheme) {\r\n ++this.tempId;\r\n this.theme.background = copy(defaultTheme.background);\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n appImManager.applyCurrentTheme(undefined, undefined, true);\r\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\r\n }\r\n };\r\n\r\n private addWallPaper(wallpaper: WallPaper.wallPaper, append = true) {\r\n if(wallpaper.pFlags.pattern || \r\n !wallpaper.document || \r\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0) {\r\n return;\r\n }\r\n\r\n wallpaper.document = appDocsManager.saveDoc(wallpaper.document);\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('grid-item');\r\n\r\n const media = document.createElement('div');\r\n media.classList.add('grid-item-media');\r\n\r\n const wrapped = wrapPhoto({\r\n photo: wallpaper.document,\r\n message: null,\r\n container: media,\r\n withoutPreloader: true,\r\n size: appPhotosManager.choosePhotoSize(wallpaper.document, 200, 200)\r\n });\r\n\r\n container.dataset.docId = '' + wallpaper.document.id;\r\n container.dataset.slug = wallpaper.slug;\r\n\r\n if(this.theme.background.type === 'image' && this.theme.background.slug === wallpaper.slug) {\r\n container.classList.add('active');\r\n }\r\n\r\n (wrapped.loadPromises.thumb || wrapped.loadPromises.full).then(() => {\r\n sequentialDom.mutate(() => {\r\n container.append(media);\r\n });\r\n });\r\n\r\n this.grid[append ? 'append' : 'prepend'](container);\r\n\r\n return container;\r\n }\r\n\r\n private onGridClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\r\n if(!target) return;\r\n\r\n const {docId, slug} = target.dataset;\r\n if(this.clicked.has(docId)) return;\r\n this.clicked.add(docId);\r\n\r\n const preloader = new ProgressivePreloader({\r\n cancelable: true,\r\n tryAgainOnFail: false\r\n });\r\n\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const load = () => {\r\n const promise = this.setBackgroundDocument(slug, doc);\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(!cacheContext.url || this.theme.background.blur) {\r\n preloader.attach(target, true, promise);\r\n }\r\n };\r\n\r\n preloader.construct();\r\n\r\n attachClickEvent(target, (e) => {\r\n if(preloader.preloader.parentElement) {\r\n preloader.onClick(e);\r\n preloader.detach();\r\n } else {\r\n load();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n load();\r\n\r\n //console.log(doc);\r\n };\r\n\r\n private saveToCache = (slug: string, url: string) => {\r\n fetch(url).then(response => {\r\n appDownloadManager.cacheStorage.save('backgrounds/' + slug, response);\r\n });\r\n };\r\n\r\n private setBackgroundDocument = (slug: string, doc: MyDocument) => {\r\n let _tempId = ++this.tempId;\r\n const middleware = () => _tempId === this.tempId;\r\n\r\n const download = appDocsManager.downloadDoc(doc, appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0);\r\n\r\n const deferred = deferredPromise();\r\n deferred.addNotifyListener = download.addNotifyListener;\r\n deferred.cancel = download.cancel;\r\n\r\n download.then(() => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n const background = this.theme.background;\r\n const onReady = (url: string) => {\r\n //const perf = performance.now();\r\n averageColor(url).then(pixel => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n \r\n const hsla = highlightningColor(Array.from(pixel) as any);\r\n //console.log(doc, hsla, performance.now() - perf);\r\n\r\n background.slug = slug;\r\n background.type = 'image';\r\n background.highlightningColor = hsla;\r\n appStateManager.pushToState('settings', rootScope.settings);\r\n\r\n this.saveToCache(slug, url);\r\n appImManager.applyCurrentTheme(slug, url).then(deferred.resolve);\r\n });\r\n };\r\n\r\n const cacheContext = appDownloadManager.getCacheContext(doc);\r\n if(background.blur) {\r\n setTimeout(() => {\r\n blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\r\n });\r\n }, 200);\r\n } else {\r\n onReady(cacheContext.url);\r\n }\r\n });\r\n\r\n return deferred;\r\n };\r\n\r\n private setActive = () => {\r\n const active = this.grid.querySelector('.active');\r\n const background = this.theme.background;\r\n const target = background.type === 'image' ? this.grid.querySelector(`.grid-item[data-slug=\"${background.slug}\"]`) : null;\r\n if(active === target) {\r\n return;\r\n }\r\n\r\n if(active) {\r\n active.classList.remove('active');\r\n }\r\n\r\n if(target) {\r\n target.classList.add('active');\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport renderImageFromUrl from \"./dom/renderImageFromUrl\";\r\n\r\nexport const averageColor = (imageUrl: string): Promise => {\r\n const img = document.createElement('img');\r\n return new Promise((resolve) => {\r\n renderImageFromUrl(img, imageUrl, () => {\r\n const canvas = document.createElement('canvas');\r\n const ratio = img.naturalWidth / img.naturalHeight;\r\n const DIMENSIONS = 50;\r\n if(ratio === 1) {\r\n canvas.width = DIMENSIONS;\r\n canvas.height = canvas.width / ratio;\r\n } else if(ratio > 1) {\r\n canvas.height = DIMENSIONS;\r\n canvas.width = canvas.height / ratio;\r\n } else {\r\n canvas.width = canvas.height = DIMENSIONS;\r\n }\r\n \r\n const context = canvas.getContext('2d');\r\n context.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, canvas.width, canvas.height);\r\n\r\n const pixel = new Array(4).fill(0);\r\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\r\n for(let i = 0; i < pixels.length; i += 4) {\r\n pixel[0] += pixels[i];\r\n pixel[1] += pixels[i + 1];\r\n pixel[2] += pixels[i + 2];\r\n pixel[3] += pixels[i + 3];\r\n }\r\n\r\n const pixelsLength = pixels.length / 4;\r\n const outPixel = new Uint8ClampedArray(4);\r\n outPixel[0] = pixel[0] / pixelsLength;\r\n outPixel[1] = pixel[1] / pixelsLength;\r\n outPixel[2] = pixel[2] / pixelsLength;\r\n outPixel[3] = pixel[3] / pixelsLength;\r\n resolve(outPixel);\r\n });\r\n });\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement from \".\";\r\nimport appStickersManager, { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport { RichTextProcessor } from \"../../lib/richtextprocessor\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { wrapSticker } from \"../wrappers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport { putPreloader } from \"../misc\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appImManager from \"../../lib/appManagers/appImManager\";\r\nimport { StickerSet } from \"../../layer\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport Button from \"../button\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { toastNew } from \"../toast\";\r\n\r\nconst ANIMATION_GROUP = 'STICKERS-POPUP';\r\n\r\nexport default class PopupStickers extends PopupElement {\r\n private stickersFooter: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n private h6: HTMLElement;\r\n\r\n private set: StickerSet.stickerSet;\r\n\r\n constructor(private stickerSetInput: Parameters[0]) {\r\n super('popup-stickers', null, {closable: true, overlayClosable: true, body: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n this.h6.append(i18n('Loading'));\r\n\r\n this.header.append(this.h6);\r\n\r\n this.addEventListener('close', () => {\r\n animationIntersector.setOnlyOnePlayableGroup('');\r\n });\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('sticker-set-stickers', 'is-loading');\r\n\r\n attachClickEvent(this.stickersDiv, this.onStickersClick, {listenerSetter: this.listenerSetter});\r\n\r\n putPreloader(this.stickersDiv, true);\r\n\r\n this.stickersFooter = document.createElement('div');\r\n this.stickersFooter.classList.add('sticker-set-footer');\r\n\r\n div.append(this.stickersDiv);\r\n\r\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\r\n this.stickersFooter.append(btn);\r\n\r\n this.body.append(div);\r\n const scrollable = new Scrollable(this.body);\r\n this.body.append(this.stickersFooter);\r\n \r\n // const editButton = document.createElement('button');\r\n // editButton.classList.add('btn-primary');\r\n\r\n // this.stickersFooter.append(editButton);\r\n\r\n this.loadStickerSet();\r\n }\r\n\r\n private onStickersClick = (e: MouseEvent) => {\r\n const target = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n this.hide();\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n private loadStickerSet() {\r\n return appStickersManager.getStickerSet(this.stickerSetInput).then(set => {\r\n if(!set) {\r\n toastNew({langPackKey: 'StickerSet.DontExist'});\r\n this.hide();\r\n return;\r\n }\r\n //console.log('PopupStickers loadStickerSet got set:', set);\r\n\r\n this.set = set.set;\r\n\r\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\r\n\r\n this.h6.innerHTML = RichTextProcessor.wrapEmojiText(set.set.title);\r\n this.stickersFooter.classList.toggle('add', !set.set.installed_date);\r\n\r\n let button: HTMLElement;\r\n if(set.set.installed_date) {\r\n button = Button('btn-primary btn-primary-transparent danger', {noRipple: true});\r\n button.append(i18n('RemoveStickersCount', [i18n('Stickers', [set.set.count])]));\r\n } else {\r\n button = Button('btn-primary btn-color-primary', {noRipple: true});\r\n button.append(i18n('AddStickersCount', [i18n('Stickers', [set.set.count])]));\r\n }\r\n\r\n this.stickersFooter.textContent = '';\r\n this.stickersFooter.append(button);\r\n\r\n attachClickEvent(button, () => {\r\n const toggle = toggleDisability([button], true);\r\n\r\n appStickersManager.toggleStickerSet(this.set).then(() => {\r\n this.hide();\r\n }).catch(() => {\r\n toggle();\r\n });\r\n });\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n \r\n this.stickersDiv.classList.remove('is-loading');\r\n this.stickersDiv.innerHTML = '';\r\n for(let doc of set.documents) {\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n \r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set-sticker');\r\n\r\n const size = mediaSizes.active.esgSticker.width;\r\n \r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue, \r\n group: ANIMATION_GROUP, \r\n play: true,\r\n loop: true,\r\n width: size,\r\n height: size\r\n });\r\n\r\n this.stickersDiv.append(div);\r\n }\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from \"./eachTimeout\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from \"../environment/ctx\";\nimport noop from \"./noop\";\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { generateSection } from \"..\";\r\nimport RangeSelector from \"../../rangeSelector\";\r\nimport Button from \"../../button\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport RadioField from \"../../radioField\";\r\nimport appStateManager, { State } from \"../../../lib/appManagers/appStateManager\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { IS_APPLE } from \"../../../environment/userAgent\";\r\nimport Row from \"../../row\";\r\nimport AppBackgroundTab from \"./background\";\r\nimport { LangPackKey, _i18n } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport assumeType from \"../../../helpers/assumeType\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { wrapStickerSetThumb } from \"../../wrappers\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport eachMinute from \"../../../helpers/eachMinute\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport IS_GEOLOCATION_SUPPORTED from \"../../../environment/geolocationSupport\";\r\n\r\nexport class RangeSettingSelector {\r\n public container: HTMLDivElement;\r\n private range: RangeSelector;\r\n\r\n public onChange: (value: number) => void;\r\n\r\n constructor(name: LangPackKey, step: number, initialValue: number, minValue: number, maxValue: number) {\r\n const BASE_CLASS = 'range-setting-selector';\r\n this.container = document.createElement('div');\r\n this.container.classList.add(BASE_CLASS);\r\n\r\n const details = document.createElement('div');\r\n details.classList.add(BASE_CLASS + '-details');\r\n\r\n const nameDiv = document.createElement('div');\r\n nameDiv.classList.add(BASE_CLASS + '-name');\r\n _i18n(nameDiv, name);\r\n\r\n const valueDiv = document.createElement('div');\r\n valueDiv.classList.add(BASE_CLASS + '-value');\r\n valueDiv.innerHTML = '' + initialValue;\r\n\r\n details.append(nameDiv, valueDiv);\r\n\r\n this.range = new RangeSelector({\r\n step, \r\n min: minValue, \r\n max: maxValue\r\n }, initialValue);\r\n this.range.setListeners();\r\n this.range.setHandlers({\r\n onScrub: value => {\r\n if(this.onChange) {\r\n this.onChange(value);\r\n }\r\n\r\n //console.log('font size scrub:', value);\r\n valueDiv.innerText = '' + value;\r\n }\r\n });\r\n\r\n this.container.append(details, this.range.container);\r\n }\r\n}\r\n\r\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\r\n init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('general-settings-container');\r\n this.setTitle('General');\r\n\r\n const section = generateSection.bind(null, this.scrollable);\r\n\r\n {\r\n const container = section('Settings');\r\n \r\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\r\n range.onChange = (value) => {\r\n appStateManager.setByKey('settings.messagesTextSize', value);\r\n };\r\n\r\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\r\n\r\n attachClickEvent(chatBackgroundButton, () => {\r\n new AppBackgroundTab(this.slider).open();\r\n });\r\n\r\n const animationsCheckboxField = new CheckboxField({\r\n text: 'EnableAnimations', \r\n name: 'animations', \r\n stateKey: 'settings.animationsEnabled',\r\n withRipple: true\r\n });\r\n \r\n container.append(range.container, chatBackgroundButton, animationsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.Keyboard');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'send-shortcut';\r\n const stateKey = 'settings.sendShortcut';\r\n\r\n const enterRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'General.SendShortcut.Enter', \r\n name, \r\n value: 'enter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\r\n });\r\n\r\n const ctrlEnterRow = new Row({\r\n radioField: new RadioField({\r\n name,\r\n value: 'ctrlEnter', \r\n stateKey\r\n }),\r\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\r\n });\r\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\r\n \r\n form.append(enterRow.container, ctrlEnterRow.container);\r\n container.append(form);\r\n }\r\n\r\n if(IS_GEOLOCATION_SUPPORTED) {\r\n const container = section('DistanceUnitsTitle');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'distance-unit';\r\n const stateKey = 'settings.distanceUnit';\r\n\r\n const kilometersRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsKilometers', \r\n name, \r\n value: 'kilometers', \r\n stateKey\r\n })\r\n });\r\n\r\n const milesRow = new Row({\r\n radioField: new RadioField({\r\n langKey: 'DistanceUnitsMiles',\r\n name,\r\n value: 'miles', \r\n stateKey\r\n })\r\n });\r\n \r\n form.append(kilometersRow.container, milesRow.container);\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('General.TimeFormat');\r\n\r\n const form = document.createElement('form');\r\n\r\n const name = 'time-format';\r\n const stateKey = 'settings.timeFormat';\r\n\r\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\r\n ['h12', 'General.TimeFormat.h12'], \r\n ['h23', 'General.TimeFormat.h23']\r\n ];\r\n\r\n const rows = formats.map(([format, langPackKey]) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n langKey: langPackKey, \r\n name, \r\n value: format, \r\n stateKey\r\n })\r\n });\r\n\r\n return row;\r\n });\r\n\r\n const cancel = eachMinute(() => {\r\n const date = new Date();\r\n\r\n formats.forEach(([format], idx) => {\r\n const str = date.toLocaleTimeString(\"en-us-u-hc-\" + format, {\r\n hour: '2-digit', \r\n minute: '2-digit'\r\n });\r\n\r\n rows[idx].subtitle.textContent = str;\r\n });\r\n });\r\n\r\n this.eventListener.addEventListener('destroy', cancel);\r\n\r\n form.append(...rows.map(row => row.container));\r\n container.append(form);\r\n }\r\n\r\n {\r\n const container = section('AutoDownloadMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const contactsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadContacts', \r\n name: 'contacts',\r\n stateKey: 'settings.autoDownload.contacts',\r\n withRipple: true\r\n });\r\n const privateCheckboxField = new CheckboxField({\r\n text: 'AutodownloadPrivateChats', \r\n name: 'private',\r\n stateKey: 'settings.autoDownload.private',\r\n withRipple: true\r\n });\r\n const groupsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadGroupChats', \r\n name: 'groups',\r\n stateKey: 'settings.autoDownload.groups',\r\n withRipple: true\r\n });\r\n const channelsCheckboxField = new CheckboxField({\r\n text: 'AutodownloadChannels', \r\n name: 'channels',\r\n stateKey: 'settings.autoDownload.channels',\r\n withRipple: true\r\n });\r\n\r\n container.append(contactsCheckboxField.label, privateCheckboxField.label, groupsCheckboxField.label, channelsCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('General.AutoplayMedia');\r\n //container.classList.add('sidebar-left-section-disabled');\r\n\r\n const gifsCheckboxField = new CheckboxField({\r\n text: 'AutoplayGIF', \r\n name: 'gifs', \r\n stateKey: 'settings.autoPlay.gifs',\r\n withRipple: true\r\n });\r\n const videosCheckboxField = new CheckboxField({\r\n text: 'AutoplayVideo', \r\n name: 'videos', \r\n stateKey: 'settings.autoPlay.videos',\r\n withRipple: true\r\n });\r\n\r\n container.append(gifsCheckboxField.label, videosCheckboxField.label);\r\n }\r\n\r\n {\r\n const container = section('Emoji');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.EmojiPrediction', \r\n name: 'suggest-emoji', \r\n stateKey: 'settings.emoji.suggest',\r\n withRipple: true\r\n });\r\n const bigCheckboxField = new CheckboxField({\r\n text: 'GeneralSettings.BigEmoji', \r\n name: 'emoji-big', \r\n stateKey: 'settings.emoji.big',\r\n withRipple: true\r\n });\r\n\r\n container.append(suggestCheckboxField.label, bigCheckboxField.label);\r\n }\r\n \r\n {\r\n const container = section('Telegram.InstalledStickerPacksController');\r\n\r\n const suggestCheckboxField = new CheckboxField({\r\n text: 'Stickers.SuggestStickers', \r\n name: 'suggest', \r\n stateKey: 'settings.stickers.suggest',\r\n withRipple: true\r\n });\r\n const loopCheckboxField = new CheckboxField({\r\n text: 'InstalledStickers.LoopAnimated', \r\n name: 'loop', \r\n stateKey: 'settings.stickers.loop',\r\n withRipple: true\r\n });\r\n\r\n const stickerSets: {[id: string]: Row} = {};\r\n\r\n const lazyLoadQueue = new LazyLoadQueue();\r\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\r\n const row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(stickerSet.title),\r\n subtitleLangKey: 'Stickers',\r\n subtitleLangArgs: [stickerSet.count],\r\n havePadding: true,\r\n clickable: () => {\r\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\r\n }\r\n });\r\n\r\n stickerSets[stickerSet.id] = row;\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('row-media');\r\n\r\n wrapStickerSetThumb({\r\n set: stickerSet,\r\n container: div,\r\n group: 'GENERAL-SETTINGS',\r\n lazyLoadQueue,\r\n width: 48,\r\n height: 48,\r\n autoplay: true\r\n });\r\n\r\n row.container.append(div);\r\n\r\n container[method](row.container);\r\n };\r\n\r\n appStickersManager.getAllStickers().then(allStickers => {\r\n assumeType(allStickers);\r\n for(const stickerSet of allStickers.sets) {\r\n renderStickerSet(stickerSet);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!stickerSets[set.id]) {\r\n renderStickerSet(set, 'prepend');\r\n }\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(stickerSets[set.id]) {\r\n stickerSets[set.id].container.remove();\r\n delete stickerSets[set.id];\r\n }\r\n });\r\n\r\n container.append(suggestCheckboxField.label, loopCheckboxField.label);\r\n }\r\n }\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport EditPeer from \"../../editPeer\";\r\nimport { UsernameInputField } from \"../../usernameInputField\";\r\nimport { i18n, i18n_ } from \"../../../lib/langPack\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { generateSection, SettingSection } from \"..\";\r\n\r\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\r\n\r\nexport default class AppEditProfileTab extends SliderSuperTab {\r\n private firstNameInputField: InputField;\r\n private lastNameInputField: InputField;\r\n private bioInputField: InputField;\r\n private usernameInputField: InputField;\r\n \r\n private profileUrlContainer: HTMLDivElement;\r\n private profileUrlAnchor: HTMLAnchorElement;\r\n\r\n private editPeer: EditPeer;\r\n\r\n protected async init() {\r\n this.container.classList.add('edit-profile-container');\r\n this.setTitle('EditAccount.Title');\r\n\r\n const inputFields: InputField[] = [];\r\n\r\n {\r\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.firstNameInputField = new InputField({\r\n label: 'EditProfile.FirstNameLabel',\r\n name: 'first-name',\r\n maxLength: 70\r\n });\r\n this.lastNameInputField = new InputField({\r\n label: 'Login.Register.LastName.Placeholder',\r\n name: 'last-name',\r\n maxLength: 64\r\n });\r\n this.bioInputField = new InputField({\r\n label: 'EditProfile.BioLabel',\r\n name: 'bio',\r\n maxLength: 70\r\n });\r\n \r\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'Bio.Description'});\r\n\r\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\r\n\r\n this.editPeer = new EditPeer({\r\n peerId: rootScope.myId,\r\n inputFields,\r\n listenerSetter: this.listenerSetter\r\n });\r\n\r\n this.content.append(this.editPeer.nextBtn);\r\n\r\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\r\n }\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'EditAccount.Username',\r\n caption: true\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.usernameInputField = new UsernameInputField({\r\n label: 'EditProfile.Username.Label',\r\n name: 'username',\r\n plainText: true,\r\n listenerSetter: this.listenerSetter,\r\n onChange: () => {\r\n this.editPeer.handleChange();\r\n this.setProfileUrl();\r\n },\r\n availableText: 'EditProfile.Username.Available',\r\n takenText: 'EditProfile.Username.Taken',\r\n invalidText: 'EditProfile.Username.Invalid'\r\n });\r\n\r\n inputWrapper.append(this.usernameInputField.container);\r\n\r\n const caption = section.caption;\r\n caption.append(i18n('UsernameSettings.ChangeDescription'));\r\n caption.append(document.createElement('br'), document.createElement('br'));\r\n\r\n const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\r\n profileUrlContainer.classList.add('profile-url-container');\r\n \r\n const profileUrlAnchor = this.profileUrlAnchor = document.createElement('a');\r\n profileUrlAnchor.classList.add('profile-url');\r\n profileUrlAnchor.href = '#';\r\n profileUrlAnchor.target = '_blank';\r\n\r\n profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\r\n\r\n caption.append(profileUrlContainer);\r\n\r\n inputFields.push(this.usernameInputField);\r\n section.content.append(inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n attachClickEvent(this.editPeer.nextBtn, () => {\r\n this.editPeer.nextBtn.disabled = true;\r\n\r\n let promises: Promise[] = [];\r\n \r\n promises.push(appProfileManager.updateProfile(this.firstNameInputField.value, this.lastNameInputField.value, this.bioInputField.value).then(() => {\r\n this.close();\r\n }, (err) => {\r\n console.error('updateProfile error:', err);\r\n }));\r\n\r\n if(this.editPeer.uploadAvatar) {\r\n promises.push(this.editPeer.uploadAvatar().then(inputFile => {\r\n return appProfileManager.uploadProfilePhoto(inputFile);\r\n }));\r\n }\r\n\r\n if(this.usernameInputField.isValidToChange()) {\r\n promises.push(appUsersManager.updateUsername(this.usernameInputField.value));\r\n }\r\n\r\n Promise.race(promises).finally(() => {\r\n this.editPeer.nextBtn.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const user = appUsersManager.getSelf();\r\n\r\n const userFull = await appProfileManager.getProfile(user.id, true);\r\n\r\n this.firstNameInputField.setOriginalValue(user.first_name, true);\r\n this.lastNameInputField.setOriginalValue(user.last_name, true);\r\n this.bioInputField.setOriginalValue(userFull.about, true);\r\n this.usernameInputField.setOriginalValue(user.username, true);\r\n\r\n this.setProfileUrl();\r\n this.editPeer.handleChange();\r\n }\r\n\r\n private setProfileUrl() {\r\n if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\r\n this.profileUrlContainer.style.display = 'none';\r\n } else {\r\n this.profileUrlContainer.style.display = '';\r\n let url = 'https://t.me/' + this.usernameInputField.value;\r\n this.profileUrlAnchor.innerText = url;\r\n this.profileUrlAnchor.href = url;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AppSelectPeers from \"../../appSelectPeers\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport Button from \"../../button\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport I18n, { i18n, LangPackKey, _i18n, join } from \"../../../lib/langPack\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport { SettingSection } from \"..\";\r\nimport { toast } from \"../../toast\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\n\r\nexport default class AppIncludedChatsTab extends SliderSuperTab {\r\n private editFolderTab: AppEditFolderTab;\r\n private confirmBtn: HTMLElement;\r\n\r\n private selector: AppSelectPeers;\r\n private type: 'included' | 'excluded';\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private dialogsByFilters: Map>;\r\n\r\n protected init() {\r\n this.content.remove();\r\n this.container.classList.add('included-chatlist-container');\r\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\r\n this.confirmBtn.style.display = 'none';\r\n\r\n this.header.append(this.confirmBtn);\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n const selected = this.selector.getSelected();\r\n\r\n //this.filter.pFlags = {};\r\n\r\n if(this.type === 'included') {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') === 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n } else {\r\n for(const key in this.filter.pFlags) {\r\n if(key.indexOf('exclude_') !== 0) {\r\n continue;\r\n }\r\n\r\n // @ts-ignore\r\n delete this.filter.pFlags[key];\r\n }\r\n }\r\n\r\n const peerIds: PeerId[] = [];\r\n for(const key of selected) {\r\n if(key.isPeerId()) {\r\n peerIds.push(key.toPeerId());\r\n } else {\r\n // @ts-ignore\r\n this.filter.pFlags[key] = true;\r\n }\r\n }\r\n\r\n let cmp: (peerId: PeerId) => boolean;\r\n if(this.type === 'included') {\r\n cmp = (peerId) => peerIds.includes(peerId);\r\n } else {\r\n cmp = (peerId) => !peerIds.includes(peerId);\r\n }\r\n\r\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\r\n if(!cmp(peerId)) {\r\n this.filter.pinnedPeerIds.splice(idx, 1);\r\n this.filter.pinned_peers.splice(idx, 1);\r\n }\r\n });\r\n\r\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\r\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\r\n forEachReverse(this.filter[other], (peerId, idx) => {\r\n if(peerIds.includes(peerId)) {\r\n this.filter[other].splice(idx, 1);\r\n this.filter[otherLegacy].splice(idx, 1);\r\n }\r\n });\r\n \r\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\r\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = peerIds.map(peerId => appPeersManager.getInputPeerById(peerId));\r\n //this.filter.pinned_peers = this.filter.pinned_peers.filter(peerId => this.filter.include_peers.includes(peerId));\r\n\r\n this.editFolderTab.setFilter(this.filter, false);\r\n this.close();\r\n });\r\n\r\n this.dialogsByFilters = new Map();\r\n return appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.dialogsByFilters.set(filter, new Set(appMessagesManager.dialogsStorage.getFolderDialogs(filter.id).map(d => d.peerId)));\r\n }\r\n });\r\n }\r\n\r\n checkbox(selected?: boolean) {\r\n const checkboxField = new CheckboxField({\r\n round: true\r\n });\r\n if(selected) {\r\n checkboxField.input.checked = selected;\r\n }\r\n\r\n return checkboxField.label;\r\n }\r\n\r\n renderResults = async(peerIds: PeerId[]) => {\r\n //const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\r\n\r\n await appUsersManager.getContacts();\r\n peerIds.forEach(peerId => {\r\n //if(other.includes(peerId)) return;\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: this.selector.scrollable,\r\n drawStatus: false,\r\n rippleEnabled: true,\r\n avatarSize: 46\r\n });\r\n\r\n const selected = this.selector.selected.has(peerId);\r\n dom.containerEl.append(this.checkbox(selected));\r\n //if(selected) dom.listEl.classList.add('active');\r\n\r\n const foundInFilters: HTMLElement[] = [];\r\n this.dialogsByFilters.forEach((dialogs, filter) => {\r\n if(dialogs.has(peerId)) {\r\n const span = document.createElement('span');\r\n span.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\r\n foundInFilters.push(span);\r\n }\r\n });\r\n\r\n const joined = join(foundInFilters, false);\r\n joined.forEach(el => {\r\n dom.lastMessageSpan.append(el);\r\n });\r\n });\r\n };\r\n\r\n onOpen() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\r\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\r\n\r\n const filter = this.filter;\r\n\r\n const categoriesSection = new SettingSection({\r\n noDelimiter: true,\r\n name: 'FilterChatTypes'\r\n });\r\n\r\n categoriesSection.container.classList.add('folder-categories');\r\n\r\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\r\n if(this.type === 'excluded') {\r\n details = {\r\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\r\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\r\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\r\n };\r\n } else {\r\n details = {\r\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\r\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\r\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\r\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\r\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\r\n };\r\n }\r\n\r\n const f = document.createDocumentFragment();\r\n for(const key in details) {\r\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\r\n button.dataset.peerId = key;\r\n button.append(this.checkbox());\r\n f.append(button);\r\n }\r\n categoriesSection.content.append(f);\r\n\r\n /////////////////\r\n\r\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\r\n\r\n this.selector = new AppSelectPeers({\r\n appendTo: this.container, \r\n onChange: this.onSelectChange, \r\n peerType: ['dialogs'], \r\n renderResultsFunc: this.renderResults,\r\n placeholder: 'Search',\r\n sectionNameLangPackKey: 'FilterChats'\r\n });\r\n this.selector.selected = new Set(selectedPeers);\r\n\r\n let addedInitial = false;\r\n const _add = this.selector.add.bind(this.selector);\r\n this.selector.add = (peerId, title, scroll) => {\r\n if(this.selector.selected.size >= 100 && addedInitial && !details[peerId]) {\r\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\r\n if(el) {\r\n setTimeout(() => {\r\n el.checked = false;\r\n }, 0);\r\n }\r\n\r\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\r\n toast(str);\r\n return;\r\n }\r\n\r\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\r\n if(details[peerId]) {\r\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\r\n }\r\n return div;\r\n };\r\n\r\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\r\n\r\n this.selector.addInitial(selectedPeers);\r\n addedInitial = true;\r\n\r\n for(const flag in filter.pFlags) {\r\n // @ts-ignore\r\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\r\n (categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement).click();\r\n }\r\n }\r\n }\r\n\r\n onSelectChange = (length: number) => {\r\n //const changed = !deepEqual(this.filter, this.originalFilter);\r\n if(this.type === 'included') {\r\n this.confirmBtn.style.display = length ? '' : 'none';\r\n }\r\n };\r\n\r\n onCloseAfterTimeout() {\r\n if(this.selector) {\r\n this.selector.container.remove();\r\n this.selector = null;\r\n }\r\n\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n /**\r\n * Do not ignore arguments!\r\n */\r\n public open(filter?: DialogFilter, type?: 'included' | 'excluded', editFolderTab?: AppIncludedChatsTab['editFolderTab']) {\r\n this.originalFilter = filter;\r\n this.filter = copy(this.originalFilter);\r\n this.type = type;\r\n this.editFolderTab = editFolderTab;\r\n \r\n return super.open();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { deepEqual, copy } from \"../../../helpers/object\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { MyDialogFilter as DialogFilter } from \"../../../lib/storages/filters\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport { toast } from \"../../toast\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport InputField from \"../../inputField\";\r\nimport RichTextProcessor from \"../../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport Button from \"../../button\";\r\nimport AppIncludedChatsTab from \"./includedChats\";\r\nimport { i18n, i18n_, LangPackKey } from \"../../../lib/langPack\";\r\nimport { SettingSection } from \"..\";\r\nimport PopupPeer from \"../../popups/peer\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nconst MAX_FOLDER_NAME_LENGTH = 12;\r\n\r\nexport default class AppEditFolderTab extends SliderSuperTab {\r\n private caption: HTMLElement;\r\n private stickerContainer: HTMLElement;\r\n\r\n private confirmBtn: HTMLElement;\r\n private menuBtn: HTMLElement;\r\n private nameInputField: InputField;\r\n\r\n private includePeerIds: SettingSection;\r\n private excludePeerIds: SettingSection;\r\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\r\n\r\n private animation: RLottiePlayer;\r\n private filter: DialogFilter;\r\n private originalFilter: DialogFilter;\r\n\r\n private type: 'edit' | 'create';\r\n private loadAnimationPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.classList.add('edit-folder-container');\r\n this.caption = document.createElement('div');\r\n this.caption.classList.add('caption');\r\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n\r\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\r\n const deleteFolderButton: ButtonMenuItemOptions = {\r\n icon: 'delete danger',\r\n text: 'FilterMenuDelete',\r\n onClick: () => {\r\n new PopupPeer('filter-delete', {\r\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\r\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\r\n buttons: [{\r\n langKey: 'Delete',\r\n callback: () => {\r\n deleteFolderButton.element.setAttribute('disabled', 'true');\r\n appMessagesManager.filtersStorage.updateDialogFilter(this.filter, true).then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).finally(() => {\r\n deleteFolderButton.element.removeAttribute('disabled');\r\n });\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n };\r\n this.menuBtn = ButtonMenuToggle({}, 'bottom-left', [deleteFolderButton]);\r\n this.menuBtn.classList.add('hide');\r\n\r\n this.header.append(this.confirmBtn, this.menuBtn);\r\n\r\n const inputSection = new SettingSection({});\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n \r\n this.nameInputField = new InputField({\r\n label: 'FilterNameHint',\r\n maxLength: MAX_FOLDER_NAME_LENGTH\r\n });\r\n\r\n inputWrapper.append(this.nameInputField.container);\r\n inputSection.content.append(inputWrapper);\r\n\r\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\r\n const section = new SettingSection({\r\n name: h2Text,\r\n noDelimiter: true\r\n });\r\n\r\n section.container.classList.add('folder-list', className);\r\n\r\n const categories = section.generateContentElement();\r\n categories.classList.add('folder-categories');\r\n\r\n buttons.forEach(o => {\r\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\r\n icon: o.icon,\r\n text: o.text,\r\n noRipple: o.withRipple ? undefined : true\r\n });\r\n\r\n if(o.name) {\r\n to[o.name] = button;\r\n }\r\n\r\n categories.append(button);\r\n });\r\n\r\n return section;\r\n };\r\n\r\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\r\n icon: 'add primary',\r\n text: 'ChatList.Filter.Include.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.Contacts',\r\n icon: 'newprivate',\r\n name: 'contacts'\r\n }, {\r\n text: 'ChatList.Filter.NonContacts',\r\n icon: 'noncontacts',\r\n name: 'non_contacts'\r\n }, {\r\n text: 'ChatList.Filter.Groups',\r\n icon: 'group',\r\n name: 'groups'\r\n }, {\r\n text: 'ChatList.Filter.Channels',\r\n icon: 'channel',\r\n name: 'broadcasts'\r\n }, {\r\n text: 'ChatList.Filter.Bots',\r\n icon: 'bots',\r\n name: 'bots'\r\n }], this.flags);\r\n\r\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\r\n icon: 'minus primary',\r\n text: 'ChatList.Filter.Exclude.AddChat',\r\n withRipple: true\r\n }, {\r\n text: 'ChatList.Filter.MutedChats',\r\n icon: 'mute',\r\n name: 'exclude_muted'\r\n }, {\r\n text: 'ChatList.Filter.Archive',\r\n icon: 'archive',\r\n name: 'exclude_archived'\r\n }, {\r\n text: 'ChatList.Filter.ReadChats',\r\n icon: 'readchats',\r\n name: 'exclude_read'\r\n }], this.flags);\r\n\r\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\r\n\r\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\r\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\r\n\r\n includedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'included', this);\r\n });\r\n\r\n excludedFlagsContainer.querySelector('.btn').addEventListener('click', () => {\r\n new AppIncludedChatsTab(this.slider).open(this.filter, 'excluded', this);\r\n });\r\n\r\n this.confirmBtn.addEventListener('click', () => {\r\n if(this.nameInputField.input.classList.contains('error')) {\r\n return;\r\n }\r\n\r\n if(!this.nameInputField.value.trim()) {\r\n this.nameInputField.input.classList.add('error');\r\n return;\r\n }\r\n\r\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\r\n include += this.filter.include_peers.length;\r\n \r\n if(!include) {\r\n toast('Please choose at least one chat for this folder.');\r\n return;\r\n }\r\n\r\n this.confirmBtn.setAttribute('disabled', 'true');\r\n\r\n let promise: Promise;\r\n if(!this.filter.id) {\r\n promise = appMessagesManager.filtersStorage.createDialogFilter(this.filter);\r\n } else {\r\n promise = appMessagesManager.filtersStorage.updateDialogFilter(this.filter);\r\n }\r\n\r\n promise.then(bool => {\r\n if(bool) {\r\n this.close();\r\n }\r\n }).catch(err => {\r\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n console.error('updateDialogFilter error:', err);\r\n }\r\n }).finally(() => {\r\n this.confirmBtn.removeAttribute('disabled');\r\n });\r\n });\r\n \r\n this.nameInputField.input.addEventListener('input', () => {\r\n this.filter.title = this.nameInputField.value;\r\n this.editCheckForChange();\r\n });\r\n\r\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\r\n appMessagesManager.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\r\n ] : [];\r\n\r\n return Promise.all([\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_2').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n }),\r\n\r\n ...reloadMissingPromises\r\n ]);\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private onCreateOpen() {\r\n // this.caption.style.display = '';\r\n this.setTitle('FilterNew');\r\n this.menuBtn.classList.add('hide');\r\n this.confirmBtn.classList.remove('hide');\r\n this.nameInputField.value = '';\r\n\r\n for(const flag in this.flags) {\r\n // @ts-ignore\r\n this.flags[flag].style.display = 'none';\r\n }\r\n }\r\n\r\n private onEditOpen() {\r\n // this.caption.style.display = 'none';\r\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\r\n\r\n if(this.type === 'edit') {\r\n this.menuBtn.classList.remove('hide');\r\n this.confirmBtn.classList.add('hide');\r\n }\r\n \r\n const filter = this.filter;\r\n this.nameInputField.value = RichTextProcessor.wrapDraftText(filter.title);\r\n\r\n for(const flag in this.flags) {\r\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\r\n }\r\n\r\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(key => {\r\n const section = this[key];\r\n const ul = appDialogsManager.createChatList();\r\n\r\n const peers = filter[key].slice();\r\n\r\n const renderMore = (_length: number) => {\r\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\r\n const peerId = peers.shift();\r\n\r\n const {dom} = appDialogsManager.addDialogNew({\r\n dialog: peerId,\r\n container: ul,\r\n drawStatus: false,\r\n rippleEnabled: false,\r\n meAsSaved: true,\r\n avatarSize: 32\r\n });\r\n dom.lastMessageSpan.parentElement.remove();\r\n }\r\n\r\n if(peers.length) {\r\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\r\n } else if(showMore) {\r\n showMore.remove();\r\n }\r\n };\r\n \r\n section.generateContentElement().append(ul);\r\n\r\n let showMore: HTMLElement;\r\n if(peers.length) {\r\n const content = section.generateContentElement();\r\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\r\n showMore.classList.add('load-more', 'rp-overflow');\r\n showMore.addEventListener('click', () => renderMore(20));\r\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\r\n\r\n content.append(showMore);\r\n }\r\n\r\n renderMore(4);\r\n });\r\n }\r\n\r\n editCheckForChange() {\r\n if(this.type === 'edit') {\r\n const changed = !deepEqual(this.originalFilter, this.filter);\r\n this.confirmBtn.classList.toggle('hide', !changed);\r\n this.menuBtn.classList.toggle('hide', changed);\r\n }\r\n };\r\n\r\n setFilter(filter: DialogFilter, firstTime: boolean) {\r\n if(this.container) {\r\n // cleanup\r\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach(el => el.remove());\r\n }\r\n\r\n if(firstTime) {\r\n this.originalFilter = filter;\r\n this.filter = copy(filter);\r\n } else {\r\n this.filter = filter;\r\n this.onEditOpen();\r\n this.editCheckForChange();\r\n }\r\n }\r\n\r\n public open(filter?: DialogFilter) {\r\n if(filter === undefined) {\r\n this.setFilter({\r\n _: 'dialogFilter',\r\n id: 0,\r\n title: '',\r\n pFlags: {},\r\n pinned_peers: [],\r\n include_peers: [],\r\n exclude_peers: [],\r\n pinnedPeerIds: [],\r\n includePeerIds: [],\r\n excludePeerIds: []\r\n }, true);\r\n this.type = 'create';\r\n } else {\r\n this.setFilter(filter, true);\r\n this.type = 'edit';\r\n }\r\n\r\n return super.open().then(() => {\r\n if(this.type === 'edit') this.onEditOpen();\r\n else this.onCreateOpen();\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport lottieLoader, { LottieLoader } from \"../../../lib/rlottie/lottieLoader\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { toast } from \"../../toast\";\r\nimport type { MyDialogFilter } from \"../../../lib/storages/filters\";\r\nimport type { DialogFilterSuggested, DialogFilter } from \"../../../layer\";\r\nimport type _rootScope from \"../../../lib/rootScope\";\r\nimport Button from \"../../button\";\r\nimport appMessagesManager from \"../../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport AppEditFolderTab from \"./editFolder\";\r\nimport Row from \"../../row\";\r\nimport { SettingSection } from \"..\";\r\nimport { i18n, i18n_, LangPackKey, join } from \"../../../lib/langPack\";\r\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport positionElementByIndex from \"../../../helpers/dom/positionElementByIndex\";\r\nimport RLottiePlayer from \"../../../lib/rlottie/rlottiePlayer\";\r\n\r\nexport default class AppChatFoldersTab extends SliderSuperTab {\r\n private createFolderBtn: HTMLElement;\r\n private foldersSection: SettingSection;\r\n private suggestedSection: SettingSection;\r\n private stickerContainer: HTMLElement;\r\n private animation: RLottiePlayer;\r\n\r\n private filtersRendered: {[filterId: number]: Row} = {};\r\n private loadAnimationPromise: ReturnType;\r\n\r\n private renderFolder(dialogFilter: DialogFilterSuggested | DialogFilter | MyDialogFilter, container?: HTMLElement, row?: Row) {\r\n let filter: DialogFilter | MyDialogFilter;\r\n let description = '';\r\n let d: HTMLElement[] = [];\r\n if(dialogFilter._ === 'dialogFilterSuggested') {\r\n filter = dialogFilter.filter;\r\n description = dialogFilter.description;\r\n } else {\r\n filter = dialogFilter;\r\n\r\n let enabledFilters = Object.keys(filter.pFlags).length;\r\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach(key => {\r\n enabledFilters += +!!filter[key].length;\r\n }); */\r\n \r\n if(enabledFilters === 1) {\r\n const pFlags = filter.pFlags;\r\n let k: LangPackKey;\r\n if(pFlags.contacts) k = 'FilterAllContacts';\r\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\r\n else if(pFlags.groups) k = 'FilterAllGroups';\r\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\r\n else if(pFlags.bots) k = 'FilterAllBots';\r\n\r\n if(k) {\r\n d.push(i18n(k));\r\n }\r\n }\r\n \r\n if(!d.length) {\r\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(filter.id);\r\n let chats = 0, channels = 0, groups = 0;\r\n for(const dialog of folder) {\r\n if(appPeersManager.isAnyGroup(dialog.peerId)) groups++;\r\n else if(appPeersManager.isBroadcast(dialog.peerId)) channels++;\r\n else chats++;\r\n }\r\n\r\n if(chats) d.push(i18n('Chats', [chats]));\r\n if(channels) d.push(i18n('Channels', [channels]));\r\n if(groups) d.push(i18n('Groups', [groups]));\r\n }\r\n }\r\n\r\n let div: HTMLElement;\r\n if(!row) {\r\n row = new Row({\r\n title: RichTextProcessor.wrapEmojiText(filter.title),\r\n subtitle: description,\r\n clickable: true\r\n });\r\n\r\n if(d.length) {\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n \r\n if(dialogFilter._ === 'dialogFilter') {\r\n const filterId = filter.id;\r\n if(!this.filtersRendered.hasOwnProperty(filter.id)) {\r\n attachClickEvent(row.container, () => {\r\n new AppEditFolderTab(this.slider).open(appMessagesManager.filtersStorage.getFilter(filterId));\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n this.filtersRendered[filter.id] = row;\r\n }\r\n } else {\r\n row.subtitle.textContent = '';\r\n join(d).forEach(el => {\r\n row.subtitle.append(el);\r\n });\r\n }\r\n\r\n div = row.container;\r\n\r\n if((filter as MyDialogFilter).hasOwnProperty('orderIndex')) {\r\n // ! header will be at 0 index\r\n positionElementByIndex(div, div.parentElement || container, (filter as MyDialogFilter).orderIndex);\r\n } else if(container) container.append(div);\r\n \r\n return div;\r\n }\r\n\r\n protected async init() {\r\n this.container.classList.add('chat-folders-container');\r\n this.setTitle('ChatList.Filter.List.Title');\r\n\r\n this.scrollable.container.classList.add('chat-folders');\r\n\r\n this.stickerContainer = document.createElement('div');\r\n this.stickerContainer.classList.add('sticker-container');\r\n \r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\r\n \r\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\r\n text: 'ChatList.Filter.NewTitle',\r\n icon: 'add'\r\n });\r\n\r\n this.foldersSection = new SettingSection({\r\n name: 'Filters'\r\n });\r\n this.foldersSection.container.style.display = 'none';\r\n\r\n this.suggestedSection = new SettingSection({\r\n name: 'FilterRecommended'\r\n });\r\n this.suggestedSection.container.style.display = 'none';\r\n\r\n this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container);\r\n\r\n attachClickEvent(this.createFolderBtn, () => {\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n } else {\r\n new AppEditFolderTab(this.slider).open();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n const onFiltersContainerUpdate = () => {\r\n this.foldersSection.container.style.display = Object.keys(this.filtersRendered).length ? '' : 'none';\r\n };\r\n\r\n appMessagesManager.filtersStorage.getDialogFilters().then(filters => {\r\n for(const filter of filters) {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_update', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n this.renderFolder(filter, null, this.filtersRendered[filter.id]);\r\n } else {\r\n this.renderFolder(filter, this.foldersSection.content);\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n\r\n this.getSuggestedFilters();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\r\n if(this.filtersRendered.hasOwnProperty(filter.id)) {\r\n /* for(const suggested of this.suggestedFilters) {\r\n if(deepEqual(suggested.filter, filter)) {\r\n \r\n }\r\n } */\r\n this.getSuggestedFilters();\r\n\r\n this.filtersRendered[filter.id].container.remove();\r\n delete this.filtersRendered[filter.id];\r\n }\r\n\r\n onFiltersContainerUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\r\n order.forEach((filterId, idx) => {\r\n const container = this.filtersRendered[filterId].container;\r\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header \r\n });\r\n });\r\n\r\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\r\n container: this.stickerContainer,\r\n loop: false,\r\n autoplay: false,\r\n width: 86,\r\n height: 86\r\n }, 'Folders_1').then(player => {\r\n this.animation = player;\r\n\r\n return lottieLoader.waitForFirstFrame(player);\r\n });\r\n\r\n this.getSuggestedFilters()\r\n\r\n /* return Promise.all([\r\n this.loadAnimationPromise\r\n ]); */\r\n return this.loadAnimationPromise;\r\n }\r\n\r\n onOpenAfterTimeout() {\r\n this.loadAnimationPromise.then(() => {\r\n this.animation.autoplay = true;\r\n this.animation.play();\r\n });\r\n }\r\n\r\n private getSuggestedFilters() {\r\n return apiManager.invokeApi('messages.getSuggestedDialogFilters').then(suggestedFilters => {\r\n this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none';\r\n Array.from(this.suggestedSection.content.children).slice(1).forEach(el => el.remove());\r\n\r\n suggestedFilters.forEach(filter => {\r\n const div = this.renderFolder(filter);\r\n const button = Button('btn-primary btn-color-primary', {text: 'Add'});\r\n div.append(button);\r\n this.suggestedSection.content.append(div);\r\n\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n\r\n if(Object.keys(this.filtersRendered).length >= 10) {\r\n toast('Sorry, you can\\'t create more folders.');\r\n return;\r\n }\r\n\r\n button.setAttribute('disabled', 'true');\r\n\r\n const f = filter.filter as MyDialogFilter;\r\n f.includePeerIds = [];\r\n f.excludePeerIds = [];\r\n f.pinnedPeerIds = [];\r\n\r\n appMessagesManager.filtersStorage.createDialogFilter(f, true).then(bool => {\r\n if(bool) {\r\n div.remove();\r\n }\r\n }).finally(() => {\r\n button.removeAttribute('disabled');\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport Row from \"../../row\";\r\nimport CheckboxField from \"../../checkboxField\";\r\nimport { InputNotifyPeer, Update } from \"../../../layer\";\r\nimport appNotificationsManager from \"../../../lib/appManagers/appNotificationsManager\";\r\nimport { SliderSuperTabEventable } from \"../../sliderTab\";\r\nimport { copy } from \"../../../helpers/object\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport { convertKeyToInputKey } from \"../../../helpers/string\";\r\nimport { LangPackKey } from \"../../../lib/langPack\";\r\nimport appStateManager from \"../../../lib/appManagers/appStateManager\";\r\n\r\ntype InputNotifyKey = Exclude;\r\n\r\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\r\n protected init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('notifications-container', 'with-border');\r\n this.setTitle('Telegram.NotificationSettingsViewController');\r\n\r\n const NotifySection = (options: {\r\n name: LangPackKey,\r\n typeText: LangPackKey,\r\n inputKey: InputNotifyKey,\r\n }) => {\r\n const section = new SettingSection({\r\n name: options.name\r\n });\r\n\r\n const enabledRow = new Row({\r\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const previewEnabledRow = new Row({\r\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n section.content.append(enabledRow.container, previewEnabledRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n const inputNotifyPeer = {_: options.inputKey};\r\n const ret = appNotificationsManager.getNotifySettings(inputNotifyPeer);\r\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\r\n const applySettings = () => {\r\n const muted = appNotificationsManager.isMuted(notifySettings);\r\n enabledRow.checkboxField.checked = !muted;\r\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\r\n \r\n return muted;\r\n };\r\n \r\n applySettings();\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const mute = !enabledRow.checkboxField.checked;\r\n const showPreviews = previewEnabledRow.checkboxField.checked;\r\n\r\n if(mute === appNotificationsManager.isMuted(notifySettings) && showPreviews === notifySettings.show_previews) {\r\n return;\r\n }\r\n\r\n const inputSettings: any = copy(notifySettings);\r\n inputSettings._ = 'inputPeerNotifySettings';\r\n inputSettings.mute_until = mute ? 0x7FFFFFFF : 0;\r\n inputSettings.show_previews = showPreviews;\r\n\r\n appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\r\n }, {once: true});\r\n\r\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\r\n const inputKey = convertKeyToInputKey(update.peer._) as any;\r\n if(options.inputKey === inputKey) {\r\n notifySettings = update.notify_settings;\r\n applySettings();\r\n }\r\n });\r\n });\r\n };\r\n\r\n NotifySection({\r\n name: 'NotificationsPrivateChats',\r\n typeText: 'NotificationsForPrivateChats',\r\n inputKey: 'inputNotifyUsers'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsGroups',\r\n typeText: 'NotificationsForGroups',\r\n inputKey: 'inputNotifyChats'\r\n });\r\n\r\n NotifySection({\r\n name: 'NotificationsChannels',\r\n typeText: 'NotificationsForChannels',\r\n inputKey: 'inputNotifyBroadcasts'\r\n });\r\n\r\n {\r\n const section = new SettingSection({\r\n name: 'NotificationsOther'\r\n });\r\n\r\n const contactsSignUpRow = new Row({\r\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n \r\n const soundRow = new Row({\r\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound'}),\r\n subtitleLangKey: 'Loading',\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n soundRow.checkboxField.checked = state.settings.notifications.sound;\r\n });\r\n\r\n section.content.append(contactsSignUpRow.container, soundRow.container);\r\n\r\n this.scrollable.append(section.container);\r\n\r\n appNotificationsManager.getContactSignUpNotification().then(enabled => {\r\n contactsSignUpRow.checkboxField.checked = enabled;\r\n\r\n this.eventListener.addEventListener('destroy', () => {\r\n const _enabled = contactsSignUpRow.checkboxField.checked;\r\n if(enabled !== _enabled) {\r\n appNotificationsManager.setContactSignUpNotification(!_enabled);\r\n }\r\n }, {once: true});\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SettingSection } from \"..\";\r\nimport { randomLong } from \"../../../helpers/random\";\r\nimport I18n from \"../../../lib/langPack\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport RadioField from \"../../radioField\";\r\nimport Row, { RadioFormFromRows } from \"../../row\";\r\nimport { SliderSuperTab } from \"../../slider\"\r\n\r\nexport default class AppLanguageTab extends SliderSuperTab {\r\n protected async init() {\r\n this.header.classList.add('with-border');\r\n this.container.classList.add('language-container');\r\n this.setTitle('Telegram.LanguageViewController');\r\n\r\n const section = new SettingSection({});\r\n\r\n const radioRows: Map = new Map();\r\n\r\n const promise = apiManager.invokeApiCacheable('langpack.getLanguages', {\r\n lang_pack: 'macos'\r\n }).then((languages) => {\r\n const random = randomLong();\r\n languages.forEach((language) => {\r\n const row = new Row({\r\n radioField: new RadioField({\r\n text: language.name, \r\n name: random, \r\n value: language.lang_code\r\n }),\r\n subtitle: language.native_name\r\n });\r\n \r\n radioRows.set(language.lang_code, row);\r\n });\r\n\r\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\r\n I18n.getLangPack(value);\r\n });\r\n \r\n I18n.getCacheLangPack().then(langPack => {\r\n const row = radioRows.get(langPack.lang_code);\r\n if(!row) {\r\n console.error('no row', row, langPack);\r\n return;\r\n }\r\n \r\n row.radioField.setValueSilently(true);\r\n });\r\n \r\n section.content.append(form);\r\n });\r\n\r\n this.scrollable.append(section.container);\r\n\r\n return promise;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarElement from \"../../avatar\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport ButtonMenuToggle from \"../../buttonMenuToggle\";\r\nimport Button from \"../../button\";\r\nimport AppPrivacyAndSecurityTab from \"./privacyAndSecurity\";\r\nimport AppGeneralSettingsTab from \"./generalSettings\";\r\nimport AppEditProfileTab from \"./editProfile\";\r\nimport AppChatFoldersTab from \"./chatFolders\";\r\nimport AppNotificationsTab from \"./notifications\";\r\nimport PeerTitle from \"../../peerTitle\";\r\nimport AppLanguageTab from \"./language\";\r\nimport lottieLoader from \"../../../lib/rlottie/lottieLoader\";\r\nimport PopupPeer from \"../../popups/peer\";\r\n//import AppMediaViewer from \"../../appMediaViewerNew\";\r\n\r\nexport default class AppSettingsTab extends SliderSuperTab {\r\n private avatarElem: AvatarElement;\r\n private nameDiv: HTMLElement;\r\n private phoneDiv: HTMLElement;\r\n\r\n private buttons: {\r\n edit: HTMLButtonElement,\r\n folders: HTMLButtonElement,\r\n general: HTMLButtonElement,\r\n notifications: HTMLButtonElement,\r\n privacy: HTMLButtonElement,\r\n language: HTMLButtonElement\r\n } = {} as any;\r\n\r\n protected init() {\r\n this.container.classList.add('settings-container');\r\n this.setTitle('Settings');\r\n \r\n const btnMenu = ButtonMenuToggle({}, 'bottom-left', [{\r\n icon: 'logout',\r\n text: 'EditAccount.Logout',\r\n onClick: () => {\r\n new PopupPeer('logout', {\r\n titleLangKey: 'LogOut',\r\n descriptionLangKey: 'LogOut.Description',\r\n buttons: [{\r\n langKey: 'LogOut',\r\n callback: () => {\r\n apiManager.logOut();\r\n },\r\n isDanger: true\r\n }]\r\n }).show();\r\n }\r\n }]);\r\n\r\n this.header.append(btnMenu);\r\n\r\n this.avatarElem = new AvatarElement();\r\n this.avatarElem.setAttribute('clickable', '');\r\n this.avatarElem.classList.add('profile-avatar', 'avatar-120');\r\n\r\n /* const div = document.createElement('div');\r\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\r\n //div.style.width = '135px';\r\n //div.style.height = '100px';\r\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\r\n div.style.width = '135px';\r\n div.style.height = '100px';\r\n \r\n const img = document.createElement('img');\r\n img.src = 'assets/img/pepe.jpg';\r\n img.classList.add('media-photo');\r\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\r\n\r\n div.append(img);\r\n\r\n div.addEventListener('click', () => {\r\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\r\n _: 'message',\r\n mid: 1,\r\n peerId: 61004386,\r\n fromId: 61004386,\r\n message: '',\r\n media: {\r\n _: 'messageMediaPhoto',\r\n photo: {\r\n _: 'photo',\r\n url: img.src,\r\n downloaded: 111,\r\n sizes: [{\r\n _: 'photoSize',\r\n type: 'x',\r\n w: 618,\r\n h: 412\r\n }]\r\n }\r\n },\r\n date: Date.now() / 1000 | 0\r\n }, img);\r\n });\r\n\r\n this.scrollable.append(div); */\r\n \r\n this.nameDiv = document.createElement('div');\r\n this.nameDiv.classList.add('profile-name');\r\n\r\n this.phoneDiv = document.createElement('div');\r\n this.phoneDiv.classList.add('profile-subtitle');\r\n\r\n const buttonsDiv = document.createElement('div');\r\n buttonsDiv.classList.add('profile-buttons');\r\n\r\n const className = 'profile-button btn-primary btn-transparent';\r\n buttonsDiv.append(this.buttons.edit = Button(className, {icon: 'edit', text: 'EditAccount.Title'}));\r\n buttonsDiv.append(this.buttons.folders = Button(className, {icon: 'folder', text: 'AccountSettings.Filters'}));\r\n buttonsDiv.append(this.buttons.general = Button(className, {icon: 'settings', text: 'Telegram.GeneralSettingsViewController'}));\r\n buttonsDiv.append(this.buttons.notifications = Button(className, {icon: 'unmute', text: 'AccountSettings.Notifications'}));\r\n buttonsDiv.append(this.buttons.privacy = Button(className, {icon: 'lock', text: 'AccountSettings.PrivacyAndSecurity'}));\r\n buttonsDiv.append(this.buttons.language = Button(className, {icon: 'language', text: 'AccountSettings.Language'}));\r\n \r\n this.scrollable.append(this.avatarElem, this.nameDiv, this.phoneDiv, buttonsDiv);\r\n this.scrollable.container.classList.add('profile-content-wrapper');\r\n\r\n /* rootScope.$on('user_auth', (e) => {\r\n this.fillElements();\r\n }); */\r\n\r\n this.buttons.edit.addEventListener('click', () => {\r\n const tab = new AppEditProfileTab(this.slider);\r\n tab.open();\r\n });\r\n\r\n this.buttons.folders.addEventListener('click', () => {\r\n new AppChatFoldersTab(this.slider).open();\r\n });\r\n\r\n this.buttons.general.addEventListener('click', () => {\r\n new AppGeneralSettingsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.notifications.addEventListener('click', () => {\r\n new AppNotificationsTab(this.slider).open();\r\n });\r\n\r\n this.buttons.privacy.addEventListener('click', () => {\r\n new AppPrivacyAndSecurityTab(this.slider).open();\r\n });\r\n\r\n this.buttons.language.addEventListener('click', () => {\r\n new AppLanguageTab(this.slider).open();\r\n });\r\n\r\n lottieLoader.loadLottieWorkers();\r\n\r\n this.fillElements();\r\n }\r\n\r\n public fillElements() {\r\n const user = appUsersManager.getSelf();\r\n const peerId = user.id.toPeerId(false);\r\n this.avatarElem.setAttribute('peer', '' + peerId);\r\n\r\n this.nameDiv.append(new PeerTitle({peerId: peerId}).element);\r\n this.phoneDiv.innerHTML = user.phone ? appUsersManager.formatUserPhone(user.phone) : '';\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarLeft, { SettingSection } from \"..\";\r\nimport { InputFile } from \"../../../layer\";\r\nimport appChatsManager from \"../../../lib/appManagers/appChatsManager\";\r\nimport InputField from \"../../inputField\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport AvatarEdit from \"../../avatarEdit\";\r\nimport AppAddMembersTab from \"./addMembers\";\r\nimport { _i18n } from \"../../../lib/langPack\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\n\r\nexport default class AppNewChannelTab extends SliderSuperTab {\r\n private uploadAvatar: () => Promise = null;\r\n\r\n private channelNameInputField: InputField;\r\n private channelDescriptionInputField: InputField;\r\n private nextBtn: HTMLButtonElement;\r\n private avatarEdit: AvatarEdit;\r\n\r\n protected init() {\r\n this.container.classList.add('new-channel-container');\r\n this.setTitle('NewChannel');\r\n\r\n this.avatarEdit = new AvatarEdit((_upload) => {\r\n this.uploadAvatar = _upload;\r\n });\r\n\r\n const section = new SettingSection({\r\n caption: 'Channel.DescriptionHolderDescrpiton'\r\n });\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n this.channelNameInputField = new InputField({\r\n label: 'EnterChannelName',\r\n maxLength: 128\r\n });\r\n\r\n this.channelDescriptionInputField = new InputField({\r\n label: 'DescriptionOptionalPlaceholder',\r\n maxLength: 255\r\n });\r\n\r\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\r\n\r\n const onLengthChange = () => {\r\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length && \r\n !this.channelNameInputField.input.classList.contains('error') && \r\n !this.channelDescriptionInputField.input.classList.contains('error'));\r\n };\r\n\r\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\r\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\r\n\r\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\r\n\r\n this.nextBtn.addEventListener('click', () => {\r\n const title = this.channelNameInputField.value;\r\n const about = this.channelDescriptionInputField.value;\r\n\r\n this.nextBtn.disabled = true;\r\n appChatsManager.createChannel({\r\n title, \r\n about,\r\n broadcast: true\r\n }).then((channelId) => {\r\n if(this.uploadAvatar) {\r\n this.uploadAvatar().then((inputFile) => {\r\n appChatsManager.editPhoto(channelId, inputFile);\r\n });\r\n }\r\n \r\n appSidebarLeft.removeTabFromHistory(this);\r\n new AppAddMembersTab(this.slider).open({\r\n type: 'channel',\r\n skippable: true,\r\n title: 'GroupAddMembers',\r\n placeholder: 'SendMessageTo',\r\n takeOut: (peerIds) => {\r\n return appChatsManager.inviteToChannel(channelId, peerIds);\r\n }\r\n });\r\n });\r\n });\r\n\r\n this.content.append(this.nextBtn);\r\n section.content.append(this.avatarEdit.container, inputWrapper);\r\n this.scrollable.append(section.container);\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.avatarEdit.clear();\r\n this.uploadAvatar = null;\r\n this.channelNameInputField.value = '';\r\n this.channelDescriptionInputField.value = '';\r\n this.nextBtn.disabled = false;\r\n return super.onCloseAfterTimeout();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport EditPeer from \"../editPeer\";\nimport { _i18n } from \"../../lib/langPack\";\nimport TelInputField from \"../telInputField\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { toastNew } from \"../toast\";\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Add'});\n\n _i18n(this.title, 'AddContactTitle');\n\n attachClickEvent(this.btnConfirm, () => {\n const promise = appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = RichTextProcessor.getAbbreviation(name);\n editPeer.avatarElem.setAttribute('peer-title', name);\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SliderSuperTab } from \"../../slider\";\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\nimport InputSearch from \"../../inputSearch\";\nimport { IS_MOBILE } from \"../../../environment/userAgent\";\nimport { canFocus } from \"../../../helpers/dom/canFocus\";\nimport windowSize from \"../../../helpers/windowSize\";\nimport ButtonCorner from \"../../buttonCorner\";\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\nimport PopupCreateContact from \"../../popups/createContact\";\nimport SortedUserList from \"../../sortedUserList\";\nimport { getMiddleware } from \"../../../helpers/middleware\";\nimport replaceContent from \"../../../helpers/dom/replaceContent\";\nimport rootScope from \"../../../lib/rootScope\";\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n \n protected init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n new PopupCreateContact();\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n const isContact = appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList();\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 72 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach(el => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n appUsersManager.getContactsPeerIds(query, undefined, 'online').then(contacts => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 72 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n\n public open() {\n this.openContacts();\n return super.open();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\nimport { SliderSuperTab } from \"../../slider\";\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId = 1;\n private wasFilterId: number;\n\n init() {\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n if(!appDialogsManager.sortedLists[AppArchivedTab.filterId]) {\n const chatList = appDialogsManager.createChatList();\n appDialogsManager.generateScrollable(chatList, AppArchivedTab.filterId).container.append(chatList);\n appDialogsManager.setListClickListener(chatList, null, true);\n //appDialogsManager.setListClickListener(archivedChatList, null, true); // * to test peer changing\n }\n\n const scrollable = appDialogsManager.scrollables[AppArchivedTab.filterId];\n this.scrollable.container.replaceWith(scrollable.container);\n this.scrollable = scrollable;\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.wasFilterId = appDialogsManager.filterId;\n appDialogsManager.setFilterId(AppArchivedTab.filterId);\n appDialogsManager.onTabChange();\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.sortedLists[this.wasFilterId].clear();\n }\n\n onClose() {\n appDialogsManager.setFilterId(this.wasFilterId);\n appDialogsManager.onTabChange();\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.sortedLists[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { addCancelButton } from \"./popups\";\nimport PopupPeer, { PopupPeerOptions } from \"./popups/peer\";\n\n// type PopupConfirmationOptions = Pick;\ntype PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(options: PopupConfirmationOptions) {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n resolve(set ? !!set.size : undefined);\n };\n\n const buttons = addCancelButton([button]);\n const cancelButton = buttons.find(button => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes = checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport ButtonCorner from \"../../buttonCorner\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport AppNewGroupTab from \"./newGroup\";\r\nimport { toast } from \"../../toast\";\r\nimport { ButtonMenuItemOptions } from \"../../buttonMenu\";\r\nimport type { LazyLoadQueueIntersector } from \"../../lazyLoadQueue\";\r\nimport { i18n, join, _i18n } from \"../../../lib/langPack\";\r\nimport rootScope from '../../../lib/rootScope';\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport SortedUserList from \"../../sortedUserList\";\r\nimport { PeerLocated, Update, Updates } from \"../../../layer\";\r\nimport appPeersManager from \"../../../lib/appManagers/appPeersManager\";\r\nimport { SettingChatListSection } from \"..\";\r\nimport appProfileManager from \"../../../lib/appManagers/appProfileManager\";\r\nimport appDialogsManager from \"../../../lib/appManagers/appDialogsManager\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport confirmationPopup from \"../../confirmationPopup\";\r\n\r\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\r\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\r\n private isLocationWatched: boolean = false;\r\n private errorCategory: HTMLElement;\r\n private retryBtn: HTMLButtonElement;\r\n private btnOptions: HTMLButtonElement;\r\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\r\n\r\n protected lazyLoadQueue: LazyLoadQueueIntersector;\r\n protected peopleSection: SettingChatListSection;\r\n protected chatsSection: SettingChatListSection;\r\n\r\n protected locatedPeers: Map;\r\n\r\n protected init() {\r\n this.container.classList.add('people-nearby-container');\r\n this.setTitle('PeopleNearby');\r\n\r\n this.errorCategory = document.createElement('div');\r\n this.errorCategory.classList.add('text', 'hide', 'nearby-error');\r\n\r\n this.retryBtn = ButtonCorner({icon: 'check'});\r\n\r\n const emoji = '🧭';\r\n const doc = appStickersManager.getAnimatedEmojiSticker(emoji);\r\n const stickerContainer = document.createElement('div');\r\n stickerContainer.classList.add('sticker-container');\r\n\r\n if(doc) {\r\n wrapSticker({\r\n doc,\r\n div: stickerContainer,\r\n loop: false,\r\n play: true,\r\n width: 86,\r\n height: 86,\r\n emoji,\r\n needUpscale: true\r\n }).then(() => {\r\n // this.animation = player;\r\n });\r\n } else {\r\n stickerContainer.classList.add('media-sticker-wrapper');\r\n }\r\n\r\n const caption = document.createElement('div');\r\n caption.classList.add('caption');\r\n _i18n(caption, 'PeopleNearbyInfo2');\r\n\r\n this.locatedPeers = new Map();\r\n\r\n const m = () => {\r\n const sortedUserList = new SortedUserList({\r\n avatarSize: 42, \r\n createChatListOptions: {\r\n dialogSize: 48,\r\n new: true\r\n },\r\n autonomous: false,\r\n onUpdate: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n const elements: HTMLElement[] = [\r\n this.parseDistance(peer.distance)\r\n ];\r\n\r\n if(!element.id.isUser()) {\r\n elements.push(appProfileManager.getChatMembersString(element.id.toChatId()));\r\n }\r\n\r\n element.dom.lastMessageSpan.textContent = '';\r\n element.dom.lastMessageSpan.append(...join(elements, false));\r\n },\r\n getIndex: (element) => {\r\n const peer = this.locatedPeers.get(element.id);\r\n return 0x7FFFFFFF - peer.distance;\r\n }\r\n });\r\n\r\n appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\r\n \r\n return sortedUserList;\r\n };\r\n \r\n const peopleSection = this.peopleSection = new SettingChatListSection({\r\n name: 'PeopleNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const chatsSection = this.chatsSection = new SettingChatListSection({\r\n name: 'ChatsNearbyHeader',\r\n sortedList: m()\r\n });\r\n\r\n const btnMakeVisible = peopleSection.makeButton({\r\n text: 'MakeMyselfVisible',\r\n icon: 'location'\r\n });\r\n\r\n const btnMakeInvisible = peopleSection.makeButton({\r\n text: 'StopShowingMe',\r\n icon: 'location'\r\n });\r\n\r\n const btnCreateGroup = chatsSection.makeButton({\r\n text: 'NearbyCreateGroup',\r\n icon: 'newgroup'\r\n });\r\n\r\n attachClickEvent(btnMakeVisible, () => {\r\n confirmationPopup({\r\n titleLangKey: 'MakeMyselfVisibleTitle',\r\n descriptionLangKey: 'MakeMyselfVisibleInfo',\r\n button: {\r\n langKey: 'OK'\r\n }\r\n }).then(() => {\r\n this.startWatching();\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnMakeInvisible, () => {\r\n this.stopWatching();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n attachClickEvent(btnCreateGroup, () => {\r\n new AppNewGroupTab(this.slider).open([], true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n btnMakeVisible.classList.add('primary');\r\n btnMakeInvisible.classList.add('danger');\r\n btnCreateGroup.classList.add('primary');\r\n\r\n this.content.append(this.retryBtn);\r\n this.scrollable.append(\r\n stickerContainer,\r\n caption,\r\n peopleSection.container,\r\n chatsSection.container,\r\n this.errorCategory\r\n );\r\n }\r\n\r\n private parseDistance(distance: number) {\r\n if(rootScope.settings.distanceUnit === 'miles') {\r\n if(distance > 1609.34) {\r\n return i18n('MilesAway', [Math.round(distance / 1609)]);\r\n } else {\r\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\r\n }\r\n } else {\r\n if(distance >= 1000) {\r\n return i18n('KMetersAway2', [distance / 1000]);\r\n } else {\r\n return i18n('MetersAway2', [distance]);\r\n }\r\n }\r\n }\r\n\r\n public open() {\r\n const result = super.open();\r\n result.then(() => {\r\n this.retryBtn.classList.remove('is-visible');\r\n navigator.geolocation.getCurrentPosition((location) => {\r\n this.latestLocationSaved = {\r\n latitude: location.coords.latitude,\r\n longitude: location.coords.longitude,\r\n accuracy: location.coords.accuracy\r\n };\r\n\r\n console.log(this.latestLocationSaved);\r\n\r\n appUsersManager.getLocated(\r\n location.coords.latitude,\r\n location.coords.longitude,\r\n location.coords.accuracy\r\n ).then((response) => {\r\n const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\r\n const peers = update.peers as PeerLocated.peerLocated[];\r\n const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\r\n const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\r\n const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\r\n orderedPeers?.forEach(peer => {\r\n const peerId = appPeersManager.getPeerId(peer.peer);\r\n const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\r\n this.locatedPeers.set(peerId, peer);\r\n section.sortedList.add(peerId);\r\n });\r\n\r\n this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\r\n this.errorCategory.innerHTML = \"No groups or channels found around you.\";\r\n });\r\n }, (error) => {\r\n this.errorCategory.classList.remove('hide');\r\n this.retryBtn.classList.add('is-visible');\r\n this.retryBtn.addEventListener('click', this.open);\r\n if(error instanceof GeolocationPositionError) {\r\n this.errorCategory.innerHTML = \"Location permission denied. Click below to retry.\";\r\n } else {\r\n this.errorCategory.innerHTML = \"An error has occurred. Please retry later clicking the button below.\";\r\n }\r\n });\r\n });\r\n\r\n return result;\r\n }\r\n\r\n private startWatching() {\r\n if(!this.latestLocationSaved || this.isLocationWatched) return;\r\n this.isLocationWatched = true;\r\n\r\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\r\n\r\n appUsersManager.getLocated(\r\n this.latestLocationSaved.latitude,\r\n this.latestLocationSaved.longitude,\r\n this.latestLocationSaved.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n\r\n navigator.geolocation.watchPosition((result) => {\r\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\r\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\r\n const distanceCheck = this.calculateDistance(\r\n result.coords.latitude, result.coords.longitude,\r\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\r\n ) > 100;\r\n\r\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\r\n appUsersManager.getLocated(\r\n result.coords.latitude,\r\n result.coords.longitude,\r\n result.coords.accuracy,\r\n true, // background parameter\r\n 0x7fffffff // self_expires parameter\r\n );\r\n this.latestLocationSaved = {\r\n latitude: result.coords.latitude,\r\n longitude: result.coords.longitude,\r\n accuracy: result.coords.accuracy\r\n }\r\n }\r\n });\r\n }\r\n\r\n private stopWatching() {\r\n if(!this.isLocationWatched) return;\r\n this.isLocationWatched = false;\r\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\r\n appUsersManager.getLocated(\r\n 0, // latitude parameter\r\n 0, // longitude parameter\r\n 0, // accuracy parameter\r\n false, // background parameter\r\n 0 // self_expires parameter\r\n );\r\n }\r\n\r\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\r\n const p = 0.017453292519943295; // Math.PI/180\r\n return (\r\n 12742 * Math.asin(\r\n Math.sqrt(\r\n (0.5 - Math.cos((lat2 - lat1) * p)) +\r\n (\r\n Math.cos(lat1 * p) * Math.cos(lat2 * p)\r\n * (1 - Math.cos((long2 - long1) * p)/2)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatNumber } from \"../../helpers/number\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport appUsersManager from \"../../lib/appManagers/appUsersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { SearchGroup } from \"../appSearch\";\nimport \"../avatar\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport InputSearch from \"../inputSearch\";\nimport SidebarSlider from \"../slider\";\nimport { TransitionSlider } from \"../transition\";\nimport AppNewGroupTab from \"./tabs/newGroup\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport AppSearchSuper from \"../appSearchSuper.\";\nimport { DateData, fillTipDates } from \"../../helpers/date\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppSettingsTab from \"./tabs/settings\";\nimport AppNewChannelTab from \"./tabs/newChannel\";\nimport AppContactsTab from \"./tabs/contacts\";\nimport AppArchivedTab from \"./tabs/archivedTab\";\nimport AppAddMembersTab from \"./tabs/addMembers\";\nimport { FormatterArguments, i18n, i18n_, LangPackKey } from \"../../lib/langPack\";\nimport AppPeopleNearbyTab from \"./tabs/peopleNearby\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport CheckboxField from \"../checkboxField\";\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\nimport appNavigationController from \"../appNavigationController\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport PeerTitle from \"../peerTitle\";\nimport App from \"../../config/app\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sessionStorage from \"../../lib/sessionStorage\";\nimport { attachClickEvent, CLICK_EVENT_NAME } from \"../../helpers/dom/clickEvent\";\nimport { closeBtnMenu } from \"../misc\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport ButtonIcon from \"../buttonIcon\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport IS_GEOLOCATION_SUPPORTED from \"../../environment/geolocationSupport\";\nimport type SortedUserList from \"../sortedUserList\";\nimport Button, { ButtonOptions } from \"../button\";\nimport noop from \"../../helpers/noop\";\nimport { ripple } from \"../ripple\";\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLButtonElement;\n private backBtn: HTMLButtonElement;\n //private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n \n public archivedCount: HTMLSpanElement;\n\n private newBtnMenu: HTMLElement;\n\n //private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n\n //this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n new AppAddMembersTab(this).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => {\n new AppNewGroupTab(this).open(peerIds);\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n new AppContactsTab(this).open();\n };\n\n //this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: ButtonMenuItemOptions & {verify?: () => boolean} = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n new AppArchivedTab(this).open();\n },\n verify: () => {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(1, false);\n return !!folder.length || !appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: rootScope.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', () => {\n rootScope.settings.theme = themeCheckboxField.input.checked ? 'night' : 'day';\n appStateManager.pushToState('settings', rootScope.settings);\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(rootScope.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[] = [{\n icon: 'saved',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n new AppPeopleNearbyTab(this).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n new AppSettingsTab(this).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n \n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n \n },\n checkboxField: new CheckboxField({\n toggle: true, \n checked: true,\n stateKey: 'settings.animationsEnabled',\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n appImManager.openUsername({\n userName: 'TelegramTips'\n });\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({}, 'bottom-right', filteredButtons, (e) => {\n filteredButtons.forEach(button => {\n if(button.verify) {\n button.element.classList.toggle('hide', !button.verify());\n }\n });\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n const btnMenu = this.toolsBtn.querySelector('.btn-menu') as HTMLElement;\n\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n closeBtnMenu();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' alpha ' + App.versionFull;\n btnMenuFooter.append(t); \n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n this.newBtnMenu = ButtonMenuToggle({}, 'top-left', [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n new AppNewChannelTab(this).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]);\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n // this.updateBtn.classList.add('btn-update');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n // const weave = new TopbarWeave();\n // const weaveContainer = weave.render('btn-update-weave');\n // this.updateBtn.prepend(weaveContainer);\n\n attachClickEvent(this.updateBtn, () => {\n location.reload();\n });\n \n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n // setTimeout(() => {\n // weave.componentDidMount();\n // weave.setCurrentState(GROUP_CALL_STATE.MUTED, true);\n // weave.setAmplitude(0);\n // weave.handleBlur();\n // }, 1e3);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n //parseMenuButtonsTo(this.newButtons, this.newBtnMenu.firstElementChild.children);\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n btnArchive.element.append(this.archivedCount);\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 1) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadDialogsCount;\n this.archivedCount.innerText = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n appUsersManager.getTopPeers('correspondents');\n\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n appStateManager.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n //setTimeout(() => {\n this.backBtn.click();\n //}, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }], \n scrollable, \n searchGroups: this.searchGroups, \n asChatList: true,\n hideEmptyTabs: false,\n showSender: true\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(), \n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true); \n };\n\n resetSearch();\n\n let pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n //(this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = document.createElement('avatar-element');\n avatarEl.classList.add('selector-user-avatar', 'tgico');\n avatarEl.setAttribute('dialog', '1');\n avatarEl.classList.add('avatar-30');\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.setAttribute('peer', '' + key);\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n \n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach(el => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId, \n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n \n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then(dialogs => dialogs.map(d => d.peerId)),\n appMessagesManager.getConversations(value).promise.then(({dialogs}) => dialogs.map(d => d.peerId)),\n appUsersManager.getContactsPeerIds(value, true)\n ]).then(results => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n \n peerIds.forEach(peerId => {\n helper.append(renderEntity(peerId));\n });\n \n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n //console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n \n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach(dateData => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, 'LI') as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n appStateManager.getState().then(state => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n \n appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n appStateManager.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }, {capture: true});\n\n let peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n let peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n //const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider(searchContainer.parentElement, 'zoom-fade', 150, (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n this.backBtn.addEventListener('click', (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n appStateManager.getState().then(state => {\n this.searchGroups.recent.clear();\n \n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n appStateManager.releaseSinglePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n appStateManager.pushToState('recentSearch', recentSearch);\n });\n });\n });\n }\n}\n\nexport type SettingSectionOptions = {\n name?: LangPackKey, \n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n if(options.caption) {\n const caption = this.caption = this.generateContentElement();\n caption.classList.add(className + '-caption');\n container.append(caption);\n\n if(options.caption !== true) {\n i18n_({element: caption, key: options.caption});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n\nexport const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\n//import { generatePathData } from \"../../helpers/dom\";\r\nimport { MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type Chat from \"./chat\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\ntype Group = {bubble: HTMLElement, mid: number, timestamp: number}[];\r\ntype BubbleGroup = {timestamp: number, fromId: PeerId, mid: number, group: Group};\r\nexport default class BubbleGroups {\r\n private bubbles: Array = []; // map to group\r\n private detailsMap: Map = new Map();\r\n private groups: Array = [];\r\n //updateRAFs: Map = new Map();\r\n private newGroupDiff = 121; // * 121 in scheduled messages\r\n\r\n constructor(private chat: Chat) {\r\n\r\n }\r\n\r\n removeBubble(bubble: HTMLElement) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n if(details.group.length) {\r\n details.group.findAndSplice(d => d.bubble === bubble);\r\n if(!details.group.length) {\r\n indexOfAndSplice(this.groups, details.group);\r\n } else {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n this.detailsMap.delete(bubble);\r\n }\r\n }\r\n\r\n changeBubbleMid(bubble: HTMLElement, mid: number) {\r\n const details = this.detailsMap.get(bubble);\r\n if(details) {\r\n details.mid = mid;\r\n }\r\n }\r\n \r\n addBubble(bubble: HTMLElement, message: MyMessage, reverse: boolean) {\r\n //return;\r\n\r\n const timestamp = message.date;\r\n const mid = message.mid;\r\n let fromId = message.viaBotId || message.fromId;\r\n let group: Group;\r\n\r\n // fix for saved messages forward to self\r\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as any).fwdFromId === fromId) {\r\n fromId = fromId.toPeerId(true);\r\n }\r\n \r\n // try to find added\r\n this.removeBubble(bubble);\r\n \r\n const insertObject = {bubble, mid, timestamp};\r\n if(this.bubbles.length) {\r\n let foundBubble: BubbleGroup;\r\n let foundAtIndex = -1;\r\n for(let i = 0; i < this.bubbles.length; ++i) {\r\n const bubble = this.bubbles[i];\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n const good = bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n\r\n if(good) {\r\n foundAtIndex = i;\r\n\r\n if(this.chat.type === 'scheduled') {\r\n break;\r\n }\r\n } else {\r\n foundAtIndex = -1;\r\n }\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n if(mid > bubble.mid) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(foundAtIndex !== -1) {\r\n foundBubble = this.bubbles[foundAtIndex];\r\n }\r\n /* const foundBubble = this.bubbles.find(bubble => {\r\n const diff = Math.abs(bubble.timestamp - timestamp);\r\n return bubble.fromId === fromId && diff <= this.newGroupDiff;\r\n }); */\r\n\r\n if(!foundBubble) this.groups.push(group = [insertObject]);\r\n else {\r\n group = foundBubble.group;\r\n \r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < group.length; ++i) {\r\n const _timestamp = group[i].timestamp;\r\n const _mid = group[i].mid;\r\n\r\n if(timestamp < _timestamp) {\r\n break;\r\n } else if(timestamp === _timestamp) {\r\n foundMidOnSameTimestamp = _mid;\r\n } \r\n \r\n if(foundMidOnSameTimestamp && mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n\r\n group.splice(i, 0, insertObject);\r\n }\r\n } else {\r\n this.groups.push(group = [insertObject]);\r\n }\r\n\r\n //console.log('[BUBBLE]: addBubble', bubble, message.mid, fromId, reverse, group);\r\n\r\n const bubbleGroup = {timestamp, fromId, mid: message.mid, group};\r\n let insertIndex = 0;\r\n for(; insertIndex < this.bubbles.length; ++insertIndex) {\r\n if(this.bubbles[insertIndex].mid < mid) {\r\n break;\r\n }\r\n }\r\n \r\n this.bubbles.splice(insertIndex, 0, {timestamp, fromId, mid: message.mid, group});\r\n this.updateGroup(group);\r\n\r\n this.detailsMap.set(bubble, bubbleGroup);\r\n }\r\n\r\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\r\n //console.log('setClipIfNeeded', bubble, remove);\r\n const className = bubble.className;\r\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\r\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\r\n //console.log('setClipIfNeeded', bubble, remove, container);\r\n if(!container) return;\r\n\r\n try {\r\n Array.from(container.children).forEach(object => {\r\n if(object instanceof SVGDefsElement) return;\r\n \r\n if(remove) {\r\n object.removeAttributeNS(null, 'clip-path');\r\n } else {\r\n let clipId = container.dataset.clipId;\r\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\r\n let width = +object.getAttributeNS(null, 'width');\r\n let height = +object.getAttributeNS(null, 'height');\r\n let isOut = className.includes('is-out');\r\n let isReply = className.includes('is-reply');\r\n let d = '';\r\n \r\n //console.log('setClipIfNeeded', object, width, height, isOut);\r\n \r\n let tr: number, tl: number;\r\n if(className.includes('forwarded') || isReply) {\r\n tr = tl = 0;\r\n } else if(isOut) {\r\n tr = className.includes('is-group-first') ? 12 : 6;\r\n tl = 12;\r\n } else {\r\n tr = 12;\r\n tl = className.includes('is-group-first') ? 12 : 6;\r\n }\r\n \r\n if(isOut) {\r\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\r\n } else {\r\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\r\n }\r\n \r\n path.setAttributeNS(null, 'd', d);\r\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\r\n }\r\n });\r\n } catch(err) {}\r\n }\r\n } */\r\n \r\n updateGroup(group: Group) {\r\n /* if(this.updateRAFs.has(group)) {\r\n window.cancelAnimationFrame(this.updateRAFs.get(group));\r\n this.updateRAFs.delete(group);\r\n } */\r\n \r\n //this.updateRAFs.set(group, window.requestAnimationFrame(() => {\r\n //this.updateRAFs.delete(group);\r\n \r\n if(!group.length) {\r\n return;\r\n }\r\n \r\n const first = group[0].bubble;\r\n\r\n //console.log('[BUBBLE]: updateGroup', group, first);\r\n \r\n if(group.length === 1) {\r\n first.classList.add('is-group-first', 'is-group-last');\r\n //this.setClipIfNeeded(first);\r\n return;\r\n } else {\r\n first.classList.remove('is-group-last');\r\n first.classList.add('is-group-first');\r\n //this.setClipIfNeeded(first, true);\r\n }\r\n \r\n const length = group.length - 1;\r\n for(let i = 1; i < length; ++i) {\r\n const bubble = group[i].bubble;\r\n bubble.classList.remove('is-group-last', 'is-group-first');\r\n //this.setClipIfNeeded(bubble, true);\r\n }\r\n \r\n const last = group[group.length - 1].bubble;\r\n last.classList.remove('is-group-first');\r\n last.classList.add('is-group-last');\r\n //this.setClipIfNeeded(last);\r\n //}));\r\n }\r\n\r\n updateGroupByMessageId(mid: number) {\r\n const details = this.bubbles.find(g => g.mid === mid);\r\n if(details) {\r\n this.updateGroup(details.group);\r\n }\r\n }\r\n \r\n cleanup() {\r\n this.bubbles = [];\r\n this.groups = [];\r\n this.detailsMap.clear();\r\n /* for(let value of this.updateRAFs.values()) {\r\n window.cancelAnimationFrame(value);\r\n }\r\n this.updateRAFs.clear(); */\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { PopupOptions } from \".\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport InputField from \"../inputField\";\r\n\r\nexport default class PopupDatePicker extends PopupElement {\r\n protected controlsDiv: HTMLElement;\r\n protected monthTitle: HTMLElement;\r\n protected prevBtn: HTMLElement;\r\n protected nextBtn: HTMLElement;\r\n\r\n protected monthsContainer: HTMLElement;\r\n protected month: HTMLElement;\r\n\r\n protected minMonth: Date;\r\n protected maxMonth: Date;\r\n protected minDate: Date;\r\n protected maxDate: Date;\r\n protected selectedDate: Date;\r\n protected selectedMonth: Date;\r\n protected selectedEl: HTMLElement;\r\n\r\n protected timeDiv: HTMLDivElement;\r\n protected hoursInputField: InputField;\r\n protected minutesInputField: InputField;\r\n\r\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\r\n noButtons: true, \r\n noTitle: true, \r\n minDate: Date,\r\n maxDate: Date\r\n withTime: true,\r\n showOverflowMonths: true\r\n }> & PopupOptions = {}) {\r\n super('popup-date-picker', options.noButtons ? [] : [{\r\n langKey: 'JumpToDate',\r\n callback: () => {\r\n if(this.onPick) {\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n }\r\n }, {\r\n langKey: 'Cancel',\r\n isCancel: true\r\n }], {body: true, overlayClosable: true, ...options});\r\n\r\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\r\n\r\n if(initDate < this.minDate) {\r\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\r\n }\r\n\r\n // Controls\r\n this.controlsDiv = document.createElement('div');\r\n this.controlsDiv.classList.add('date-picker-controls');\r\n\r\n this.prevBtn = document.createElement('button');\r\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\r\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.nextBtn = document.createElement('button');\r\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\r\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.monthTitle = document.createElement('div');\r\n this.monthTitle.classList.add('date-picker-month-title');\r\n\r\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\r\n\r\n // Month\r\n this.monthsContainer = document.createElement('div');\r\n this.monthsContainer.classList.add('date-picker-months');\r\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.controlsDiv, this.monthsContainer);\r\n\r\n // Time inputs\r\n if(options.withTime) {\r\n this.timeDiv = document.createElement('div');\r\n this.timeDiv.classList.add('date-picker-time');\r\n\r\n const delimiter = document.createElement('div');\r\n delimiter.classList.add('date-picker-time-delimiter');\r\n delimiter.append(':');\r\n\r\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\r\n const maxString = '' + max;\r\n this.listenerSetter.add(inputField.input)('input', (e) => {\r\n let value = inputField.value.replace(/\\D/g, '');\r\n if(value.length > 2) {\r\n value = value.slice(0, 2);\r\n } else {\r\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\r\n if(value.length === 2 && onOverflow) {\r\n onOverflow(+value[1]);\r\n }\r\n\r\n value = '0' + value[0];\r\n }\r\n }\r\n\r\n inputField.setValueSilently(value);\r\n onInput(value.length);\r\n });\r\n };\r\n\r\n this.hoursInputField = new InputField({plainText: true});\r\n this.minutesInputField = new InputField({plainText: true});\r\n\r\n handleTimeInput(23, this.hoursInputField, (length) => {\r\n if(length === 2) {\r\n this.minutesInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n }, (number) => {\r\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\r\n });\r\n handleTimeInput(59, this.minutesInputField, (length) => {\r\n if(!length) {\r\n this.hoursInputField.input.focus();\r\n }\r\n\r\n this.setTimeTitle();\r\n });\r\n\r\n this.selectedDate = initDate;\r\n\r\n initDate.setMinutes(initDate.getMinutes() + 10);\r\n \r\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\r\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\r\n\r\n initDate.setHours(0, 0, 0, 0);\r\n \r\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\r\n\r\n attachClickEvent(this.btnConfirm, () => {\r\n if(this.onPick) {\r\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\r\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\r\n }\r\n\r\n this.hide();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.body.append(this.timeDiv);\r\n\r\n this.prevBtn.classList.add('primary');\r\n this.nextBtn.classList.add('primary');\r\n }\r\n\r\n const popupCenterer = document.createElement('div');\r\n popupCenterer.classList.add('popup-centerer');\r\n popupCenterer.append(this.container);\r\n this.element.append(popupCenterer);\r\n\r\n //const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\r\n //this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\r\n initDate.setHours(0, 0, 0, 0);\r\n this.selectedDate = initDate;\r\n\r\n this.maxDate = options.maxDate || new Date();\r\n this.maxDate.setHours(0, 0, 0, 0);\r\n\r\n this.selectedMonth = new Date(this.selectedDate);\r\n this.selectedMonth.setDate(1);\r\n\r\n this.maxMonth = new Date(this.maxDate);\r\n this.maxMonth.setDate(1);\r\n\r\n this.minMonth = new Date(this.minDate);\r\n this.minMonth.setHours(0, 0, 0, 0);\r\n this.minMonth.setDate(1);\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.noTitle) {\r\n this.setTitle = () => {};\r\n }\r\n\r\n this.setTimeTitle();\r\n this.setTitle();\r\n this.setMonth();\r\n }\r\n\r\n onPrevClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\r\n this.prevBtn.setAttribute('disabled', 'true');\r\n }\r\n \r\n this.nextBtn.removeAttribute('disabled');\r\n };\r\n\r\n onNextClick = (e: MouseEvent) => {\r\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\r\n this.setMonth();\r\n\r\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\r\n this.nextBtn.setAttribute('disabled', 'true');\r\n }\r\n\r\n this.prevBtn.removeAttribute('disabled');\r\n };\r\n\r\n onDateClick = (e: MouseEvent) => {\r\n //cancelEvent(e);\r\n const target = e.target as HTMLElement;\r\n\r\n if(!target.dataset.timestamp) return;\r\n\r\n if(this.selectedEl) {\r\n if(this.selectedEl === target) return;\r\n this.selectedEl.classList.remove('active');\r\n }\r\n\r\n this.selectedEl = target;\r\n \r\n target.classList.add('active');\r\n const timestamp = +target.dataset.timestamp;\r\n\r\n this.selectedDate = new Date(timestamp);\r\n\r\n this.setTitle();\r\n this.setTimeTitle();\r\n };\r\n\r\n public setTimeTitle() {\r\n if(this.btnConfirm && this.selectedDate) {\r\n let key: LangPackKey, args: any[] = [];\r\n const date = new Date();\r\n date.setHours(0, 0, 0, 0);\r\n\r\n const timeOptions: Intl.DateTimeFormatOptions = {\r\n minute: '2-digit',\r\n hour: '2-digit'\r\n };\r\n \r\n const sendDate = new Date(this.selectedDate.getTime());\r\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\r\n\r\n if(this.selectedDate.getTime() === date.getTime()) {\r\n key = 'Schedule.SendToday';\r\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\r\n dayStr = 'Tomorrow';\r\n } */ else {\r\n key = 'Schedule.SendDate';\r\n\r\n const dateOptions: Intl.DateTimeFormatOptions = {\r\n month: 'short',\r\n day: 'numeric'\r\n };\r\n\r\n if(sendDate.getFullYear() !== date.getFullYear()) {\r\n dateOptions.year = 'numeric';\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: dateOptions\r\n }).element);\r\n }\r\n\r\n args.push(new I18n.IntlDateElement({\r\n date: sendDate,\r\n options: timeOptions\r\n }).element);\r\n\r\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\r\n }\r\n }\r\n\r\n public setTitle() {\r\n //const splitted = this.selectedDate.toString().split(' ', 3);\r\n //this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\r\n this.title.textContent = '';\r\n this.title.append(new I18n.IntlDateElement({\r\n date: this.selectedDate,\r\n options: {\r\n day: 'numeric',\r\n month: 'long',\r\n weekday: 'short'\r\n }\r\n }).element);\r\n }\r\n\r\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\r\n const el = document.createElement('button');\r\n el.classList.add('btn-icon', 'date-picker-month-date');\r\n\r\n if(disabled) {\r\n el.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(innerText) {\r\n el.append(innerText);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n public setMonth() {\r\n const firstDate = new Date(this.selectedMonth);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\r\n };\r\n\r\n this.monthTitle.textContent = '';\r\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\r\n //this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\r\n\r\n if(this.month) {\r\n this.month.remove();\r\n }\r\n\r\n this.month = document.createElement('div');\r\n this.month.classList.add('date-picker-month');\r\n\r\n const weekStartDate = new Date();\r\n const day = weekStartDate.getDay();\r\n if(day !== 1) {\r\n weekStartDate.setHours(-24 * (day - 1)); \r\n }\r\n\r\n for(let i = 0; i < 7; ++i) {\r\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\r\n el.classList.remove('date-picker-month-date');\r\n el.classList.add('date-picker-month-day');\r\n this.month.append(el);\r\n weekStartDate.setDate(weekStartDate.getDate() + 1);\r\n }\r\n\r\n // 0 - sunday\r\n let dayIndex = firstDate.getDay() - 1;\r\n if(dayIndex === -1) dayIndex = 7 - 1;\r\n\r\n const clonedDate = new Date(firstDate.getTime());\r\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\r\n\r\n // Padding first week\r\n for(let i = 0; i < dayIndex; ++i) {\r\n if(this.options.showOverflowMonths) {\r\n clonedDate.setDate(clonedDate.getDate() + 1);\r\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\r\n } else {\r\n this.month.append(this.renderElement(true));\r\n }\r\n }\r\n\r\n do {\r\n const date = firstDate.getDate();\r\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\r\n el.dataset.timestamp = '' + firstDate.getTime();\r\n\r\n if(firstDate.getTime() === this.selectedDate.getTime()) {\r\n this.selectedEl = el;\r\n el.classList.add('active');\r\n }\r\n\r\n this.month.append(el);\r\n\r\n firstDate.setDate(date + 1);\r\n } while(firstDate.getDate() !== 1);\r\n\r\n const remainder = this.month.childElementCount % 7;\r\n if(this.options.showOverflowMonths && remainder) {\r\n for(let i = remainder; i < 7; ++i) {\r\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\r\n firstDate.setDate(firstDate.getDate() + 1);\r\n }\r\n }\r\n\r\n const lines = Math.ceil(this.month.childElementCount / 7);\r\n this.container.dataset.lines = '' + lines;\r\n\r\n this.monthsContainer.append(this.month);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default class StickyIntersector {\r\n private headersObserver: IntersectionObserver;\r\n private elementsObserver: IntersectionObserver;\r\n\r\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\r\n this.observeHeaders();\r\n this.observeElements();\r\n }\r\n\r\n /**\r\n * Sets up an intersection observer to notify when elements with the class\r\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\r\n * @param {!Element} container\r\n */\r\n private observeHeaders() {\r\n this.headersObserver = new IntersectionObserver((entries) => {\r\n for(const entry of entries) {\r\n const targetInfo = entry.boundingClientRect;\r\n const stickyTarget = entry.target.parentElement;\r\n const rootBoundsInfo = entry.rootBounds;\r\n \r\n // Started sticking.\r\n if(targetInfo.bottom < rootBoundsInfo.top) {\r\n this.handler(true, stickyTarget);\r\n }\r\n \r\n // Stopped sticking.\r\n if(targetInfo.bottom >= rootBoundsInfo.top &&\r\n targetInfo.bottom < rootBoundsInfo.bottom) {\r\n this.handler(false, stickyTarget);\r\n }\r\n }\r\n }, {threshold: 0, root: this.container});\r\n }\r\n \r\n private observeElements() {\r\n this.elementsObserver = new IntersectionObserver((entries) => {\r\n let entry = entries.filter(entry => entry.boundingClientRect.top < 0).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\r\n if(!entry) return;\r\n let container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\r\n this.handler(true, container as HTMLElement);\r\n }, {root: this.container});\r\n }\r\n\r\n /**\r\n * @param {!Element} container\r\n * @param {string} className\r\n */\r\n private addSentinel(container: HTMLElement, className: string) {\r\n const sentinel = document.createElement('div');\r\n sentinel.classList.add('sticky_sentinel', className);\r\n return container.appendChild(sentinel);\r\n }\r\n\r\n /**\r\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\r\n * Note: the elements should be children of `container`.\r\n * @param {!Element} container\r\n */\r\n public observeStickyHeaderChanges(element: HTMLElement) {\r\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\r\n this.headersObserver.observe(headerSentinel);\r\n\r\n this.elementsObserver.observe(element);\r\n }\r\n\r\n public disconnect() {\r\n this.headersObserver.disconnect();\r\n this.elementsObserver.disconnect();\r\n }\r\n\r\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\r\n this.elementsObserver.unobserve(element);\r\n this.headersObserver.unobserve(headerSentinel);\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { Message } from \"../../layer\";\r\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\r\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\r\n\r\nconst TAG_NAME = 'replies-element';\r\n\r\nrootScope.addEventListener('replies_updated', (e) => {\r\n const message = e;\r\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach(element => {\r\n element.message = message;\r\n element.render();\r\n });\r\n});\r\n\r\nexport default class RepliesElement extends HTMLElement {\r\n public message: Message.message;\r\n public type: 'footer' | 'beside';\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n \r\n private updated = false;\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n public init() {\r\n this.render();\r\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\r\n this.classList.add('replies', 'replies-' + this.type);\r\n }\r\n\r\n public render() {\r\n const replies = this.message.replies;\r\n\r\n /* if(this.firstChild) {\r\n this.innerHTML = '';\r\n } */\r\n\r\n if(this.type === 'footer') {\r\n let leftPart: HTMLElement;\r\n if(this.firstElementChild) {\r\n leftPart = this.firstElementChild as HTMLElement;\r\n }\r\n\r\n if(replies?.recent_repliers) {\r\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\r\n this.innerHTML = '';\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('div');\r\n leftPart.classList.add('replies-footer-avatars');\r\n }\r\n\r\n replies.recent_repliers.slice().reverse().forEach((peer, idx) => {\r\n let avatarElem = leftPart.children[idx] as AvatarElement;\r\n if(!avatarElem) {\r\n avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-30');\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n \r\n if(this.loadPromises) {\r\n avatarElem.loadPromises = this.loadPromises;\r\n }\r\n }\r\n \r\n avatarElem.setAttribute('peer', '' + appPeersManager.getPeerId(peer));\r\n \r\n if(!avatarElem.parentNode) {\r\n leftPart.append(avatarElem);\r\n }\r\n });\r\n\r\n // if were 3 and became 2\r\n (Array.from(leftPart.children) as HTMLElement[]).slice(replies.recent_repliers.length).forEach(el => el.remove());\r\n } else {\r\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\r\n leftPart.remove();\r\n leftPart = null;\r\n }\r\n\r\n if(!leftPart) {\r\n leftPart = document.createElement('span');\r\n leftPart.classList.add('tgico-comments');\r\n }\r\n }\r\n\r\n if(!leftPart.parentElement) {\r\n this.append(leftPart);\r\n }\r\n \r\n let text: HTMLElement;\r\n if(replies) {\r\n if(replies.replies) {\r\n text = i18n('Comments', [replies.replies]);\r\n } else {\r\n text = i18n('LeaveAComment');\r\n }\r\n } else {\r\n text = i18n('ViewInChat');\r\n }\r\n\r\n if(replies) {\r\n const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\r\n let isUnread = false;\r\n if(replies.replies) {\r\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\r\n isUnread = replies.read_max_id < replies.max_id;\r\n } else {\r\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\r\n }\r\n }\r\n this.classList.toggle('is-unread', isUnread);\r\n }\r\n\r\n let textSpan = this.children[1] as HTMLElement;\r\n if(!textSpan) {\r\n textSpan = document.createElement('span');\r\n textSpan.classList.add('replies-footer-text');\r\n\r\n const iconSpan = document.createElement('span');\r\n iconSpan.classList.add('tgico-next');\r\n\r\n const rippleContainer = document.createElement('div');\r\n ripple(rippleContainer);\r\n\r\n this.append(textSpan, iconSpan, rippleContainer);\r\n }\r\n\r\n replaceContent(textSpan, text);\r\n } else {\r\n this.classList.add('bubble-beside-button');\r\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\r\n }\r\n\r\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\r\n appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\r\n appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\r\n this.updated = true;\r\n }\r\n\r\n if(this.loadPromises) {\r\n this.loadPromises = undefined;\r\n }\r\n }\r\n}\r\n\r\ncustomElements.define(TAG_NAME, RepliesElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { formatTime, getFullDate } from \"../../helpers/date\";\nimport { formatNumber } from \"../../helpers/number\";\nimport { Message } from \"../../layer\";\nimport { i18n, _i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport PeerTitle from \"../peerTitle\";\nimport { wrapReply } from \"../wrappers\";\nimport Chat from \"./chat\";\nimport RepliesElement from \"./replies\";\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (chat: Chat, message: Message.message | Message.messageService, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => {\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n \n let editedSpan: HTMLElement, sponsoredSpan: HTMLElement;\n \n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n \n let time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n \n bubble.classList.add('channel-post');\n \n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n \n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n \n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + NBSP;\n args.push(span);\n }\n }\n \n if(message.edit_date && chat.type !== 'scheduled' && !message.pFlags.edit_hide) {\n bubble.classList.add('is-edited');\n \n args.unshift(editedSpan = makeEdited());\n }\n \n if(chat.type !== 'pinned' && message.pFlags.pinned) {\n bubble.classList.add('is-pinned');\n \n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n \n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '')\n + (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n clonedArgs = clonedArgs.map(a => a instanceof HTMLElement && !a.classList.contains('i18n') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n messageDiv.append(timeSpan);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueueIntersector\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = ({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n if(currentReplyDiv) {\n currentReplyDiv.remove();\n }\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? chat.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n let originalMessage = chat.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n \n /////////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n \n // need to download separately\n if(originalMessage._ === 'messageEmpty') {\n //////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n chat.appMessagesManager.wrapSingleMessage(replyToPeerId, message.reply_to_mid);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n \n originalPeerTitle = i18n('Loading');\n } else {\n originalPeerTitle = new PeerTitle({\n peerId: originalMessage.fromId || originalMessage.fwdFromId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const wrapped = wrapReply(originalPeerTitle, undefined, originalMessage);\n if(currentReplyDiv) {\n currentReplyDiv.replaceWith(wrapped);\n } else {\n bubbleContainer.append(wrapped);\n }\n //bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\r\n //return null;\r\n const rect = container.getBoundingClientRect();\r\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\r\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\r\n return document.elementFromPoint(x, y) as any;\r\n};\r\n\r\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function reflowScrollableElement(element: HTMLElement) {\r\n element.style.display = 'none';\r\n void element.offsetLeft; // reflow\r\n element.style.display = '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../config/app\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { validateInitObject } from \"../../helpers/object\";\nimport I18n from \"../langPack\";\nimport { isObject } from \"../mtproto/bin_utils\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport stateStorage from \"../stateStorage\";\nimport appStateManager from \"./appStateManager\";\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 36;\n\nexport class AppEmojiManager {\n private static POPULAR_EMOJI = [\"😂\", \"😘\", \"❤️\", \"😍\", \"😊\", \"😁\", \"👍\", \"☺️\", \"😔\", \"😄\", \"😭\", \"💋\", \"😒\", \"😳\", \"😜\", \"🙈\", \"😉\", \"😃\", \"😢\", \"😝\", \"😱\", \"😡\", \"😏\", \"😞\", \"😅\", \"😚\", \"🙊\", \"😌\", \"😀\", \"😋\", \"😆\", \"👌\", \"😐\", \"😕\"];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: string[];\n private getRecentEmojisPromise: Promise;\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then(popEmojis => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then(recentEmojis => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n \n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(I18n.lastRequestedLangCode !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(I18n.lastRequestedLangCode));\n }\n\n if(!this.recent) {\n promises.push(this.getRecentEmojis());\n }\n\n return Promise.all(promises);\n }\n\n public indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n \n //const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n //console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis() {\n if(this.getRecentEmojisPromise) return this.getRecentEmojisPromise;\n return this.getRecentEmojisPromise = appStateManager.getState().then(state => {\n return this.recent = Array.isArray(state.recentEmoji) ? state.recentEmoji : [];\n });\n }\n\n public pushRecentEmoji(emoji: string) {\n emoji = RichTextProcessor.fixEmoji(emoji);\n this.getRecentEmojis().then(recent => {\n indexOfAndSplice(recent, emoji);\n recent.unshift(emoji);\n if(recent.length > RECENT_MAX_LENGTH) {\n recent.length = RECENT_MAX_LENGTH;\n }\n\n appStateManager.pushToState('recentEmoji', recent);\n rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n}\n\nconst appEmojiManager = new AppEmojiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appEmojiManager = appEmojiManager);\nexport default appEmojiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab } from \"..\";\nimport { cancelEvent } from \"../../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\nimport { fastRaf } from \"../../../helpers/schedulers\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport appEmojiManager from \"../../../lib/appManagers/appEmojiManager\";\nimport appImManager from \"../../../lib/appManagers/appImManager\";\nimport Config from \"../../../lib/config\";\nimport { i18n, LangPackKey } from \"../../../lib/langPack\";\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\nimport rootScope from \"../../../lib/rootScope\";\nimport { emojiFromCodePoints } from \"../../../vendor/emoji\";\nimport { putPreloader } from \"../../misc\";\nimport Scrollable from \"../../scrollable\";\nimport StickyIntersector from \"../../stickyIntersector\";\nimport IS_EMOJI_SUPPORTED from \"../../../environment/emojiSupport\";\nimport { IS_TOUCH_SUPPORTED } from \"../../../environment/touchSupport\";\nimport blurActiveElement from \"../../../helpers/dom/blurActiveElement\";\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container: HTMLElement, prepend = false, unify = false) {\n //const emoji = details.unified;\n //const emoji = (details.unified as string).split('-')\n //.reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: string;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = RichTextProcessor.wrapSingleEmoji(emoji);\n } else {\n emoji = RichTextProcessor.fixEmoji(emoji);\n kek = RichTextProcessor.wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n //console.log(kek);\n\n spanEmoji.innerHTML = kek;\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild && !IS_EMOJI_SUPPORTED) {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n \n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n //spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n //spanEmoji.setAttribute('emoji', emoji);\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n}\n\nexport function getEmojiFromElement(element: HTMLElement) {\n if(!findUpClassName(element, 'super-emoji')) return '';\n\n if(element.nodeType === 3) return element.nodeValue;\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n \n return element.getAttribute('alt') || element.innerText;\n}\n\nexport default class EmojiTab implements EmoticonsTab {\n private content: HTMLElement;\n\n private recentItemsDiv: HTMLElement;\n\n private scroll: Scrollable;\n private stickyIntersector: StickyIntersector;\n private menu: HTMLElement;\n\n private closeScrollTop = 0;\n private setMenuActive: (id: number) => boolean;\n\n init() {\n this.content = document.getElementById('content-emoji') as HTMLDivElement;\n\n const categories: LangPackKey[] = [\n 'Emoji.SmilesAndPeople', \n 'Emoji.AnimalsAndNature', \n 'Emoji.FoodAndDrink', \n 'Emoji.TravelAndPlaces', \n 'Emoji.ActivityAndSport', \n 'Emoji.Objects', \n /* 'Emoji.Symbols', */\n 'Emoji.Flags', \n 'Skin Tones' as any\n ];\n const divs: {\n [category in LangPackKey]?: HTMLDivElement\n } = {};\n\n const sorted: Map = new Map([\n [\n 'Emoji.Recent',\n []\n ]\n ]);\n\n for(const emoji in Config.Emoji) {\n const details = Config.Emoji[emoji];\n const i = '' + details;\n const category = categories[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n \n s[+i.slice(1) || 0] = emoji;\n }\n\n //console.log('emoticons sorted:', sorted);\n\n //Object.keys(sorted).forEach(c => sorted[c].sort((a, b) => a - b));\n\n sorted.delete(categories.pop());\n\n //console.time('emojiParse');\n sorted.forEach((emojis, category) => {\n const div = document.createElement('div');\n div.classList.add('emoji-category');\n\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('category-title');\n titleDiv.append(i18n(category));\n\n const itemsDiv = document.createElement('div');\n itemsDiv.classList.add('super-emojis');\n\n div.append(titleDiv, itemsDiv);\n\n emojis.forEach(unified => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n let emoji = emojiFromCodePoints(unified);\n //if(emoji.includes('🕵')) {\n //console.log('toCodePoints', toCodePoints(emoji));\n //emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n //debugger;\n //}\n\n appendEmoji(emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, itemsDiv, false/* , false */);\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n\n divs[category] = div;\n });\n\n //console.timeEnd('emojiParse');\n\n const menu = this.menu = this.content.previousElementSibling as HTMLElement;\n const emojiScroll = this.scroll = new Scrollable(this.content, 'EMOJI');\n\n //emojiScroll.setVirtualContainer(emojiScroll.container);\n\n const preloader = putPreloader(this.content, true);\n\n Promise.all([\n pause(200),\n appEmojiManager.getRecentEmojis().then(recent => {\n const hasRecent = !!recent.length;\n const activeId = hasRecent ? 0 : 1;\n this.menu.children[0].classList.toggle('hide', !hasRecent);\n this.menu.children[activeId].classList.add('active');\n const m = EmoticonsDropdown.menuOnClick(menu, emojiScroll, undefined, activeId);\n this.stickyIntersector = m.stickyIntersector;\n this.setMenuActive = m.setActive;\n return recent;\n })\n ]).then(([_, recent]) => {\n preloader.remove();\n\n this.recentItemsDiv = divs['Emoji.Recent'].querySelector('.super-emojis');\n for(const emoji of recent) {\n appendEmoji(emoji, this.recentItemsDiv);\n }\n\n this.recentItemsDiv.parentElement.classList.toggle('hide', !this.recentItemsDiv.childElementCount);\n\n categories.unshift('Emoji.Recent');\n categories.map(category => {\n const div = divs[category];\n \n if(!div) {\n console.error('no div by category:', category);\n }\n \n emojiScroll.container.append(div);\n this.stickyIntersector.observeStickyHeaderChanges(div);\n return div;\n });\n });\n\n this.content.addEventListener('click', this.onContentClick);\n this.init = null;\n\n rootScope.addEventListener('emoji_recent', (emoji) => {\n const children = Array.from(this.recentItemsDiv.children) as HTMLElement[];\n for(let i = 0, length = children.length; i < length; ++i) {\n const el = children[i];\n const _emoji = RichTextProcessor.fixEmoji(getEmojiFromElement(el));\n if(emoji === _emoji) {\n if(i === 0) {\n return;\n }\n\n el.remove();\n }\n }\n\n appendEmoji(emoji, this.recentItemsDiv, true);\n this.recentItemsDiv.parentElement.classList.remove('hide');\n this.menu.children[0].classList.remove('hide');\n\n if(!this.closeScrollTop) {\n this.setMenuActive(0);\n }\n });\n\n emoticonsDropdown.addEventListener('close', () => {\n this.closeScrollTop = this.scroll.scrollTop;\n });\n }\n\n onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n \n const emoji = getEmojiFromElement(e.target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n appImManager.chat.input.onEmojiSelected(emoji, false);\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n onClose() {\n\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDocsManager, {MyDocument} from \"../lib/appManagers/appDocsManager\";\r\nimport { wrapVideo } from \"./wrappers\";\r\nimport { LazyLoadQueueRepeat2 } from \"./lazyLoadQueue\";\r\nimport animationIntersector from \"./animationIntersector\";\r\nimport Scrollable from \"./scrollable\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport renderImageFromUrl from \"../helpers/dom/renderImageFromUrl\";\r\nimport calcImageInBox from \"../helpers/calcImageInBox\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\n\r\nconst width = 400;\r\nconst maxSingleWidth = width - 100;\r\nconst height = 100;\r\n\r\nexport default class GifsMasonry {\r\n public lazyLoadQueue: LazyLoadQueueRepeat2;\r\n private scrollPromise: CancellablePromise = Promise.resolve();\r\n private timeout: number = 0;\r\n\r\n constructor(private element: HTMLElement, private group: string, private scrollable: Scrollable, attach = true) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, (target, visible) => {\r\n if(visible) {\r\n this.processVisibleDiv(target);\r\n } else {\r\n this.processInvisibleDiv(target);\r\n }\r\n });\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = animationIntersector.byGroups[group];\r\n\r\n if(players) {\r\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter(p => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\r\n }\r\n }, .25e3); */\r\n\r\n if(attach) {\r\n this.attach();\r\n }\r\n }\r\n \r\n private onScroll = () => {\r\n if(this.timeout) {\r\n clearTimeout(this.timeout);\r\n } else {\r\n this.scrollPromise = deferredPromise();\r\n //animationIntersector.checkAnimations(true, group);\r\n }\r\n\r\n this.timeout = window.setTimeout(() => {\r\n this.timeout = 0;\r\n this.scrollPromise.resolve();\r\n //animationIntersector.checkAnimations(false, group);\r\n }, 150);\r\n };\r\n\r\n public attach() {\r\n this.scrollable.container.addEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public detach() {\r\n this.clear();\r\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n private processVisibleDiv(div: HTMLElement) {\r\n const video = div.querySelector('video');\r\n if(video) {\r\n return;\r\n }\r\n\r\n //console.log('processVisibleDiv');\r\n\r\n const load = () => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n const promise = this.scrollPromise.then(() => {\r\n const res = wrapVideo({\r\n doc,\r\n container: div as HTMLDivElement,\r\n lazyLoadQueue: null,\r\n //lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n group: this.group,\r\n noInfo: true,\r\n });\r\n \r\n const promise = res.loadPromise;\r\n promise.finally(() => {\r\n const video = div.querySelector('video');\r\n\r\n div.style.opacity = '';\r\n const img = div.querySelector('img');\r\n img && img.classList.add('hide');\r\n\r\n if(video && !video.parentElement) {\r\n setTimeout(() => {\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }, 0);\r\n }\r\n\r\n //clearTimeout(timeout);\r\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\r\n this.processInvisibleDiv(div);\r\n }\r\n });\r\n\r\n return promise;\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n //return load();\r\n \r\n this.lazyLoadQueue.push({div, load});\r\n }\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n return this.scrollPromise.then(async() => {\r\n //return;\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n\r\n const video = div.querySelector('video');\r\n const img = div.querySelector('img');\r\n \r\n if(img) {\r\n img && img.classList.remove('hide');\r\n \r\n await doubleRaf();\r\n }\r\n\r\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\r\n return;\r\n }\r\n \r\n if(video) {\r\n video.remove();\r\n video.src = '';\r\n video.load();\r\n const animations = animationIntersector.getAnimations(video);\r\n animations.forEach(item => {\r\n animationIntersector.checkAnimation(item, true, true);\r\n });\r\n }\r\n });\r\n };\r\n\r\n public add(doc: MyDocument, appendTo = this.element) {\r\n let gifWidth = doc.w;\r\n let gifHeight = doc.h;\r\n if(gifHeight < height) {\r\n gifWidth = height / gifHeight * gifWidth;\r\n gifHeight = height;\r\n }\r\n\r\n const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\r\n const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\r\n\r\n /* wastedWidth += w;\r\n\r\n if(wastedWidth === width || h < height) {\r\n wastedWidth = 0;\r\n console.log('completed line', i, line);\r\n line = [];\r\n continue;\r\n }\r\n\r\n line.push(gif); */\r\n\r\n //console.log('gif:', gif, w, h);\r\n\r\n const div = document.createElement('div');\r\n div.classList.add('gif', 'fade-in-transition');\r\n div.style.width = size.width + 'px';\r\n div.style.opacity = '0';\r\n //div.style.height = h + 'px';\r\n div.dataset.docId = '' + doc.id;\r\n\r\n appendTo.append(div);\r\n\r\n //this.lazyLoadQueue.observe({div, load: this.processVisibleDiv});\r\n this.lazyLoadQueue.observe(div);\r\n\r\n //let preloader = new ProgressivePreloader(div);\r\n\r\n const gotThumb = appDocsManager.getThumb(doc, false);\r\n\r\n const willBeAPoster = !!gotThumb;\r\n let img: HTMLImageElement;\r\n if(willBeAPoster) {\r\n img = new Image();\r\n img.classList.add('media-poster');\r\n\r\n if(!gotThumb.cacheContext.url) {\r\n gotThumb.promise.then(() => {\r\n img.src = gotThumb.cacheContext.url;\r\n });\r\n }\r\n }\r\n\r\n const afterRender = () => {\r\n if(img) {\r\n div.append(img);\r\n div.style.opacity = '';\r\n }\r\n };\r\n\r\n (gotThumb?.cacheContext?.url ? renderImageFromUrl(img, gotThumb.cacheContext.url, afterRender) : afterRender());\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP } from \"..\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport Scrollable from \"../../scrollable\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport apiManager from \"../../../lib/mtproto/mtprotoworker\";\r\nimport appDocsManager, {MyDocument} from \"../../../lib/appManagers/appDocsManager\";\r\n\r\nexport default class GifsTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n\r\n init() {\r\n this.content = document.getElementById('content-gifs');\r\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\r\n gifsContainer.addEventListener('click', EmoticonsDropdown.onMediaClick);\r\n\r\n const scroll = new Scrollable(this.content, 'GIFS');\r\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\r\n const preloader = putPreloader(this.content, true);\r\n\r\n apiManager.invokeApi('messages.getSavedGifs', {hash: '0'}).then((res) => {\r\n //console.log('getSavedGifs res:', res);\r\n\r\n if(res._ === 'messages.savedGifs') {\r\n res.gifs.forEach((doc, idx) => {\r\n res.gifs[idx] = doc = appDocsManager.saveDoc(doc);\r\n //if(doc._ === 'documentEmpty') return;\r\n masonry.add(doc as MyDocument);\r\n });\r\n }\r\n\r\n preloader.remove();\r\n });\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\r\n\r\n this.init = null;\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport emoticonsDropdown, { EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab } from \"..\";\r\nimport findUpAttribute from \"../../../helpers/dom/findUpAttribute\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport { MessagesAllStickers, StickerSet } from \"../../../layer\";\r\nimport appDocsManager, { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport rootScope from \"../../../lib/rootScope\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport LazyLoadQueue, { LazyLoadQueueRepeat } from \"../../lazyLoadQueue\";\r\nimport { putPreloader } from \"../../misc\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport Scrollable, { ScrollableX } from \"../../scrollable\";\r\nimport StickyIntersector from \"../../stickyIntersector\";\r\nimport { wrapSticker, wrapStickerSetThumb } from \"../../wrappers\";\r\n\r\nexport class SuperStickerRenderer {\r\n public lazyLoadQueue: LazyLoadQueueRepeat;\r\n private animatedDivs: Set = new Set();\r\n\r\n constructor(private regularLazyLoadQueue: LazyLoadQueue, private group: string) {\r\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, (target, visible) => {\r\n if(!visible) {\r\n this.processInvisibleDiv(target as HTMLDivElement);\r\n }\r\n });\r\n }\r\n\r\n public clear() {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n public renderSticker(doc: MyDocument, div?: HTMLDivElement, loadPromises?: Promise[]) {\r\n if(!div) {\r\n div = document.createElement('div');\r\n div.classList.add('grid-item', 'super-sticker');\r\n\r\n if(doc.sticker === 2) {\r\n this.observeAnimatedDiv(div);\r\n }\r\n }\r\n\r\n // * This will wrap only a thumb\r\n wrapSticker({\r\n doc, \r\n div,\r\n lazyLoadQueue: this.regularLazyLoadQueue, \r\n group: this.group, \r\n onlyThumb: doc.sticker === 2,\r\n loadPromises\r\n });\r\n\r\n return div;\r\n }\r\n\r\n public observeAnimatedDiv(div: HTMLDivElement) {\r\n this.animatedDivs.add(div);\r\n\r\n this.lazyLoadQueue.observe({\r\n div, \r\n load: this.processVisibleDiv\r\n });\r\n }\r\n\r\n private checkAnimationContainer = (div: HTMLElement, visible: boolean) => {\r\n //console.error('checkAnimationContainer', div, visible);\r\n const players = animationIntersector.getAnimations(div);\r\n players.forEach(player => {\r\n if(!visible) {\r\n animationIntersector.checkAnimation(player, true, true);\r\n } else {\r\n animationIntersector.checkAnimation(player, false);\r\n }\r\n });\r\n };\r\n\r\n private processVisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n \r\n const size = mediaSizes.active.esgSticker.width;\r\n\r\n //console.log('processVisibleDiv:', div);\r\n\r\n const promise = wrapSticker({\r\n doc, \r\n div: div as HTMLDivElement,\r\n width: size,\r\n height: size,\r\n lazyLoadQueue: null, \r\n group: this.group, \r\n onlyThumb: false,\r\n play: true,\r\n loop: true\r\n });\r\n\r\n promise.then(() => {\r\n //clearTimeout(timeout);\r\n this.checkAnimationContainer(div, this.lazyLoadQueue.intersector.isVisible(div));\r\n });\r\n\r\n /* let timeout = window.setTimeout(() => {\r\n console.error('processVisibleDiv timeout', div, doc);\r\n }, 1e3); */\r\n\r\n return promise;\r\n };\r\n\r\n public processInvisibleDiv = (div: HTMLElement) => {\r\n const docId = div.dataset.docId;\r\n const doc = appDocsManager.getDoc(docId);\r\n\r\n //console.log('STICKER INvisible:', /* div, */docId);\r\n\r\n this.checkAnimationContainer(div, false);\r\n\r\n div.innerHTML = '';\r\n this.renderSticker(doc, div as HTMLDivElement);\r\n };\r\n}\r\n\r\nexport default class StickersTab implements EmoticonsTab {\r\n private content: HTMLElement;\r\n private stickersDiv: HTMLElement;\r\n\r\n private stickerSets: {[id: string]: {\r\n stickers: HTMLElement,\r\n tab: HTMLElement\r\n }} = {};\r\n\r\n private recentDiv: HTMLElement;\r\n private recentStickers: MyDocument[] = [];\r\n\r\n private scroll: Scrollable;\r\n\r\n private menu: HTMLElement;\r\n \r\n private mounted = false;\r\n\r\n private queueCategoryPush: {element: HTMLElement, prepend: boolean}[] = [];\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private superStickerRenderer: SuperStickerRenderer;\r\n\r\n categoryPush(categoryDiv: HTMLElement, categoryTitle: string = '', promise: Promise, prepend?: boolean) {\r\n //if((docs.length % 5) !== 0) categoryDiv.classList.add('not-full');\r\n\r\n const itemsDiv = document.createElement('div');\r\n itemsDiv.classList.add('category-items', 'super-stickers');\r\n\r\n const titleDiv = document.createElement('div');\r\n titleDiv.classList.add('category-title');\r\n\r\n if(categoryTitle) {\r\n titleDiv.innerHTML = categoryTitle;\r\n }\r\n\r\n categoryDiv.append(titleDiv, itemsDiv);\r\n\r\n this.stickyIntersector.observeStickyHeaderChanges(categoryDiv);\r\n\r\n this.queueCategoryPush.push({element: categoryDiv, prepend});\r\n\r\n promise.then(documents => {\r\n documents.forEach(doc => {\r\n //if(doc._ === 'documentEmpty') return;\r\n itemsDiv.append(this.superStickerRenderer.renderSticker(doc));\r\n });\r\n\r\n if(this.queueCategoryPush.length) {\r\n this.queueCategoryPush.forEach(({element, prepend}) => {\r\n if(prepend) {\r\n if(this.recentDiv.parentElement) {\r\n this.stickersDiv.prepend(element);\r\n this.stickersDiv.prepend(this.recentDiv);\r\n } else {\r\n this.stickersDiv.prepend(element);\r\n }\r\n } else this.stickersDiv.append(element);\r\n });\r\n\r\n this.queueCategoryPush.length = 0;\r\n }\r\n });\r\n\r\n return {titleDiv};\r\n }\r\n\r\n async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\r\n const categoryDiv = document.createElement('div');\r\n categoryDiv.classList.add('sticker-category');\r\n categoryDiv.dataset.id = '' + set.id;\r\n categoryDiv.dataset.access_hash = '' + set.access_hash;\r\n\r\n const button = document.createElement('button');\r\n button.classList.add('btn-icon', 'menu-horizontal-div-item');\r\n\r\n this.stickerSets[set.id] = {\r\n stickers: categoryDiv,\r\n tab: button\r\n };\r\n\r\n if(prepend) {\r\n this.menu.insertBefore(button, this.menu.firstElementChild.nextSibling);\r\n } else {\r\n this.menu.append(button);\r\n }\r\n\r\n //stickersScroll.append(categoryDiv);\r\n\r\n const promise = appStickersManager.getStickerSet(set);\r\n this.categoryPush(categoryDiv, RichTextProcessor.wrapEmojiText(set.title), promise.then(stickerSet => stickerSet.documents as MyDocument[]), prepend);\r\n const stickerSet = await promise;\r\n\r\n //console.log('got stickerSet', stickerSet, li);\r\n \r\n wrapStickerSetThumb({\r\n set,\r\n container: button,\r\n group: EMOTICONSSTICKERGROUP,\r\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\r\n width: 32,\r\n height: 32,\r\n autoplay: false\r\n });\r\n }\r\n\r\n init() {\r\n this.content = document.getElementById('content-stickers');\r\n //let stickersDiv = contentStickersDiv.querySelector('.os-content') as HTMLDivElement;\r\n\r\n this.recentDiv = document.createElement('div');\r\n this.recentDiv.classList.add('sticker-category', 'stickers-recent');\r\n\r\n let menuWrapper = this.content.previousElementSibling as HTMLDivElement;\r\n this.menu = menuWrapper.firstElementChild as HTMLUListElement;\r\n\r\n let menuScroll = new ScrollableX(menuWrapper);\r\n\r\n this.stickersDiv = document.createElement('div');\r\n this.stickersDiv.classList.add('stickers-categories');\r\n this.content.append(this.stickersDiv);\r\n\r\n /* stickersDiv.addEventListener('mouseover', (e) => {\r\n let target = e.target as HTMLElement;\r\n\r\n if(target.tagName === 'CANVAS') { // turn on sticker\r\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\r\n\r\n if(animation) {\r\n // @ts-ignore\r\n if(animation.currentFrame === animation.totalFrames - 1) {\r\n animation.goToAndPlay(0, true);\r\n } else {\r\n animation.play();\r\n }\r\n }\r\n }\r\n }); */\r\n\r\n rootScope.addEventListener('stickers_installed', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(!this.stickerSets[set.id] && this.mounted) {\r\n this.renderStickerSet(set, true);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('stickers_deleted', (e) => {\r\n const set: StickerSet.stickerSet = e;\r\n \r\n if(this.stickerSets[set.id] && this.mounted) {\r\n const elements = this.stickerSets[set.id];\r\n elements.stickers.remove();\r\n elements.tab.remove();\r\n delete this.stickerSets[set.id];\r\n }\r\n });\r\n\r\n this.stickersDiv.addEventListener('click', (e) => {\r\n const target = e.target as HTMLElement;\r\n if(findUpClassName(target, 'category-title')) {\r\n const el = findUpAttribute(target, 'data-id');\r\n new PopupStickers({id: el.dataset.id, access_hash: el.dataset.access_hash}).show();\r\n return;\r\n }\r\n\r\n EmoticonsDropdown.onMediaClick(e);\r\n });\r\n\r\n const setTyping = (cancel = false) => {\r\n rootScope.dispatchEvent('choosing_sticker', !cancel);\r\n };\r\n\r\n this.scroll = new Scrollable(this.content, 'STICKERS');\r\n this.scroll.setVirtualContainer(this.stickersDiv);\r\n this.scroll.onAdditionalScroll = () => {\r\n setTyping();\r\n };\r\n\r\n emoticonsDropdown.addEventListener('closed', () => {\r\n setTyping(true);\r\n });\r\n\r\n emoticonsDropdown.addEventListener('opened', () => {\r\n setTyping();\r\n });\r\n\r\n this.stickyIntersector = EmoticonsDropdown.menuOnClick(this.menu, this.scroll, menuScroll).stickyIntersector;\r\n\r\n const preloader = putPreloader(this.content, true);\r\n\r\n Promise.all([\r\n appStickersManager.getRecentStickers().then(stickers => {\r\n this.recentStickers = stickers.stickers.slice(0, 20) as MyDocument[];\r\n \r\n //stickersScroll.prepend(categoryDiv);\r\n\r\n this.stickerSets['recent'] = {\r\n stickers: this.recentDiv,\r\n tab: this.menu.firstElementChild as HTMLElement\r\n };\r\n\r\n preloader.remove();\r\n const {titleDiv} = this.categoryPush(this.recentDiv, '', Promise.resolve(this.recentStickers), true);\r\n titleDiv.append(i18n('Stickers.Recent'));\r\n }),\r\n\r\n appStickersManager.getAllStickers().then((res) => {\r\n preloader.remove();\r\n\r\n for(let set of (res as MessagesAllStickers.messagesAllStickers).sets) {\r\n this.renderStickerSet(set);\r\n }\r\n })\r\n ]).finally(() => {\r\n this.mounted = true;\r\n setTyping();\r\n });\r\n\r\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP);\r\n\r\n emoticonsDropdown.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue, this.superStickerRenderer.processInvisibleDiv);\r\n\r\n /* setInterval(() => {\r\n // @ts-ignore\r\n const players = Object.values(lottieLoader.players).filter(p => p.width === 80);\r\n \r\n console.log('STICKERS RENDERED IN PANEL:', players.length, players.filter(p => !p.paused).length, this.superStickerRenderer.lazyLoadQueue.intersector.getVisible().length);\r\n }, .25e3); */\r\n \r\n\r\n this.init = null;\r\n }\r\n\r\n pushRecentSticker(doc: MyDocument) {\r\n appStickersManager.pushRecentSticker(doc);\r\n \r\n if(!this.recentDiv?.parentElement) {\r\n return;\r\n }\r\n\r\n let div = this.recentDiv.querySelector(`[data-doc-id=\"${doc.id}\"]`);\r\n if(!div) {\r\n div = this.superStickerRenderer.renderSticker(doc);\r\n }\r\n\r\n const items = this.recentDiv.querySelector('.category-items');\r\n items.prepend(div);\r\n\r\n if(items.childElementCount > 20) {\r\n (Array.from(items.children) as HTMLElement[]).slice(20).forEach(el => el.remove());\r\n }\r\n }\r\n\r\n onClose() {\r\n\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { toast } from \"../../components/toast\";\r\nimport { BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessagesBotResults, ReplyMarkup } from \"../../layer\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\r\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\r\nimport appUsersManager, { MyTopPeer } from \"./appUsersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport rootScope from \"../rootScope\";\r\nimport appDraftsManager from \"./appDraftsManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport { insertInDescendSortedArray } from \"../../helpers/array\";\r\nimport appStateManager from \"./appStateManager\";\r\n\r\nexport class AppInlineBotsManager {\r\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\r\n private setHash: {\r\n [botId: UserId]: {\r\n peerId: PeerId, \r\n time: number\r\n }\r\n } = {};\r\n\r\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\r\n return geo._ === 'geoPoint' ? {\r\n _: 'inputGeoPoint',\r\n lat: geo.lat,\r\n long: geo.long,\r\n accuracy_radius: geo.accuracy_radius\r\n } : {\r\n _: 'inputGeoPointEmpty'\r\n };\r\n }\r\n\r\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\r\n return apiManagerProxy.invokeApi('messages.getInlineBotResults', {\r\n bot: appUsersManager.getUserInput(botId),\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n query,\r\n geo_point: geo ? this.getGeoInput(geo) : undefined,\r\n offset\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then(botResults => {\r\n const queryId = botResults.query_id;\r\n\r\n /* if(botResults.switch_pm) {\r\n botResults.switch_pm.rText = RichTextProcessor.wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\r\n } */\r\n \r\n botResults.results.forEach(result => {\r\n if(result._ === 'botInlineMediaResult') {\r\n if(result.document) {\r\n result.document = appDocsManager.saveDoc(result.document);\r\n }\r\n \r\n if(result.photo) {\r\n result.photo = appPhotosManager.savePhoto(result.photo);\r\n }\r\n }\r\n \r\n this.inlineResults[this.generateQId(queryId, result.id)] = result;\r\n });\r\n\r\n return botResults;\r\n });\r\n }\r\n\r\n public generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\r\n return queryId + '_' + resultId;\r\n }\r\n\r\n private pushPopularBot(botId: BotId) {\r\n appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\r\n const botPeerId = botId.toPeerId();\r\n const index = topPeers.findIndex(topPeer => topPeer.id === botPeerId);\r\n let topPeer: MyTopPeer;\r\n if(index !== -1) {\r\n topPeer = topPeers[index];\r\n } else {\r\n topPeer = {\r\n id: botPeerId,\r\n rating: 0\r\n };\r\n }\r\n\r\n ++topPeer.rating;\r\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\r\n\r\n appStateManager.setKeyValueToStorage('topPeersCache');\r\n \r\n // rootScope.$broadcast('inline_bots_popular')\r\n });\r\n }\r\n\r\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\r\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\r\n rootScope.dispatchEvent('history_focus', {peerId: botId.toPeerId()});\r\n return appMessagesManager.startBot(botId, undefined, startParam);\r\n }\r\n \r\n /*\r\n function resolveInlineMention (username) {\r\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\r\n if (peerId.isUser()) {\r\n var bot = AppUsersManager.getUser(peerId)\r\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\r\n var resolvedBot = {\r\n username: username,\r\n id: peerId,\r\n placeholder: bot.bot_inline_placeholder\r\n }\r\n if (bot.pFlags.bot_inline_geo &&\r\n GeoLocationManager.isAvailable()) {\r\n return checkGeoLocationAccess(peerId).then(function () {\r\n return GeoLocationManager.getPosition().then(function (coords) {\r\n resolvedBot.geo = coords\r\n return qSync.when(resolvedBot)\r\n })\r\n })['catch'](function () {\r\n return qSync.when(resolvedBot)\r\n })\r\n }\r\n return qSync.when(resolvedBot)\r\n }\r\n }\r\n return $q.reject()\r\n }, function (error) {\r\n error.handled = true\r\n return $q.reject(error)\r\n })\r\n }\r\n \r\n function regroupWrappedResults (results, rowW, rowH) {\r\n if (!results ||\r\n !results[0] ||\r\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\r\n return\r\n }\r\n var ratios = []\r\n angular.forEach(results, function (result) {\r\n var w\r\n var h, doc\r\n var photo\r\n if (result._ === 'botInlineMediaResult') {\r\n if (doc = result.document) {\r\n w = result.document.w\r\n h = result.document.h\r\n }\r\n else if (photo = result.photo) {\r\n var photoSize = (photo.sizes || [])[0]\r\n w = photoSize && photoSize.w\r\n h = photoSize && photoSize.h\r\n }\r\n }else {\r\n w = result.w\r\n h = result.h\r\n }\r\n if (!w || !h) {\r\n w = h = 1\r\n }\r\n ratios.push(w / h)\r\n })\r\n \r\n var rows = []\r\n var curCnt = 0\r\n var curW = 0\r\n angular.forEach(ratios, function (ratio) {\r\n var w = ratio * rowH\r\n curW += w\r\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\r\n curCnt++\r\n } else {\r\n rows.push(curCnt)\r\n curCnt = 1\r\n curW = w\r\n }\r\n })\r\n if (curCnt) {\r\n rows.push(curCnt)\r\n }\r\n \r\n var i = 0\r\n var thumbs = []\r\n var lastRowI = rows.length - 1\r\n angular.forEach(rows, function (rowCnt, rowI) {\r\n var lastRow = rowI === lastRowI\r\n var curRatios = ratios.slice(i, i + rowCnt)\r\n var sumRatios = 0\r\n angular.forEach(curRatios, function (ratio) {\r\n sumRatios += ratio\r\n })\r\n angular.forEach(curRatios, function (ratio, j) {\r\n var thumbH = rowH\r\n var thumbW = rowW * ratio / sumRatios\r\n var realW = thumbH * ratio\r\n if (lastRow && thumbW > realW) {\r\n thumbW = realW\r\n }\r\n var result = results[i + j]\r\n result.thumbW = Math.floor(thumbW) - 2\r\n result.thumbH = Math.floor(thumbH) - 2\r\n })\r\n \r\n i += rowCnt\r\n })\r\n } */\r\n\r\n public async checkSwitchReturn(botId: BotId) {\r\n const bot = appUsersManager.getUser(botId);\r\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\r\n return;\r\n }\r\n\r\n const peerData = this.setHash[botId];\r\n if(peerData) {\r\n delete this.setHash[botId];\r\n if((Date.now() - peerData.time) < 3600e3) {\r\n return peerData.peerId;\r\n }\r\n }\r\n }\r\n\r\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\r\n rootScope.dispatchEvent('history_focus', {peerId, threadId});\r\n appDraftsManager.setDraft(peerId, threadId, '@' + appUsersManager.getUser(botId).username + ' ' + query);\r\n }\r\n\r\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\r\n return apiManagerProxy.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n msg_id: appMessagesIdsManager.getServerMessageId(mid),\r\n data: button.data\r\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((callbackAnswer) => {\r\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\r\n toast(RichTextProcessor.wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\r\n }\r\n \r\n //console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\r\n });\r\n }\r\n \r\n /* function gameButtonClick (id) {\r\n var message = AppMessagesManager.getMessage(id)\r\n var peerId = AppMessagesManager.getMessagePeer(message)\r\n \r\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\r\n peer: AppPeersManager.getInputPeerByID(peerId),\r\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\r\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\r\n if (typeof callbackAnswer.message === 'string' &&\r\n callbackAnswer.message.length) {\r\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\r\n }\r\n else if (typeof callbackAnswer.url === 'string') {\r\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\r\n }\r\n })\r\n } */\r\n\r\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: Partial<{\r\n viaBotId: BotId,\r\n queryId: string,\r\n resultId: string,\r\n replyMarkup: ReplyMarkup,\r\n entities: MessageEntity[],\r\n replyToMsgId: number,\r\n clearDraft: true,\r\n scheduleDate: number,\r\n silent: true,\r\n geoPoint: GeoPoint\r\n }> = {}) {\r\n const inlineResult = this.inlineResults[queryAndResultIds];\r\n if(!inlineResult) {\r\n return;\r\n }\r\n\r\n this.pushPopularBot(botId);\r\n const splitted = queryAndResultIds.split('_');\r\n const queryID = splitted.shift();\r\n const resultID = splitted.join('_');\r\n options.viaBotId = botId;\r\n options.queryId = queryID;\r\n options.resultId = resultID;\r\n if(inlineResult.send_message.reply_markup) {\r\n options.replyMarkup = inlineResult.send_message.reply_markup;\r\n }\r\n \r\n if(inlineResult.send_message._ === 'botInlineMessageText') {\r\n options.entities = inlineResult.send_message.entities;\r\n appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\r\n } else {\r\n let caption = '';\r\n let inputMedia: InputMedia;\r\n const sendMessage = inlineResult.send_message;\r\n switch(sendMessage._) {\r\n case 'botInlineMessageMediaAuto': {\r\n caption = sendMessage.message;\r\n\r\n if(inlineResult._ === 'botInlineMediaResult') {\r\n const {document, photo} = inlineResult;\r\n if(document) {\r\n inputMedia = appDocsManager.getMediaInput(document as MyDocument);\r\n } else {\r\n inputMedia = appPhotosManager.getMediaInput(photo as MyPhoto);\r\n }\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaGeo': {\r\n inputMedia = {\r\n _: 'inputMediaGeoPoint',\r\n geo_point: this.getGeoInput(sendMessage.geo)\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n \r\n case 'botInlineMessageMediaVenue': {\r\n inputMedia = {\r\n _: 'inputMediaVenue',\r\n geo_point: this.getGeoInput(sendMessage.geo),\r\n title: sendMessage.title,\r\n address: sendMessage.address,\r\n provider: sendMessage.provider,\r\n venue_id: sendMessage.venue_id,\r\n venue_type: sendMessage.venue_type\r\n };\r\n\r\n options.geoPoint = sendMessage.geo;\r\n\r\n break;\r\n }\r\n\r\n case 'botInlineMessageMediaContact': {\r\n inputMedia = {\r\n _: 'inputMediaContact',\r\n phone_number: sendMessage.phone_number,\r\n first_name: sendMessage.first_name,\r\n last_name: sendMessage.last_name,\r\n vcard: sendMessage.vcard\r\n };\r\n\r\n break;\r\n }\r\n }\r\n\r\n if(!inputMedia) {\r\n inputMedia = {\r\n _: 'messageMediaPending',\r\n type: inlineResult.type,\r\n file_name: inlineResult.title || \r\n (inlineResult as BotInlineResult.botInlineResult).content?.url || \r\n (inlineResult as BotInlineResult.botInlineResult).url,\r\n size: 0,\r\n progress: {percent: 30, total: 0}\r\n } as any;\r\n }\r\n\r\n appMessagesManager.sendOther(peerId, inputMedia, options);\r\n }\r\n }\r\n \r\n /* function checkGeoLocationAccess (botID) {\r\n var key = 'bot_access_geo' + botID\r\n return Storage.get(key).then(function (geoAccess) {\r\n if (geoAccess && geoAccess.granted) {\r\n return true\r\n }\r\n return ErrorService.confirm({\r\n type: 'BOT_ACCESS_GEO_INLINE'\r\n }).then(function () {\r\n var setHash = {}\r\n setHash[key] = {granted: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return true\r\n }, function () {\r\n var setHash = {}\r\n setHash[key] = {denied: true, time: tsNow()}\r\n Storage.set(setHash)\r\n return $q.reject()\r\n })\r\n })\r\n } */\r\n}\r\n\r\nconst appInlineBotsManager = new AppInlineBotsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appInlineBotsManager = appInlineBotsManager);\r\nexport default appInlineBotsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport appSidebarRight from \"..\";\r\nimport appUsersManager from \"../../../lib/appManagers/appUsersManager\";\r\nimport appInlineBotsManager, { AppInlineBotsManager } from \"../../../lib/appManagers/appInlineBotsManager\";\r\nimport GifsMasonry from \"../../gifsMasonry\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport type { MyDocument } from \"../../../lib/appManagers/appDocsManager\";\r\nimport mediaSizes from \"../../../helpers/mediaSizes\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport { NULL_PEER_ID } from \"../../../lib/mtproto/mtproto_config\";\r\n\r\nconst ANIMATIONGROUP = 'GIFS-SEARCH';\r\n\r\nexport default class AppGifsTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private gifsDiv: HTMLDivElement;\r\n\r\n private nextOffset = '';\r\n private loadedAll = false;\r\n\r\n private gifBotPeerId: PeerId;\r\n private masonry: GifsMasonry;\r\n\r\n private searchPromise: ReturnType;\r\n\r\n protected init() {\r\n this.container.id = 'search-gifs-container';\r\n \r\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\r\n this.reset();\r\n this.search(value);\r\n });\r\n \r\n this.title.replaceWith(this.inputSearch.container);\r\n \r\n this.gifsDiv = document.createElement('div');\r\n this.gifsDiv.classList.add('gifs-masonry');\r\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\r\n \r\n this.scrollable.append(this.gifsDiv);\r\n \r\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\r\n //this.backBtn.parentElement.append(this.inputSearch.container);\r\n }\r\n\r\n private onGifsClick = (e: MouseEvent | TouchEvent) => {\r\n const target = findUpClassName(e.target, 'gif');\r\n if(!target) return;\r\n\r\n const fileId = target.dataset.docId;\r\n if(appImManager.chat.input.sendMessageWithDocument(fileId)) {\r\n if(mediaSizes.isMobile) {\r\n appSidebarRight.onCloseBtnClick();\r\n }\r\n } else {\r\n console.warn('got no doc by id:', fileId);\r\n }\r\n };\r\n\r\n public onClose() {\r\n this.scrollable.onScrolledBottom = () => {};\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.reset();\r\n this.gifsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\r\n this.inputSearch.remove();\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n private reset() {\r\n this.searchPromise = null;\r\n this.nextOffset = '';\r\n this.loadedAll = false;\r\n this.masonry.clear();\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.search('', true);\r\n\r\n this.scrollable.onScrolledBottom = () => {\r\n this.search(this.inputSearch.value, false);\r\n };\r\n });\r\n return ret;\r\n }\r\n\r\n public async search(query: string, newSearch = true) {\r\n if(this.searchPromise || this.loadedAll) return;\r\n\r\n if(!this.gifBotPeerId) {\r\n this.gifBotPeerId = (await appUsersManager.resolveUsername('gif')).id.toPeerId(false);\r\n }\r\n\r\n try {\r\n this.searchPromise = appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\r\n const { results, next_offset } = await this.searchPromise;\r\n\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n this.searchPromise = null;\r\n this.nextOffset = next_offset;\r\n if(newSearch) {\r\n this.gifsDiv.innerHTML = '';\r\n }\r\n\r\n if(results.length) {\r\n results.forEach((result) => {\r\n if(result._ === 'botInlineMediaResult' && result.document) {\r\n this.masonry.add(result.document as MyDocument);\r\n }\r\n });\r\n } else {\r\n this.loadedAll = true;\r\n }\r\n\r\n this.scrollable.onScroll();\r\n } catch(err) {\r\n this.searchPromise = null;\r\n console.error('gifs loading error:', err);\r\n throw err;\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { SliderSuperTab } from \"../../slider\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport LazyLoadQueue from \"../../lazyLoadQueue\";\r\nimport appImManager from \"../../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../../lib/appManagers/appStickersManager\";\r\nimport PopupStickers from \"../../popups/stickers\";\r\nimport animationIntersector from \"../../animationIntersector\";\r\nimport { RichTextProcessor } from \"../../../lib/richtextprocessor\";\r\nimport { wrapSticker } from \"../../wrappers\";\r\nimport appSidebarRight from \"..\";\r\nimport { StickerSet, StickerSetCovered } from \"../../../layer\";\r\nimport { forEachReverse } from \"../../../helpers/array\";\r\nimport { i18n } from \"../../../lib/langPack\";\r\nimport findUpClassName from \"../../../helpers/dom/findUpClassName\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\n\r\nexport default class AppStickersTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private setsDiv: HTMLDivElement;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n\r\n protected init() {\r\n this.container.id = 'stickers-container';\r\n this.container.classList.add('chatlist-container');\r\n\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n\r\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\r\n this.search(value);\r\n });\r\n\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.setsDiv = document.createElement('div');\r\n this.setsDiv.classList.add('sticker-sets');\r\n this.scrollable.append(this.setsDiv);\r\n\r\n attachClickEvent(this.setsDiv, (e) => {\r\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\r\n if(sticker) {\r\n const docId = sticker.dataset.docId;\r\n appImManager.chat.input.sendMessageWithDocument(docId);\r\n return;\r\n }\r\n\r\n const target = findUpClassName(e.target, 'sticker-set');\r\n if(!target) return;\r\n\r\n const id = target.dataset.stickerSet as string;\r\n const access_hash = target.dataset.access_hash as string;\r\n\r\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\r\n if(button) {\r\n e.preventDefault();\r\n e.cancelBubble = true;\r\n\r\n button.setAttribute('disabled', 'true');\r\n \r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n appStickersManager.toggleStickerSet(full.set).then(changed => {\r\n if(changed) {\r\n button.textContent = '';\r\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n button.classList.toggle('gray', !!full.set.installed_date);\r\n }\r\n }).finally(() => {\r\n //button.style.width = set.installed_date ? '68px' : '52px';\r\n button.removeAttribute('disabled');\r\n });\r\n });\r\n } else {\r\n appStickersManager.getStickerSet({id, access_hash}).then(full => {\r\n new PopupStickers(full.set).show();\r\n });\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public onCloseAfterTimeout() {\r\n this.setsDiv.innerHTML = '';\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n return super.onCloseAfterTimeout();\r\n }\r\n\r\n public renderSet(set: StickerSet.stickerSet) {\r\n //console.log('renderSet:', set);\r\n const div = document.createElement('div');\r\n div.classList.add('sticker-set');\r\n\r\n const header = document.createElement('div');\r\n header.classList.add('sticker-set-header');\r\n\r\n const details = document.createElement('div');\r\n details.classList.add('sticker-set-details');\r\n details.innerHTML = `\r\n
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\r\n\r\n const countDiv = document.createElement('div');\r\n countDiv.classList.add('sticker-set-count');\r\n countDiv.append(i18n('Stickers', [set.count]));\r\n details.append(countDiv);\r\n \r\n const button = document.createElement('button');\r\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\r\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\r\n // button.style.width = set.installed_date ? '68px' : '52px';\r\n\r\n if(set.installed_date) {\r\n button.classList.add('gray');\r\n }\r\n\r\n //ripple(button);\r\n\r\n header.append(details, button);\r\n\r\n const stickersDiv = document.createElement('div');\r\n stickersDiv.classList.add('sticker-set-stickers');\r\n\r\n const count = Math.min(5, set.count);\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add('sticker-set-sticker');\r\n\r\n stickersDiv.append(stickerDiv);\r\n }\r\n\r\n appStickersManager.getStickerSet(set).then(set => {\r\n //console.log('renderSet got set:', set);\r\n \r\n for(let i = 0; i < count; ++i) {\r\n const div = stickersDiv.children[i] as HTMLDivElement;\r\n const doc = set.documents[i];\r\n if(doc._ === 'documentEmpty') {\r\n continue;\r\n }\r\n\r\n wrapSticker({\r\n doc, \r\n div, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n group: 'STICKERS-SEARCH', \r\n /* play: false,\r\n loop: false, */\r\n play: true,\r\n loop: true,\r\n width: 68,\r\n height: 68\r\n });\r\n }\r\n });\r\n\r\n /* const onMouseOver = () => {\r\n const animations: AnimationItem['animation'][] = [];\r\n for(let i = 0; i < count; ++i) {\r\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\r\n const animationItem = animationIntersector.getAnimation(stickerDiv);\r\n if(!animationItem) continue;\r\n\r\n const animation = animationItem.animation;\r\n\r\n animations.push(animation);\r\n animation.loop = true;\r\n animation.play();\r\n }\r\n\r\n div.addEventListener('mouseout', () => {\r\n animations.forEach(animation => {\r\n animation.loop = false;\r\n });\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true});\r\n }, {once: true});\r\n };\r\n\r\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\r\n\r\n div.dataset.stickerSet = '' + set.id;\r\n div.dataset.access_hash = '' + set.access_hash;\r\n div.dataset.title = set.title;\r\n\r\n div.append(header, stickersDiv);\r\n\r\n this.setsDiv.append(div);\r\n }\r\n\r\n public open() {\r\n const ret = super.open();\r\n appSidebarRight.toggleSidebar(true).then(() => {\r\n this.renderFeatured();\r\n });\r\n\r\n return ret;\r\n }\r\n\r\n public renderFeatured() {\r\n return appStickersManager.getFeaturedStickers().then(coveredSets => {\r\n if(this.inputSearch.value) {\r\n return;\r\n }\r\n\r\n coveredSets = this.filterRendered('', coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n\r\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\r\n coveredSets = coveredSets.slice();\r\n\r\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\r\n forEachReverse(children, el => {\r\n const id = el.dataset.stickerSet;\r\n const index = coveredSets.findIndex(covered => covered.set.id === id);\r\n \r\n if(index !== -1) {\r\n coveredSets.splice(index, 1);\r\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\r\n el.remove();\r\n }\r\n });\r\n\r\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\r\n\r\n return coveredSets;\r\n }\r\n\r\n public search(query: string) {\r\n if(!query) {\r\n return this.renderFeatured();\r\n }\r\n\r\n return appStickersManager.searchStickerSets(query, false).then(coveredSets => {\r\n if(this.inputSearch.value !== query) {\r\n return;\r\n }\r\n\r\n //console.log('search result:', coveredSets);\r\n\r\n coveredSets = this.filterRendered(query, coveredSets);\r\n coveredSets.forEach(set => {\r\n this.renderSet(set.set);\r\n });\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"./dom/clickEvent\";\r\nimport findUpAsChild from \"./dom/findUpAsChild\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\nimport ListenerSetter from \"./listenerSetter\";\r\nimport { safeAssign } from \"./object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\n\r\nconst KEEP_OPEN = false;\r\nconst TOGGLE_TIMEOUT = 200;\r\nconst ANIMATION_DURATION = 200;\r\n\r\nexport default class DropdownHover extends EventListenerBase<{\r\n open: () => Promise | void,\r\n opened: () => any,\r\n close: () => any,\r\n closed: () => any\r\n}> {\r\n protected element: HTMLElement;\r\n protected displayTimeout: number;\r\n protected forceClose = false;\r\n protected inited = false;\r\n\r\n constructor(options: {\r\n element: DropdownHover['element']\r\n }) {\r\n super(false);\r\n safeAssign(this, options);\r\n }\r\n\r\n public attachButtonListener(button: HTMLElement, listenerSetter: ListenerSetter) {\r\n let firstTime = true;\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(button, () => {\r\n if(firstTime) {\r\n firstTime = false;\r\n this.toggle(true);\r\n } else {\r\n this.toggle();\r\n }\r\n }, {listenerSetter});\r\n } else {\r\n listenerSetter.add(button)('mouseover', (e) => {\r\n //console.log('onmouseover button');\r\n if(firstTime) {\r\n listenerSetter.add(button)('mouseout', this.onMouseOut);\r\n firstTime = false;\r\n }\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(true);\r\n }, TOGGLE_TIMEOUT);\r\n });\r\n }\r\n }\r\n\r\n private onMouseOut = (e: MouseEvent) => {\r\n if(KEEP_OPEN) return;\r\n clearTimeout(this.displayTimeout);\r\n if(!this.isActive()) return;\r\n\r\n const toElement = (e as any).toElement as Element;\r\n if(toElement && findUpAsChild(toElement, this.element)) {\r\n return;\r\n }\r\n\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.toggle(false);\r\n }, TOGGLE_TIMEOUT);\r\n };\r\n\r\n protected init() {\r\n if(!IS_TOUCH_SUPPORTED) {\r\n this.element.onmouseout = this.onMouseOut;\r\n this.element.onmouseover = (e) => {\r\n if(this.forceClose) {\r\n return;\r\n }\r\n\r\n //console.log('onmouseover element');\r\n clearTimeout(this.displayTimeout);\r\n };\r\n }\r\n }\r\n\r\n public toggle = async(enable?: boolean) => {\r\n //if(!this.element) return;\r\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\r\n if(this.init) {\r\n if(willBeActive) {\r\n this.init();\r\n this.init = null;\r\n } else {\r\n return;\r\n }\r\n }\r\n\r\n if(willBeActive === this.isActive()) {\r\n return;\r\n }\r\n \r\n if((this.element.style.display && enable === undefined) || enable) {\r\n const res = this.dispatchResultableEvent('open');\r\n await Promise.all(res);\r\n\r\n this.element.style.display = '';\r\n void this.element.offsetLeft; // reflow\r\n this.element.classList.add('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.forceClose = false;\r\n this.dispatchEvent('opened');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n // ! can't use together with resizeObserver\r\n /* if(isTouchSupported) {\r\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n console.log('[ESG]: toggle: enable height', height);\r\n appImManager.chat.bubbles.scrollable.scrollTop += height;\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n } else {\r\n this.dispatchEvent('close');\r\n\r\n this.element.classList.remove('active');\r\n\r\n clearTimeout(this.displayTimeout);\r\n this.displayTimeout = window.setTimeout(() => {\r\n this.element.style.display = 'none';\r\n this.forceClose = false;\r\n this.dispatchEvent('closed');\r\n }, IS_TOUCH_SUPPORTED ? 0 : ANIMATION_DURATION);\r\n\r\n /* if(isTouchSupported) {\r\n const scrollHeight = this.container.scrollHeight;\r\n if(scrollHeight) {\r\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\r\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\r\n }\r\n } */\r\n\r\n /* if(touchSupport) {\r\n this.restoreScroll();\r\n } */\r\n }\r\n\r\n //animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\r\n };\r\n\r\n public isActive() {\r\n return this.element.classList.contains('active');\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport appImManager from \"../../lib/appManagers/appImManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport animationIntersector from \"../animationIntersector\";\nimport { horizontalMenu } from \"../horizontalMenu\";\nimport LazyLoadQueue, { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport Scrollable, { ScrollableX } from \"../scrollable\";\nimport appSidebarRight from \"../sidebarRight\";\nimport StickyIntersector from \"../stickyIntersector\";\nimport EmojiTab from \"./tabs/emoji\";\nimport GifsTab from \"./tabs/gifs\";\nimport StickersTab from \"./tabs/stickers\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AppGifsTab from \"../sidebarRight/tabs/gifs\";\nimport AppStickersTab from \"../sidebarRight/tabs/stickers\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport DropdownHover from \"../../helpers/dropdownHover\";\nimport { pause } from \"../../helpers/schedulers/pause\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\n\nexport const EMOTICONSSTICKERGROUP = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n init: () => void,\n onCloseAfterTimeout?: () => void\n}\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue();\n\n private emojiTab: EmojiTab;\n public stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n //appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n //EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n });\n }\n\n protected init() {\n this.emojiTab = new EmojiTab();\n this.stickersTab = new StickersTab();\n this.gifsTab = new GifsTab();\n\n this.tabs = {\n 0: this.emojiTab,\n 1: this.stickersTab,\n 2: this.gifsTab\n };\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const tab = this.tabs[this.tabId];\n if(tab.init) {\n tab.init();\n }\n\n tab.onCloseAfterTimeout && tab.onCloseAfterTimeout();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === 1) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n new AppStickersTab(appSidebarRight).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n new AppGifsTab(appSidebarRight).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n this.deleteBtn.addEventListener('click', (e) => {\n const input = appImManager.chat.input.messageInput;\n if((input.lastChild as any)?.tagName) {\n input.lastElementChild.remove();\n } else if(input.lastChild) {\n if(!input.lastChild.textContent.length) {\n input.lastChild.remove();\n } else {\n input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n }\n }\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n appImManager.chat.input.messageInput.dispatchEvent(event);\n //appSidebarRight.stickersTab.init();\n\n cancelEvent(e);\n });\n \n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? 1 : 0;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n (this.tabsEl.children[INIT_TAB_ID + 1] as HTMLLIElement).click(); // set emoji tab\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n rootScope.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n return;\n }\n \n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === 0);\n this.deleteBtn.classList.toggle('hide', this.tabId !== 0);\n };\n\n private checkRights = () => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const canSendStickers = appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers');\n tabsElements[2].toggleAttribute('disabled', !canSendStickers);\n\n const canSendGifs = appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs');\n tabsElements[3].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== 1 && (!canSendStickers || !canSendGifs)) {\n this.selectTab(0, false);\n }\n };\n\n public static menuOnClick = (menu: HTMLElement, scroll: Scrollable, menuScroll?: ScrollableX, prevId = 0) => {\n let jumpedTo = -1;\n\n const setActive = (id: number) => {\n if(id === prevId) {\n return false;\n }\n\n menu.children[prevId].classList.remove('active');\n menu.children[id].classList.add('active');\n prevId = id;\n\n return true;\n };\n\n const stickyIntersector = new StickyIntersector(scroll.container, (stuck, target) => {\n //console.log('sticky scrollTOp', stuck, target, scroll.container.scrollTop);\n\n if(Math.abs(jumpedTo - scroll.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const which = whichChild(target);\n if(!stuck && which) { // * due to stickyIntersector\n return;\n }\n\n setActive(which);\n\n if(menuScroll) {\n if(which < menu.childElementCount - 4) {\n menuScroll.container.scrollLeft = (which - 3) * 47;\n } else {\n menuScroll.container.scrollLeft = which * 47;\n }\n }\n });\n\n menu.addEventListener('click', (e) => {\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'menu-horizontal-div-item');\n\n if(!target) {\n return;\n }\n\n const which = whichChild(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(!setActive(which)) {\n return;\n }\n\n const element = (scroll.splitUp || scroll.container).children[which] as HTMLElement;\n const offsetTop = element.offsetTop + 1; // * due to stickyIntersector\n\n scroll.container.scrollTop = jumpedTo = offsetTop;\n\n //console.log('set scrollTop:', offsetTop);\n });\n\n return {stickyIntersector, setActive};\n };\n\n public static onMediaClick = (e: {target: EventTarget | Element}, clearDraft = false) => {\n let target = e.target as HTMLElement;\n target = findUpTag(target, 'DIV');\n\n if(!target) return false;\n \n const fileId = target.dataset.docId;\n if(!fileId) return false;\n\n if(appImManager.chat.input.sendMessageWithDocument(fileId, undefined, clearDraft)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', fileId);\n return false;\n }\n };\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","import { IS_FIREFOX } from \"./userAgent\";\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED && false;\n\nexport default IS_CALL_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n start?: string\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getVisibleRect(element: HTMLElement, overflowElement: HTMLElement, lookForSticky?: boolean) {\r\n const rect = element.getBoundingClientRect();\r\n const overflowRect = overflowElement.getBoundingClientRect();\r\n\r\n let {top: overflowTop, bottom: overflowBottom} = overflowRect;\r\n\r\n // * respect sticky headers\r\n if(lookForSticky) {\r\n const sticky = overflowElement.querySelector('.sticky');\r\n if(sticky) {\r\n const stickyRect = sticky.getBoundingClientRect();\r\n overflowTop = stickyRect.bottom;\r\n }\r\n }\r\n\r\n if(rect.top >= overflowBottom\r\n || rect.bottom <= overflowTop\r\n || rect.right <= overflowRect.left\r\n || rect.left >= overflowRect.right) {\r\n return null;\r\n }\r\n\r\n const overflow = {\r\n top: false,\r\n right: false,\r\n bottom: false,\r\n left: false,\r\n vertical: 0 as 0 | 1 | 2,\r\n horizontal: 0 as 0 | 1 | 2\r\n };\r\n\r\n // @ts-ignore\r\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\r\n const windowWidth = w.width || w.innerWidth;\r\n const windowHeight = w.height || w.innerHeight;\r\n\r\n return {\r\n rect: {\r\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\r\n right: 0,\r\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\r\n left: 0\r\n },\r\n overflow\r\n };\r\n}\r\n\r\n(window as any).getVisibleRect = getVisibleRect;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport PopupElement, { addCancelButton } from \".\";\r\nimport { numberThousandSplitter } from \"../../helpers/number\";\r\nimport { ChatInvite, Updates } from \"../../layer\";\r\nimport apiUpdatesManager from \"../../lib/appManagers/apiUpdatesManager\";\r\nimport appAvatarsManager from \"../../lib/appManagers/appAvatarsManager\";\r\nimport appPhotosManager from \"../../lib/appManagers/appPhotosManager\";\r\nimport { i18n, _i18n } from \"../../lib/langPack\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { toastNew } from \"../toast\";\r\nimport { wrapPhoto } from \"../wrappers\";\r\n\r\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\r\n\r\nexport default class PopupJoinChatInvite extends PopupElement {\r\n constructor(hash: string, chatInvite: ChatInvite.chatInvite) {\r\n super('popup-join-chat-invite', addCancelButton([{\r\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\r\n callback: () => {\r\n apiManager.invokeApi('messages.importChatInvite', {hash})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n const chat = (updates as Updates.updates).chats[0];\r\n const peerId = chat.id.toPeerId(true);\r\n rootScope.dispatchEvent('history_focus', {peerId});\r\n }, (error) => {\r\n if(error.type === 'INVITE_REQUEST_SENT') {\r\n toastNew({langPackKey: 'RequestToJoinSent'});\r\n }\r\n });\r\n }\r\n }]), {closable: true, overlayClosable: true, body: true});\r\n\r\n this.header.remove();\r\n\r\n /* const fakeChat: Chat.channel | Chat.chat = {\r\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\r\n id: FAKE_CHAT_ID,\r\n title: chatInvite.title,\r\n photo: chatInvite.photo as any,\r\n date: Date.now() / 1000 | 0,\r\n version: 0,\r\n participants_count: chatInvite.participants_count,\r\n pFlags: chatInvite.pFlags as any\r\n };\r\n\r\n appChatsManager.saveApiChat(fakeChat); */\r\n \r\n const avatarElem = new AvatarElement();\r\n avatarElem.setAttribute('dialog', '0');\r\n avatarElem.classList.add('avatar-100');\r\n if(chatInvite.photo._ === 'photo') {\r\n chatInvite.photo = appPhotosManager.savePhoto(chatInvite.photo);\r\n wrapPhoto({\r\n container: avatarElem,\r\n message: null,\r\n photo: chatInvite.photo,\r\n boxHeight: 100,\r\n boxWidth: 100,\r\n withoutPreloader: true\r\n });\r\n avatarElem.style.width = avatarElem.style.height = '';\r\n } else {\r\n appAvatarsManager.putPhoto(avatarElem, NULL_PEER_ID, false, chatInvite.title);\r\n }\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('chat-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(chatInvite.title);\r\n //avatarElem.setAttribute('peer', '' + -fakeChat.id);\r\n \r\n const isBroadcast = chatInvite.pFlags.broadcast;\r\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\r\n peopleCount.classList.add('chat-participants-count');\r\n\r\n this.body.append(avatarElem, title, peopleCount);\r\n\r\n if(chatInvite.pFlags.request_needed) {\r\n const caption = document.createElement('div');\r\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\r\n caption.classList.add('chat-participants-count', 'request-caption');\r\n\r\n this.body.append(caption);\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport type { AppMessagesManager, HistoryResult, HistoryStorage, MyMessage } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\r\nimport type { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\r\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\r\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport { getObjectKeysAndSort } from \"../../helpers/object\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport BubbleGroups from \"./bubbleGroups\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupStickers from \"../popups/stickers\";\r\nimport ProgressivePreloader from \"../preloader\";\r\nimport Scrollable, { SliceSides } from \"../scrollable\";\r\nimport StickyIntersector from \"../stickyIntersector\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\r\nimport I18n, { FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../../lib/langPack\";\r\nimport AvatarElement from \"../avatar\";\r\nimport { ripple } from \"../ripple\";\r\nimport { wrapAlbum, wrapPhoto, wrapVideo, wrapDocument, wrapSticker, wrapPoll, wrapGroupedDocuments } from \"../wrappers\";\r\nimport { MessageRender } from \"./messageRender\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport PollElement from \"../poll\";\r\nimport AudioElement from \"../audio\";\r\nimport { ChatInvite, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReplyMarkup, SponsoredMessage, Update, WebPage } from \"../../layer\";\r\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\r\nimport { FocusDirection } from \"../../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck, { getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf, fastRafPromise } from \"../../helpers/schedulers\";\r\nimport { deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport RepliesElement from \"./replies\";\r\nimport DEBUG from \"../../config/debug\";\r\nimport { SliceEnd } from \"../../helpers/slicedArray\";\r\nimport serverTimeManager from \"../../lib/mtproto/serverTimeManager\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport { forEachReverse } from \"../../helpers/array\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { toast } from \"../toast\";\r\nimport { getElementByPoint } from \"../../helpers/dom/getElementByPoint\";\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\r\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\r\nimport reflowScrollableElement from \"../../helpers/dom/reflowScrollableElement\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { cancelAnimationByKey } from \"../../helpers/animation\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { formatNumber } from \"../../helpers/number\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport windowSize from \"../../helpers/windowSize\";\r\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\r\nimport AppMediaViewer from \"../appMediaViewer\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport handleHorizontalSwipe from \"../../helpers/dom/handleHorizontalSwipe\";\r\nimport { cancelContextMenuOpening } from \"../misc\";\r\nimport findUpAttribute from \"../../helpers/dom/findUpAttribute\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\r\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\r\nimport Button from \"../button\";\r\nimport { CallType } from \"../../lib/calls/types\";\r\nimport getVisibleRect from \"../../helpers/dom/getVisibleRect\";\r\nimport PopupJoinChatInvite from \"../popups/joinChatInvite\";\r\nimport { InternalLink, INTERNAL_LINK_TYPE } from \"../../lib/appManagers/internalLink\";\r\n\r\nconst USE_MEDIA_TAILS = false;\r\nconst IGNORE_ACTIONS: Set = new Set([\r\n 'messageActionHistoryClear',\r\n 'messageActionChatCreate'/* ,\r\n 'messageActionChannelMigrateFrom' */\r\n]);\r\n\r\nconst SERVICE_AS_REGULAR: Set = new Set();\r\n\r\nif(IS_CALL_SUPPORTED) {\r\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\r\n}\r\n\r\nconst TEST_SCROLL_TIMES: number = undefined;\r\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\r\n\r\nlet queueId = 0;\r\n\r\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\r\n\r\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\r\n\r\nexport default class ChatBubbles {\r\n public bubblesContainer: HTMLDivElement;\r\n private chatInner: HTMLDivElement;\r\n public scrollable: Scrollable;\r\n\r\n private getHistoryTopPromise: Promise;\r\n private getHistoryBottomPromise: Promise;\r\n\r\n public peerId: PeerId;\r\n //public messagesCount: number = -1;\r\n\r\n private unreadOut = new Set();\r\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\r\n\r\n public bubbles: {[mid: string]: HTMLElement} = {};\r\n public skippedMids: Set = new Set();\r\n private dateMessages: {[timestamp: number]: { \r\n div: HTMLElement, \r\n firstTimestamp: number, \r\n container: HTMLElement,\r\n timeout?: number \r\n }} = {};\r\n\r\n private scrolledDown = true;\r\n private isScrollingTimeout = 0;\r\n\r\n private stickyIntersector: StickyIntersector;\r\n\r\n private unreadedObserver: IntersectionObserver;\r\n private unreaded: Map = new Map();\r\n private unreadedSeen: Set = new Set();\r\n private readPromise: Promise;\r\n\r\n private bubbleGroups: BubbleGroups;\r\n\r\n private preloader: ProgressivePreloader = null;\r\n \r\n private loadedTopTimes = 0;\r\n private loadedBottomTimes = 0;\r\n\r\n public messagesQueuePromise: Promise = null;\r\n private messagesQueue: {message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]}[] = [];\r\n private messagesQueueOnRender: () => void = null;\r\n private messagesQueueOnRenderAdditional: () => void = null;\r\n\r\n private firstUnreadBubble: HTMLElement = null;\r\n private attachedUnreadBubble: boolean;\r\n\r\n public lazyLoadQueue: LazyLoadQueue;\r\n\r\n private middleware = getMiddleware();\r\n\r\n private log: ReturnType;\r\n\r\n public listenerSetter: ListenerSetter;\r\n\r\n private replyFollowHistory: number[] = [];\r\n\r\n private isHeavyAnimationInProgress = false;\r\n private scrollingToBubble: HTMLElement;\r\n\r\n private isFirstLoad = true;\r\n private needReflowScroll: boolean;\r\n\r\n private fetchNewPromise: Promise;\r\n private historyStorage: HistoryStorage;\r\n\r\n private passEntities: Partial<{\r\n [_ in MessageEntity['_']]: boolean\r\n }> = {};\r\n\r\n private onAnimateLadder: () => Promise | void;\r\n // private ladderDeferred: CancellablePromise;\r\n private resolveLadderAnimation: () => Promise;\r\n private emptyPlaceholderMid: number;\r\n\r\n private viewsObserver: IntersectionObserver;\r\n private viewsMids: Set = new Set();\r\n private sendViewCountersDebounced: () => Promise;\r\n\r\n private isTopPaddingSet = false;\r\n\r\n private getSponsoredMessagePromise: Promise;\r\n\r\n private previousStickyDate: HTMLElement;\r\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\r\n\r\n constructor(\r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appStickersManager: AppStickersManager, \r\n private appUsersManager: AppUsersManager, \r\n private appInlineBotsManager: AppInlineBotsManager, \r\n private appPhotosManager: AppPhotosManager, \r\n private appPeersManager: AppPeersManager,\r\n private appProfileManager: AppProfileManager,\r\n private appDraftsManager: AppDraftsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager,\r\n private appChatsManager: AppChatsManager\r\n ) {\r\n //this.chat.log.error('Bubbles construction');\r\n \r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.bubblesContainer = document.createElement('div');\r\n this.bubblesContainer.classList.add('bubbles', 'scrolled-down');\r\n\r\n this.chatInner = document.createElement('div');\r\n this.chatInner.classList.add('bubbles-inner');\r\n\r\n this.setScroll();\r\n\r\n this.bubblesContainer.append(this.scrollable.container);\r\n\r\n // * constructor end\r\n\r\n this.log = this.chat.log;\r\n this.bubbleGroups = new BubbleGroups(this.chat);\r\n this.preloader = new ProgressivePreloader({\r\n cancelable: false\r\n });\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n\r\n // * events\r\n\r\n // will call when sent for update pos\r\n this.listenerSetter.add(rootScope)('history_update', ({storage, peerId, mid}) => {\r\n if(this.chat.getMessagesStorage() === storage) {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const message = this.chat.getMessage(mid);\r\n \r\n if(+bubble.dataset.timestamp >= (message.date + serverTimeManager.serverTimeOffset - 1)) {\r\n this.bubbleGroups.changeBubbleMid(bubble, mid);\r\n return;\r\n }\r\n\r\n this.setBubblePosition(bubble, message, false);\r\n //this.log('history_update', this.bubbles[mid], mid, message);\r\n\r\n if(this.scrollingToBubble) {\r\n this.scrollToEnd();\r\n }\r\n\r\n //this.renderMessage(message, false, false, bubble);\r\n }\r\n });\r\n\r\n //this.listenerSetter.add(rootScope)('')\r\n\r\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n this.deleteMessagesByIds(Object.keys(this.bubbles).map(m => +m));\r\n }\r\n });\r\n\r\n // Calls when message successfully sent and we have an id\r\n this.listenerSetter.add(rootScope)('message_sent', (e) => {\r\n const {storage, tempId, tempMessage, mid} = e;\r\n\r\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\r\n if(this.chat.getMessagesStorage() !== storage) {\r\n return;\r\n }\r\n \r\n //this.log('message_sent', e);\r\n\r\n const mounted = this.getMountedBubble(tempId, tempMessage) || this.getMountedBubble(mid);\r\n if(mounted) {\r\n const message = this.chat.getMessage(mid);\r\n const bubble = mounted.bubble;\r\n //this.bubbles[mid] = bubble;\r\n \r\n /////this.log('message_sent', bubble);\r\n\r\n if(message.replies) {\r\n const repliesElement = bubble.querySelector('replies-element') as RepliesElement;\r\n if(repliesElement) {\r\n repliesElement.message = message;\r\n repliesElement.init();\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\r\n if(div) {\r\n const container = findUpClassName(div, 'document-container');\r\n\r\n if(!tempMessage.media?.document?.thumbs?.length && message.media.document.thumbs?.length) {\r\n div.replaceWith(wrapDocument({message}));\r\n }\r\n\r\n if(container) {\r\n container.dataset.mid = '' + mid;\r\n }\r\n }\r\n }\r\n\r\n // set new mids to album items for mediaViewer\r\n if(message.grouped_id) {\r\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\r\n if(item) {\r\n item.dataset.mid = '' + mid;\r\n }\r\n }\r\n\r\n if(message.media?.poll) {\r\n const pollElement = bubble.querySelector('poll-element') as PollElement;\r\n if(pollElement) {\r\n const newPoll = message.media.poll;\r\n pollElement.message = message;\r\n pollElement.setAttribute('poll-id', newPoll.id);\r\n pollElement.setAttribute('message-id', '' + mid);\r\n }\r\n }\r\n\r\n if(message.media?.document) {\r\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\r\n if(element) {\r\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\r\n element.dataset.mid = '' + message.mid;\r\n delete element.dataset.isOutgoing;\r\n (element as any).message = message;\r\n (element as any).onLoad(true);\r\n } else {\r\n element.dataset.docId = message.media.document.id;\r\n }\r\n }\r\n }\r\n\r\n /* bubble.classList.remove('is-sending');\r\n bubble.classList.add('is-sent');\r\n bubble.dataset.mid = '' + mid;\r\n\r\n this.bubbleGroups.removeBubble(bubble, tempId); */\r\n\r\n if(message.media?.webpage && !bubble.querySelector('.web')) {\r\n getHeavyAnimationPromise().then(() => {\r\n this.safeRenderMessage(message, true, false, bubble, false);\r\n this.scrollToBubbleIfLast(bubble);\r\n });\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n this.renderMessage(mounted.message, true, false, mounted.bubble, false); */\r\n }\r\n \r\n //delete this.bubbles[tempId];\r\n } else {\r\n this.log.warn('message_sent there is no bubble', e);\r\n }\r\n\r\n const bubbles = this.bubbles;\r\n if(bubbles[tempId]) {\r\n const bubble = bubbles[tempId];\r\n bubbles[mid] = bubble;\r\n delete bubbles[tempId];\r\n\r\n //getHeavyAnimationPromise().then(() => {\r\n fastRaf(() => {\r\n if(bubble.classList.contains('is-sending')) {\r\n bubble.classList.remove('is-sending');\r\n bubble.classList.add(this.peerId === rootScope.myId && this.chat.type !== 'scheduled' ? 'is-read' : 'is-sent');\r\n }\r\n });\r\n //});\r\n\r\n bubble.dataset.mid = '' + mid;\r\n }\r\n\r\n if(this.unreadOut.has(tempId)) {\r\n this.unreadOut.delete(tempId);\r\n this.unreadOut.add(mid);\r\n }\r\n\r\n // * check timing of scheduled message\r\n if(this.chat.type === 'scheduled') {\r\n const timestamp = Date.now() / 1000 | 0;\r\n const maxTimestamp = tempMessage.date - 10;\r\n //this.log('scheduled timing:', timestamp, maxTimestamp);\r\n if(timestamp >= maxTimestamp) {\r\n this.deleteMessagesByIds([mid]);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_edit', ({storage, peerId, mid}) => {\r\n // fastRaf(() => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n const message = this.chat.getMessage(mid);\r\n const mounted = message.grouped_id ? this.getGroupedBubble(message.grouped_id) : this.getMountedBubble(mid);\r\n if(!mounted) return;\r\n\r\n const updatePosition = this.chat.type === 'scheduled';\r\n const scrolledDown = this.scrolledDown;\r\n this.safeRenderMessage(mounted.message, true, false, mounted.bubble, updatePosition);\r\n if(scrolledDown) {\r\n this.scrollToBubbleIfLast(mounted.bubble);\r\n }\r\n\r\n if(updatePosition) {\r\n (this.messagesQueuePromise || Promise.resolve()).then(() => {\r\n this.deleteEmptyDateGroups();\r\n });\r\n }\r\n // });\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, groupId, deletedMids}) => {\r\n //fastRaf(() => { // ! can't use delayed smth here, need original bubble to be edited\r\n if(peerId !== this.peerId) return;\r\n const mids = this.appMessagesManager.getMidsByAlbum(groupId);\r\n const renderedId = mids.concat(deletedMids).find(mid => this.bubbles[mid]);\r\n if(!renderedId) return;\r\n\r\n const renderMaxId = getObjectKeysAndSort(this.appMessagesManager.groupedMessagesStorage[groupId], 'asc').pop();\r\n\r\n this.safeRenderMessage(this.chat.getMessage(renderMaxId), true, false, this.bubbles[renderedId], false);\r\n //});\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('messages_downloaded', ({peerId, mids}) => {\r\n const middleware = this.getMiddleware();\r\n getHeavyAnimationPromise().then(() => {\r\n if(!middleware()) return;\r\n\r\n (mids as number[]).forEach(mid => {\r\n /* const promise = (this.scrollable.scrollLocked && this.scrollable.scrollLockedPromise) || Promise.resolve();\r\n promise.then(() => {\r\n \r\n }); */\r\n forEachReverse(this.needUpdate, (obj, idx) => {\r\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\r\n const {mid, replyMid} = this.needUpdate.splice(idx, 1)[0];\r\n \r\n //this.log('messages_downloaded', mid, replyMid, i, this.needUpdate, this.needUpdate.length, mids, this.bubbles[mid]);\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n \r\n const message = this.chat.getMessage(mid);\r\n \r\n const repliedMessage = this.appMessagesManager.getMessageByPeer(obj.replyToPeerId, replyMid);\r\n if(repliedMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\r\n delete message.reply_to_mid; // ! WARNING!\r\n }\r\n \r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n message\r\n });\r\n }\r\n });\r\n });\r\n });\r\n });\r\n\r\n // attachClickEvent(this.bubblesContainer, this.onBubblesClick, {listenerSetter: this.listenerSetter});\r\n this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n const className = 'is-gesturing-reply';\r\n const MAX = 64;\r\n const replyAfter = MAX * .75;\r\n let shouldReply = false;\r\n let target: HTMLElement;\r\n let icon: HTMLElement;\r\n handleHorizontalSwipe({\r\n element: this.bubblesContainer,\r\n verifyTouchTarget: (e) => {\r\n if(this.chat.selection.isSelecting || !this.chat.canSend()) {\r\n return false;\r\n }\r\n\r\n // cancelEvent(e);\r\n target = findUpClassName(e.target, 'bubble');\r\n if(target) {\r\n SetTransition(target, className, true, 250);\r\n void target.offsetLeft; // reflow\r\n\r\n if(!icon) {\r\n icon = document.createElement('span');\r\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\r\n } else {\r\n icon.classList.remove('is-visible');\r\n icon.style.opacity = '';\r\n }\r\n\r\n target/* .querySelector('.bubble-content') */.append(icon);\r\n }\r\n\r\n return !!target;\r\n },\r\n onSwipe: (xDiff, yDiff) => {\r\n shouldReply = xDiff >= replyAfter;\r\n\r\n if(shouldReply && !icon.classList.contains('is-visible')) {\r\n icon.classList.add('is-visible');\r\n }\r\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\r\n\r\n const x = -Math.max(0, Math.min(MAX, xDiff));\r\n target.style.transform = `translateX(${x}px)`;\r\n cancelContextMenuOpening();\r\n },\r\n onReset: () => {\r\n const _target = target;\r\n SetTransition(_target, className, false, 250, () => {\r\n if(icon.parentElement === _target) {\r\n icon.classList.remove('is-visible');\r\n icon.remove();\r\n }\r\n });\r\n\r\n fastRaf(() => {\r\n _target.style.transform = ``;\r\n\r\n if(shouldReply) {\r\n const {mid} = _target.dataset;\r\n this.chat.input.initMessageReply(+mid);\r\n shouldReply = false;\r\n }\r\n });\r\n },\r\n listenerOptions: {capture: true}\r\n });\r\n }\r\n\r\n if(DEBUG) {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\r\n if(bubble) {\r\n const mid = +bubble.dataset.mid\r\n this.log('debug message:', this.chat.getMessage(mid));\r\n this.highlightBubble(bubble);\r\n }\r\n });\r\n }\r\n\r\n if(!IS_MOBILE && this.chat.type !== 'pinned') {\r\n this.listenerSetter.add(this.bubblesContainer)('dblclick', (e) => {\r\n if(this.chat.selection.isSelecting || \r\n !this.chat.canSend()) {\r\n return;\r\n }\r\n \r\n const target = e.target as HTMLElement;\r\n const bubble = target.classList.contains('bubble') ? \r\n target : \r\n (target.classList.contains('document-selection') ? target.parentElement : null);\r\n if(bubble && !bubble.classList.contains('bubble-first')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(mid);\r\n if(message.pFlags.is_outgoing) {\r\n return;\r\n }\r\n \r\n this.chat.input.initMessageReply(mid);\r\n }\r\n });\r\n }\r\n\r\n if(false) this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\r\n for(const timestamp in this.dateMessages) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n if(dateMessage.container === target) {\r\n dateMessage.div.classList.toggle('is-sticky', stuck);\r\n break;\r\n }\r\n }\r\n });\r\n\r\n\r\n let middleware: ReturnType;\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n this.lazyLoadQueue.lock();\r\n middleware = this.getMiddleware();\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(middleware && middleware()) {\r\n this.lazyLoadQueue.unlock();\r\n this.lazyLoadQueue.refresh();\r\n }\r\n\r\n middleware = null;\r\n }, this.listenerSetter);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n // will call when message is sent (only 1)\r\n this.listenerSetter.add(rootScope)('history_append', ({storage, mid}) => {\r\n if(storage !== this.chat.getMessagesStorage()) return;\r\n\r\n if(!this.scrollable.loadedAll.bottom) {\r\n this.chat.setMessageId();\r\n } else {\r\n this.renderNewMessagesByIds([mid], true);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('history_multiappend', (msgIdsByPeer) => {\r\n if(!(this.peerId in msgIdsByPeer)) return;\r\n const msgIds = Array.from(msgIdsByPeer[this.peerId]).slice().sort((a, b) => b - a);\r\n this.renderNewMessagesByIds(msgIds);\r\n });\r\n \r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(peerId === this.peerId) {\r\n this.deleteMessagesByIds(Array.from(msgs));\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\r\n if(peerId === this.peerId) {\r\n this.chat.input.setUnreadCount();\r\n this.updateUnreadByDialog();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.peerId]) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\r\n if(this.peerId === dialog.peerId) {\r\n this.chat.input.setUnreadCount();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\r\n if(this.peerId === chatId.toPeerId(true)) {\r\n const hadRights = this.chatInner.classList.contains('has-rights');\r\n const hasRights = this.chat.canSend();\r\n\r\n if(hadRights !== hasRights) {\r\n this.finishPeerChange();\r\n this.chat.input.finishPeerChange();\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', (e) => {\r\n if(e.key === 'settings.emoji.big') {\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(!isScrolledDown) {\r\n this.setMessagesQueuePromise();\r\n }\r\n \r\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n mids.forEach(mid => {\r\n const bubble = this.bubbles[mid];\r\n if(bubble.classList.contains('can-have-big-emoji')) {\r\n const message = this.chat.getMessage(mid);\r\n this.safeRenderMessage(message, undefined, false, bubble);\r\n // this.bubbleGroups.addBubble(bubble, message, false);\r\n }\r\n });\r\n\r\n if(isScrolledDown) {\r\n this.scrollable.scrollTop = 99999;\r\n } else {\r\n this.performHistoryResult([], true, false, undefined);\r\n }\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('message_views', ({peerId, views, mid}) => {\r\n if(this.peerId !== peerId) return;\r\n\r\n fastRaf(() => {\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\r\n if(postViewsElements.length) {\r\n const str = formatNumber(views, 1);\r\n let different = false;\r\n postViewsElements.forEach(postViews => {\r\n if(different || postViews.innerHTML !== str) {\r\n different = true;\r\n postViews.innerHTML = str;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n\r\n this.unreadedObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const mid = this.unreaded.get(target as HTMLElement);\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n });\r\n\r\n this.viewsObserver = new IntersectionObserver((entries) => {\r\n entries.forEach(entry => {\r\n if(entry.isIntersecting) {\r\n const mid = +(entry.target as HTMLElement).dataset.mid;\r\n this.viewsObserver.unobserve(entry.target);\r\n\r\n if(mid) {\r\n this.viewsMids.add(mid);\r\n this.sendViewCountersDebounced();\r\n } else {\r\n const {sponsoredMessage} = this;\r\n if(sponsoredMessage && sponsoredMessage.random_id) {\r\n delete sponsoredMessage.random_id;\r\n this.chat.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId()),\r\n random_id: sponsoredMessage.random_id\r\n });\r\n }\r\n }\r\n }\r\n });\r\n });\r\n\r\n this.sendViewCountersDebounced = debounce(() => {\r\n const mids = [...this.viewsMids];\r\n this.viewsMids.clear();\r\n\r\n this.appMessagesManager.incrementMessageViews(this.peerId, mids);\r\n }, 1000, false, true);\r\n\r\n if('ResizeObserver' in window) {\r\n let wasHeight = this.scrollable.container.offsetHeight;\r\n let resizing = false;\r\n let skip = false;\r\n let scrolled = 0;\r\n let part = 0;\r\n let rAF = 0;\r\n\r\n const onResizeEnd = () => {\r\n const height = this.scrollable.container.offsetHeight;\r\n const isScrolledDown = this.scrollable.isScrolledDown;\r\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\r\n part += wasHeight - height;\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(part) {\r\n this.scrollable.scrollTop += Math.round(part);\r\n }\r\n\r\n wasHeight = height;\r\n scrolled = 0;\r\n rAF = 0;\r\n part = 0;\r\n resizing = false;\r\n skip = false;\r\n };\r\n\r\n const setEndRAF = (single: boolean) => {\r\n if(rAF) window.cancelAnimationFrame(rAF);\r\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\r\n rAF = window.requestAnimationFrame(onResizeEnd);\r\n //this.log('resize after RAF', part);\r\n });\r\n };\r\n\r\n const processEntries = (entries: any) => {\r\n if(skip) {\r\n setEndRAF(false);\r\n return;\r\n }\r\n\r\n const entry = entries[0];\r\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\r\n \r\n if(!wasHeight) {\r\n wasHeight = height;\r\n return;\r\n }\r\n\r\n const realDiff = wasHeight - height;\r\n let diff = realDiff + part;\r\n const _part = diff % 1;\r\n diff -= _part;\r\n \r\n if(!resizing) {\r\n resizing = true;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\r\n } */\r\n\r\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\r\n //if(isSafari) { // * fix opening keyboard while ESG is active \r\n part = -realDiff;\r\n //}\r\n\r\n skip = true;\r\n setEndRAF(false);\r\n return;\r\n }\r\n }\r\n\r\n scrolled += diff;\r\n\r\n /* if(DEBUG) {\r\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\r\n } */\r\n\r\n if(diff) {\r\n const needScrollTop = this.scrollable.scrollTop + diff;\r\n this.scrollable.scrollTop = needScrollTop;\r\n }\r\n \r\n setEndRAF(false);\r\n\r\n part = _part;\r\n wasHeight = height;\r\n };\r\n\r\n // @ts-ignore\r\n const resizeObserver = new ResizeObserver(processEntries);\r\n resizeObserver.observe(this.bubblesContainer);\r\n }\r\n }\r\n\r\n public setStickyDateManually() {\r\n const timestamps = Object.keys(this.dateMessages).map(k => +k).sort((a, b) => b - a);\r\n let lastVisible: HTMLElement;\r\n\r\n // if(this.chatInner.classList.contains('is-scrolling')) {\r\n const {scrollTop} = this.scrollable.container;\r\n const isOverflown = scrollTop > 0;\r\n if(isOverflown) {\r\n for(const timestamp of timestamps) {\r\n const dateMessage = this.dateMessages[timestamp];\r\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\r\n if(visibleRect && visibleRect.overflow.top) {\r\n lastVisible = dateMessage.div;\r\n } else if(lastVisible) {\r\n break;\r\n }\r\n }\r\n }\r\n // }\r\n\r\n if(lastVisible === this.previousStickyDate) {\r\n return;\r\n }\r\n\r\n if(lastVisible) {\r\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\r\n if(needReflow) {\r\n lastVisible.classList.add('no-transition');\r\n }\r\n\r\n lastVisible.classList.add('is-sticky');\r\n\r\n if(needReflow) {\r\n void lastVisible.offsetLeft; // reflow\r\n lastVisible.classList.remove('no-transition');\r\n }\r\n }\r\n\r\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\r\n this.previousStickyDate.classList.remove('is-sticky');\r\n }\r\n\r\n this.previousStickyDate = lastVisible;\r\n }\r\n\r\n public getRenderedLength() {\r\n return Object.keys(this.bubbles).length - this.skippedMids.size;\r\n }\r\n\r\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\r\n this.unreadedSeen.add(mid);\r\n this.unreadedObserver.unobserve(target);\r\n this.unreaded.delete(target);\r\n this.readUnreaded();\r\n }\r\n\r\n private readUnreaded() {\r\n if(this.readPromise) return;\r\n\r\n const middleware = this.getMiddleware();\r\n this.readPromise = rootScope.idle.focusPromise.then(() => {\r\n if(!middleware()) return;\r\n let maxId = Math.max(...Array.from(this.unreadedSeen));\r\n\r\n // ? if message with maxId is not rendered ?\r\n if(this.scrollable.loadedAll.bottom) {\r\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map(i => +i));\r\n if(maxId >= bubblesMaxId) {\r\n maxId = Math.max(this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).maxId || 0, maxId);\r\n }\r\n }\r\n\r\n this.unreaded.forEach((mid, target) => {\r\n if(mid <= maxId) {\r\n this.onUnreadedInViewport(target, mid);\r\n }\r\n });\r\n\r\n const readContents: number[] = [];\r\n for(const mid of this.unreadedSeen) {\r\n const message: MyMessage = this.chat.getMessage(mid);\r\n if(this.appMessagesManager.isMentionUnread(message)) {\r\n readContents.push(mid);\r\n }\r\n }\r\n\r\n this.appMessagesManager.readMessages(this.peerId, readContents);\r\n\r\n this.unreadedSeen.clear();\r\n\r\n if(DEBUG) {\r\n this.log('will readHistory by maxId:', maxId);\r\n }\r\n\r\n // return;\r\n \r\n return this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\r\n this.log.error('readHistory err:', err);\r\n this.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\r\n }).finally(() => {\r\n if(!middleware()) return;\r\n this.readPromise = undefined;\r\n\r\n if(this.unreadedSeen.size) {\r\n this.readUnreaded();\r\n }\r\n });\r\n });\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', (e) => {\r\n const {peerId, mids, pinned} = e;\r\n if(peerId !== this.peerId) return;\r\n\r\n if(mids) {\r\n if(!pinned) {\r\n this.deleteMessagesByIds(mids);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public constructScheduledHelpers() {\r\n const onUpdate = () => {\r\n this.chat.topbar.setTitle(this.appMessagesManager.getScheduledMessagesStorage(this.peerId).size);\r\n };\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId, mid}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.renderNewMessagesByIds([mid]);\r\n onUpdate();\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(peerId !== this.peerId) return;\r\n\r\n this.deleteMessagesByIds(mids);\r\n onUpdate();\r\n });\r\n }\r\n\r\n public onBubblesClick = (e: Event) => {\r\n let target = e.target as HTMLElement;\r\n let bubble: HTMLElement = null;\r\n try {\r\n bubble = findUpClassName(target, 'bubble');\r\n } catch(err) {}\r\n \r\n if(!bubble) return;\r\n\r\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\r\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n for(const timestamp in this.dateMessages) {\r\n const d = this.dateMessages[timestamp];\r\n if(d.div === bubble) {\r\n new PopupDatePicker(new Date(+timestamp), this.onDatePick).show();\r\n break;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\r\n this.chat.selection.toggleByElement(bubble);\r\n return;\r\n }\r\n\r\n // ! Trusted - due to audio autoclick\r\n if(this.chat.selection.isSelecting && e.isTrusted) {\r\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n //console.log('bubble click', e);\r\n\r\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\r\n this.chat.selection.selectedText = undefined;\r\n return;\r\n }\r\n\r\n //this.chatSelection.toggleByBubble(bubble);\r\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\r\n return;\r\n }\r\n\r\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\r\n if(contactDiv) {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: contactDiv.dataset.peerId.toPeerId()\r\n });\r\n return;\r\n }\r\n\r\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\r\n if(callDiv) {\r\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\r\n return;\r\n }\r\n\r\n const spoiler: HTMLElement = findUpClassName(target, 'spoiler');\r\n if(spoiler) {\r\n const messageDiv = findUpClassName(spoiler, 'message');\r\n\r\n const className = 'is-spoiler-visible';\r\n const isVisible = messageDiv.classList.contains(className);\r\n if(!isVisible) {\r\n cancelEvent(e);\r\n }\r\n\r\n const duration = 400 / 2;\r\n const showDuration = 5000;\r\n const useRafs = !isVisible ? 2 : 0;\r\n if(useRafs) {\r\n messageDiv.classList.add('will-change');\r\n }\r\n\r\n const spoilerTimeout = messageDiv.dataset.spoilerTimeout;\r\n if(spoilerTimeout !== null) {\r\n clearTimeout(+spoilerTimeout);\r\n delete messageDiv.dataset.spoilerTimeout;\r\n }\r\n\r\n SetTransition(messageDiv, className, true, duration, () => {\r\n messageDiv.dataset.spoilerTimeout = '' + window.setTimeout(() => {\r\n SetTransition(messageDiv, className, false, duration, () => {\r\n messageDiv.classList.remove('will-change');\r\n delete messageDiv.dataset.spoilerTimeout;\r\n });\r\n }, showDuration);\r\n }, useRafs);\r\n\r\n return;\r\n }\r\n\r\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\r\n if(commentsDiv) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n if(this.peerId === REPLIES_PEER_ID) {\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n const peerId = this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id);\r\n const threadId = message.reply_to.reply_to_top_id;\r\n const lastMsgId = message.fwd_from.saved_from_msg_id;\r\n this.chat.appImManager.openThread(peerId, lastMsgId, threadId);\r\n } else {\r\n const message = this.appMessagesManager.filterMessages(this.chat.getMessage(bubbleMid), message => !!(message as Message.message).replies)[0] as Message.message;\r\n const replies = message.replies;\r\n if(replies) {\r\n this.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then(message => {\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replies.channel_id.toPeerId(true),\r\n type: 'discussion', \r\n threadId: (message as MyMessage).mid\r\n });\r\n });\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n const via = findUpClassName(target, 'is-via');\r\n if(via) {\r\n const el = via.querySelector('.peer-title') as HTMLElement;\r\n if(target === el || findUpAsChild(target, el)) {\r\n const message = el.innerText + ' ';\r\n this.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\r\n cancelEvent(e);\r\n \r\n return;\r\n }\r\n }\r\n\r\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\r\n if(nameDiv && nameDiv !== bubble) {\r\n target = nameDiv || target;\r\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer');\r\n const savedFrom = target.dataset.savedFrom;\r\n if(typeof(peerIdStr) === 'string' || savedFrom) {\r\n if(savedFrom) {\r\n const [peerId, mid] = savedFrom.split('_');\r\n \r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n } else {\r\n const peerId = peerIdStr.toPeerId();\r\n if(peerId !== NULL_PEER_ID) {\r\n this.chat.appImManager.setInnerPeer({peerId});\r\n } else {\r\n toast(I18n.format('HidAccount', true));\r\n }\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n //this.log('chatInner click:', target);\r\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\r\n /* if(isVideoComponentElement) {\r\n const video = target.parentElement.querySelector('video') as HTMLElement;\r\n if(video) {\r\n video.click(); // hot-fix for time and play button\r\n return;\r\n }\r\n } */\r\n\r\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\r\n const messageId = +bubble.dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n\r\n const doc = message.media?.document;\r\n\r\n if(doc?.stickerSetInput) {\r\n new PopupStickers(doc.stickerSetInput).show();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const documentDiv = findUpClassName(target, 'document-with-thumb');\r\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) \r\n || target.classList.contains('album-item')\r\n // || isVideoComponentElement\r\n || (target.tagName === 'VIDEO' && !bubble.classList.contains('round'))\r\n || (documentDiv && !documentDiv.querySelector('.preloader-container'))) {\r\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\r\n const messageId = +(groupedItem || bubble).dataset.mid;\r\n const message = this.chat.getMessage(messageId);\r\n if(!message) {\r\n this.log.warn('no message by messageId:', messageId);\r\n return;\r\n }\r\n\r\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\r\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\r\n\r\n const f = documentDiv ? (media: any) => {\r\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\r\n } : (media: any) => {\r\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\r\n };\r\n\r\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\r\n const ids = isSingleMedia ? [messageId] : Object.keys(this.bubbles).map(k => +k).filter(id => {\r\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\r\n return false;\r\n } */\r\n //if(!this.scrollable.visibleElements.find(e => e.element === this.bubbles[id])) return false;\r\n\r\n const message = this.chat.getMessage(id);\r\n const media = this.appMessagesManager.getMediaFromMessage(message);\r\n \r\n return media && f(media);\r\n }).sort((a, b) => a - b);\r\n\r\n ids.forEach(id => {\r\n let selector: string;\r\n if(documentDiv) {\r\n selector = '.document-container';\r\n } else {\r\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\r\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\r\n if(withTail) {\r\n selector += '.bubble__media-container';\r\n } else {\r\n selector += '.attachment video, .attachment img';\r\n }\r\n }\r\n\r\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\r\n const parents: Set = new Set();\r\n if(documentDiv) {\r\n elements.forEach((element) => {\r\n targets.push({\r\n element: element.querySelector('.document-ico'),\r\n mid: +element.dataset.mid,\r\n peerId: this.peerId\r\n });\r\n });\r\n } else {\r\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\r\n elements.forEach((element) => {\r\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\r\n let albumItem = findUpClassName(element, 'album-item');\r\n const parent = albumItem || element.parentElement;\r\n if(parents.has(parent)) return;\r\n parents.add(parent);\r\n targets.push({\r\n element,\r\n mid: albumItem ? +albumItem.dataset.mid : id,\r\n peerId: this.peerId\r\n });\r\n });\r\n }\r\n });\r\n\r\n targets.sort((a, b) => a.mid - b.mid);\r\n\r\n let idx = targets.findIndex(t => t.mid === messageId);\r\n\r\n if(DEBUG) {\r\n this.log('open mediaViewer single with ids:', ids, idx, targets);\r\n }\r\n\r\n if(!targets[idx]) {\r\n this.log('no target for media viewer!', target);\r\n return;\r\n }\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n threadId: this.chat.threadId,\r\n peerId: this.peerId,\r\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\r\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\r\n isScheduled: this.chat.type === 'scheduled'\r\n })\r\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\r\n \r\n cancelEvent(e);\r\n //appMediaViewer.openMedia(message, target as HTMLImageElement);\r\n return;\r\n }\r\n \r\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\r\n \r\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\r\n if(target.classList.contains('goto-original')) {\r\n const savedFrom = bubble.dataset.savedFrom;\r\n const [peerId, mid] = savedFrom.split('_');\r\n ////this.log('savedFrom', peerId, msgID);\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: peerId.toPeerId(), \r\n lastMsgId: +mid\r\n });\r\n return;\r\n } else if(target.classList.contains('forward')) {\r\n const mid = +bubble.dataset.mid;\r\n const message = this.appMessagesManager.getMessageByPeer(this.peerId, mid);\r\n new PopupForward({\r\n [this.peerId]: this.appMessagesManager.getMidsByMessage(message)\r\n });\r\n //appSidebarRight.forwardTab.open([mid]);\r\n return;\r\n }\r\n \r\n let isReplyClick = false;\r\n \r\n try {\r\n isReplyClick = !!findUpClassName(e.target, 'reply');\r\n } catch(err) {}\r\n \r\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\r\n const bubbleMid = +bubble.dataset.mid;\r\n this.replyFollowHistory.push(bubbleMid);\r\n\r\n const message = this.chat.getMessage(bubbleMid) as Message.message;\r\n\r\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\r\n const replyToMid = message.reply_to.reply_to_msg_id;\r\n\r\n this.chat.appImManager.setInnerPeer({\r\n peerId: replyToPeerId, \r\n lastMsgId: replyToMid, \r\n type: this.chat.type, \r\n threadId: this.chat.threadId\r\n });\r\n\r\n /* if(this.chat.type === 'discussion') {\r\n this.chat.appImManager.setMessageId(, originalMessageId);\r\n } else {\r\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\r\n } */\r\n //this.chat.setMessageId(, originalMessageId);\r\n }\r\n }\r\n \r\n //console.log('chatInner click', e);\r\n };\r\n\r\n public onGoDownClick() {\r\n if(this.replyFollowHistory.length) {\r\n forEachReverse(this.replyFollowHistory, (mid, idx) => {\r\n const bubble = this.bubbles[mid];\r\n let bad = true;\r\n if(bubble) {\r\n const rect = bubble.getBoundingClientRect();\r\n bad = (windowSize.height / 2) > rect.top;\r\n } else {\r\n const message = this.chat.getMessage(mid);\r\n if(!message.deleted) {\r\n bad = false;\r\n }\r\n }\r\n \r\n if(bad) {\r\n this.replyFollowHistory.splice(idx, 1);\r\n }\r\n });\r\n\r\n this.replyFollowHistory.sort((a, b) => b - a);\r\n\r\n const mid = this.replyFollowHistory.pop();\r\n this.chat.setMessageId(mid);\r\n } else {\r\n this.chat.setMessageId(/* , dialog.top_message */);\r\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n \r\n // if(dialog) {\r\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\r\n // } else {\r\n // this.log('will scroll down 3');\r\n // this.scroll.scrollTop = this.scroll.scrollHeight;\r\n // }\r\n }\r\n }\r\n\r\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\r\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\r\n /* if(element) {\r\n if(element.classList.contains('bubbles-date-group')) {\r\n const children = Array.from(element.children) as HTMLElement[];\r\n if(verticalSide === 'top') {\r\n element = children[this.stickyIntersector ? 2 : 1];\r\n } else {\r\n element = children[children.length - 1];\r\n }\r\n } else {\r\n element = findUpClassName(element, 'bubble');\r\n if(element && element.classList.contains('is-date')) {\r\n element = element.nextElementSibling as HTMLElement;\r\n }\r\n }\r\n } */\r\n if(element) element = findUpClassName(element, 'bubble');\r\n\r\n return element;\r\n }\r\n\r\n public getGroupedBubble(groupId: string) {\r\n const group = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n for(const [mid] of group) {\r\n if(this.bubbles[mid]) {\r\n const maxId = Math.max(...group.keys()); // * because in scheduled album can be rendered by lowest mid during sending\r\n return {\r\n bubble: this.bubbles[mid], \r\n mid: +mid,\r\n message: this.chat.getMessage(maxId)\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getBubbleGroupedItems(bubble: HTMLElement) {\r\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\r\n }\r\n\r\n public getMountedBubble(mid: number, message = this.chat.getMessage(mid)) {\r\n if(message.grouped_id && this.appMessagesManager.getMidsByAlbum(message.grouped_id).length > 1) {\r\n const a = this.getGroupedBubble(message.grouped_id);\r\n if(a) {\r\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\r\n return a;\r\n }\r\n }\r\n\r\n const bubble = this.bubbles[mid];\r\n if(!bubble) return;\r\n\r\n return {bubble, mid, message};\r\n }\r\n\r\n private findNextMountedBubbleByMsgId(mid: number) {\r\n return this.bubbles[getObjectKeysAndSort(this.bubbles).find(id => {\r\n if(id < mid) return false;\r\n return !!this.bubbles[id]?.parentElement;\r\n })];\r\n }\r\n\r\n public loadMoreHistory(top: boolean, justLoad = false) {\r\n //this.log('loadMoreHistory', top);\r\n if(!this.peerId || \r\n /* TEST_SCROLL || */ \r\n this.chat.setPeerPromise || \r\n this.isHeavyAnimationInProgress || \r\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) || \r\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\r\n ) {\r\n return;\r\n }\r\n\r\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\r\n const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);\r\n if(!history.length) return;\r\n \r\n if(top) {\r\n if(DEBUG) {\r\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* if(history.length === 75) {\r\n this.log('load more', this.scrollable.scrollHeight, this.scrollable.scrollTop, this.scrollable);\r\n return;\r\n } */\r\n /* false && */this.getHistory(history[0], true, undefined, undefined, justLoad);\r\n } else {\r\n //let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n \r\n // if scroll down after search\r\n if(history.indexOf(historyStorage.maxId) !== -1) {\r\n this.setLoaded('bottom', true);\r\n return;\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\r\n }\r\n\r\n /* false && */this.getHistory(history[history.length - 1], false, true, undefined, justLoad);\r\n }\r\n }\r\n\r\n public onScroll = () => {\r\n //return;\r\n \r\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\r\n if(this.isHeavyAnimationInProgress && this.scrolledDown) return;\r\n //lottieLoader.checkAnimations(false, 'chat');\r\n\r\n const distanceToEnd = this.scrollable.getDistanceToEnd();\r\n if(!IS_TOUCH_SUPPORTED && this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n \r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }\r\n \r\n if(distanceToEnd < 300 && (this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\r\n this.bubblesContainer.classList.add('scrolled-down');\r\n this.scrolledDown = true;\r\n } else if(this.bubblesContainer.classList.contains('scrolled-down')) {\r\n this.bubblesContainer.classList.remove('scrolled-down');\r\n this.scrolledDown = false;\r\n }\r\n\r\n if(this.chat.topbar.pinnedMessage) {\r\n this.chat.topbar.pinnedMessage.setCorrectIndex(this.scrollable.lastScrollDirection);\r\n }\r\n\r\n this.setStickyDateManually();\r\n };\r\n\r\n public setScroll() {\r\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n this.scrollable.container.append(this.chatInner);\r\n\r\n /* const getScrollOffset = () => {\r\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\r\n return 300; \r\n };\r\n\r\n window.addEventListener('resize', () => {\r\n this.scrollable.onScrollOffset = getScrollOffset();\r\n });\r\n\r\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\r\n\r\n this.scrollable.onAdditionalScroll = this.onScroll;\r\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\r\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\r\n //this.scrollable.attachSentinels(undefined, 300);\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.scrollable.container.addEventListener('touchmove', () => {\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\r\n this.chatInner.classList.add('is-scrolling');\r\n }\r\n }, {passive: true});\r\n\r\n this.scrollable.container.addEventListener('touchend', () => {\r\n if(!this.chatInner.classList.contains('is-scrolling')) {\r\n return;\r\n }\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n }\r\n\r\n this.isScrollingTimeout = window.setTimeout(() => {\r\n this.chatInner.classList.remove('is-scrolling');\r\n this.isScrollingTimeout = 0;\r\n }, 1350);\r\n }, {passive: true});\r\n }\r\n }\r\n\r\n public updateUnreadByDialog() {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\r\n \r\n ///////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\r\n \r\n for(const msgId of this.unreadOut) {\r\n if(msgId > 0 && msgId <= maxId) {\r\n const bubble = this.bubbles[msgId];\r\n if(bubble) {\r\n if(bubble.classList.contains('is-sending')) {\r\n continue;\r\n }\r\n \r\n bubble.classList.remove('is-sent', 'is-sending'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\r\n bubble.classList.add('is-read');\r\n }\r\n \r\n this.unreadOut.delete(msgId);\r\n }\r\n }\r\n }\r\n \r\n public deleteMessagesByIds(mids: number[], permanent = true) {\r\n let deleted = false;\r\n mids.forEach(mid => {\r\n if(!(mid in this.bubbles)) return;\r\n \r\n deleted = true;\r\n /* const mounted = this.getMountedBubble(mid);\r\n if(!mounted) return; */\r\n\r\n const bubble = this.bubbles[mid];\r\n delete this.bubbles[mid];\r\n this.skippedMids.delete(mid);\r\n\r\n if(this.firstUnreadBubble === bubble) {\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n this.bubbleGroups.removeBubble(bubble);\r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.unobserve(bubble);\r\n this.unreaded.delete(bubble);\r\n }\r\n if(this.viewsObserver) {\r\n this.viewsObserver.unobserve(bubble);\r\n this.viewsMids.delete(mid);\r\n }\r\n //this.unreaded.findAndSplice(mid => mid === id);\r\n bubble.remove();\r\n //bubble.remove();\r\n\r\n if(this.emptyPlaceholderMid === mid) {\r\n this.emptyPlaceholderMid = undefined;\r\n }\r\n });\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n if(permanent && this.chat.selection.isSelecting) {\r\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\r\n }\r\n \r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP);\r\n this.deleteEmptyDateGroups();\r\n this.onScroll();\r\n }\r\n \r\n public renderNewMessagesByIds(mids: number[], scrolledDown?: boolean) {\r\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\r\n //this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise) {\r\n const middleware = this.getMiddleware();\r\n setPeerPromise.then(() => {\r\n if(!middleware()) return;\r\n this.renderNewMessagesByIds(mids);\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if(this.chat.threadId) {\r\n mids = mids.filter(mid => {\r\n const message = this.chat.getMessage(mid);\r\n const replyTo = message.reply_to as MessageReplyHeader;\r\n return replyTo && (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) === this.chat.threadId;\r\n });\r\n }\r\n\r\n mids = mids.filter(mid => !this.bubbles[mid]);\r\n // ! should scroll even without new messages\r\n /* if(!mids.length) {\r\n return;\r\n } */\r\n\r\n if(!scrolledDown) {\r\n scrolledDown = this.scrolledDown && (\r\n !this.scrollingToBubble || \r\n this.scrollingToBubble === this.getLastBubble() || \r\n this.scrollingToBubble === this.chatInner\r\n );\r\n }\r\n\r\n const middleware = this.getMiddleware();\r\n let isPaddingNeeded = false;\r\n let setPaddingTo: HTMLElement;\r\n if(!this.isTopPaddingSet) {\r\n const {clientHeight, scrollHeight} = this.scrollable.container;\r\n isPaddingNeeded = clientHeight === scrollHeight;\r\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\r\n if(this.chatInner.firstElementChild) {\r\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\r\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\r\n } else {\r\n isPaddingNeeded = true;\r\n } */\r\n\r\n if(isPaddingNeeded) {\r\n /* const add = clientHeight - scrollHeight;\r\n this.chatInner.style.paddingTop = add + 'px';\r\n this.scrollable.scrollTop += add; */\r\n setPaddingTo = this.chatInner;\r\n setPaddingTo.style.paddingTop = clientHeight + 'px';\r\n this.scrollable.scrollTop = scrollHeight;\r\n this.isTopPaddingSet = true;\r\n }\r\n }\r\n\r\n const promise = this.performHistoryResult(mids, false, true);\r\n if(scrolledDown) {\r\n promise.then(() => {\r\n if(!middleware()) return;\r\n //this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\r\n //const bubble = this.bubbles[Math.max(...mids)];\r\n\r\n let bubble: HTMLElement;\r\n if(this.chat.type === 'scheduled') {\r\n bubble = this.bubbles[Math.max(...mids)];\r\n }\r\n\r\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\r\n if(isPaddingNeeded) {\r\n promise.then(() => { // it will be called only once even if was set multiple times (that won't happen)\r\n if(middleware() && isPaddingNeeded) {\r\n setPaddingTo.style.paddingTop = '';\r\n this.isTopPaddingSet = false;\r\n }\r\n });\r\n }\r\n\r\n //this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\r\n\r\n /* setTimeout(() => {\r\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\r\n }, 10); */\r\n });\r\n }\r\n }\r\n\r\n public getLastBubble() {\r\n const lastDateGroup = this.getLastDateGroup();\r\n if(lastDateGroup) {\r\n return lastDateGroup.lastElementChild as HTMLElement;\r\n }\r\n }\r\n\r\n public scrollToBubble(\r\n element: HTMLElement, \r\n position: ScrollLogicalPosition,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number\r\n ) {\r\n const bubble = findUpClassName(element, 'bubble');\r\n\r\n let fallbackToElementStartWhenCentering: HTMLElement;\r\n // * if it's a start, then scroll to start of the group\r\n if(bubble && position !== 'end' && whichChild(bubble) === (this.stickyIntersector ? 2 : 1)/* && this.chat.setPeerPromise */) {\r\n const dateGroup = bubble.parentElement;\r\n // if(whichChild(dateGroup) === 0) {\r\n fallbackToElementStartWhenCentering = dateGroup;\r\n // position = 'start';\r\n // element = dateGroup;\r\n // }\r\n }\r\n\r\n // const isLastBubble = this.getLastBubble() === bubble;\r\n /* if(isLastBubble) {\r\n element = this.getLastDateGroup();\r\n } */\r\n\r\n let margin = 4; // * 4 = .25rem\r\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\r\n margin = 20;\r\n } */\r\n\r\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\r\n return this.scrollable.scrollIntoViewNew({\r\n element, \r\n position, \r\n margin, \r\n forceDirection, \r\n forceDuration, \r\n axis: 'y', \r\n getNormalSize: isChangingHeight ? ({rect}) => {\r\n // return rect.height;\r\n\r\n let height = windowSize.height;\r\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\r\n height -= this.bubblesContainer.offsetTop;\r\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\r\n return height;\r\n\r\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\r\n const diff = rowsWrapperHeight - 54;\r\n return rect.height + diff; */\r\n } : undefined,\r\n fallbackToElementStartWhenCentering\r\n });\r\n }\r\n\r\n public scrollToEnd() {\r\n return this.scrollToBubbleEnd(this.chatInner);\r\n }\r\n\r\n public async scrollToBubbleEnd(bubble: HTMLElement) {\r\n /* if(DEBUG) {\r\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\r\n } */\r\n\r\n if(bubble) {\r\n this.scrollingToBubble = bubble;\r\n const middleware = this.getMiddleware();\r\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\r\n if(!middleware()) return;\r\n this.scrollingToBubble = undefined;\r\n }\r\n }\r\n\r\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\r\n private getLastDateGroup() {\r\n let lastTime = 0, lastElem: HTMLElement;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n if(dateMessage.firstTimestamp > lastTime) {\r\n lastElem = dateMessage.container;\r\n lastTime = dateMessage.firstTimestamp;\r\n }\r\n }\r\n\r\n return lastElem;\r\n }\r\n\r\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\r\n if(this.getLastBubble() === bubble) {\r\n // return this.scrollToBubbleEnd(bubble);\r\n return this.scrollToEnd();\r\n }\r\n }\r\n\r\n public highlightBubble(element: HTMLElement) {\r\n const datasetKey = 'highlightTimeout';\r\n if(element.dataset[datasetKey]) {\r\n clearTimeout(+element.dataset[datasetKey]);\r\n element.classList.remove('is-highlighted');\r\n void element.offsetWidth; // reflow\r\n }\r\n\r\n element.classList.add('is-highlighted');\r\n element.dataset[datasetKey] = '' + setTimeout(() => {\r\n element.classList.remove('is-highlighted');\r\n delete element.dataset[datasetKey];\r\n }, 2000);\r\n }\r\n\r\n public getDateContainerByMessage(message: any, reverse: boolean) {\r\n const date = new Date(message.date * 1000);\r\n date.setHours(0, 0, 0);\r\n const dateTimestamp = date.getTime();\r\n if(!this.dateMessages[dateTimestamp]) {\r\n let dateElement: HTMLElement;\r\n \r\n const today = new Date();\r\n today.setHours(0, 0, 0, 0);\r\n\r\n const isScheduled = this.chat.type === 'scheduled';\r\n \r\n if(today.getTime() === date.getTime()) {\r\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\r\n } else if(isScheduled && message.date === SEND_WHEN_ONLINE_TIMESTAMP) {\r\n dateElement = i18n('MessageScheduledUntilOnline');\r\n } else {\r\n const options: Intl.DateTimeFormatOptions = {\r\n day: 'numeric',\r\n month: 'long'\r\n };\r\n\r\n if(date.getFullYear() !== today.getFullYear()) {\r\n options.year = 'numeric';\r\n }\r\n\r\n dateElement = new I18n.IntlDateElement({\r\n date,\r\n options\r\n }).element;\r\n\r\n if(isScheduled) {\r\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\r\n }\r\n }\r\n \r\n const bubble = document.createElement('div');\r\n bubble.className = 'bubble service is-date';\r\n const bubbleContent = document.createElement('div');\r\n bubbleContent.classList.add('bubble-content');\r\n const serviceMsg = document.createElement('div');\r\n serviceMsg.classList.add('service-msg');\r\n\r\n serviceMsg.append(dateElement);\r\n\r\n bubbleContent.append(serviceMsg);\r\n bubble.append(bubbleContent);\r\n ////////this.log('need to render date message', dateTimestamp, str);\r\n\r\n const container = document.createElement('section');\r\n container.className = 'bubbles-date-group';\r\n container.append(bubble);\r\n\r\n this.dateMessages[dateTimestamp] = {\r\n div: bubble,\r\n container,\r\n firstTimestamp: date.getTime()\r\n };\r\n\r\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\r\n let i = 0, length = haveTimestamps.length, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\r\n for(; i < haveTimestamps.length; ++i) {\r\n const t = haveTimestamps[i];\r\n insertBefore = this.dateMessages[t].container;\r\n if(dateTimestamp < t) {\r\n break;\r\n }\r\n }\r\n\r\n if(i === length && insertBefore) {\r\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\r\n }\r\n\r\n if(!insertBefore) {\r\n this.chatInner.append(container);\r\n } else {\r\n this.chatInner.insertBefore(container, insertBefore);\r\n }\r\n\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.observeStickyHeaderChanges(container);\r\n }\r\n }\r\n\r\n return this.dateMessages[dateTimestamp];\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Bubbles destroying');\r\n\r\n this.scrollable.onScrolledTop = this.scrollable.onScrolledBottom = this.scrollable.onAdditionalScroll = null;\r\n\r\n this.listenerSetter.removeAll();\r\n\r\n this.lazyLoadQueue.clear();\r\n this.unreadedObserver && this.unreadedObserver.disconnect();\r\n this.viewsObserver && this.viewsObserver.disconnect();\r\n this.stickyIntersector && this.stickyIntersector.disconnect();\r\n\r\n delete this.lazyLoadQueue;\r\n this.unreadedObserver && delete this.unreadedObserver;\r\n this.viewsObserver && delete this.viewsObserver;\r\n this.stickyIntersector && delete this.stickyIntersector;\r\n }\r\n\r\n public cleanup(bubblesToo = false) {\r\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\r\n ////console.time('appImManager cleanup');\r\n this.setLoaded('top', false);\r\n this.setLoaded('bottom', false);\r\n\r\n // cancel scroll\r\n cancelAnimationByKey(this.scrollable.container);\r\n\r\n // do not wait ending of previous scale animation\r\n interruptHeavyAnimation();\r\n\r\n if(TEST_SCROLL !== undefined) {\r\n TEST_SCROLL = TEST_SCROLL_TIMES;\r\n }\r\n\r\n this.skippedMids.clear();\r\n this.dateMessages = {};\r\n this.bubbleGroups.cleanup();\r\n this.unreadOut.clear();\r\n this.needUpdate.length = 0;\r\n this.lazyLoadQueue.clear();\r\n \r\n // clear messages\r\n if(bubblesToo) {\r\n this.scrollable.container.textContent = '';\r\n }\r\n \r\n this.firstUnreadBubble = null;\r\n this.attachedUnreadBubble = false;\r\n \r\n this.messagesQueue.length = 0;\r\n this.messagesQueuePromise = null;\r\n \r\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\r\n this.fetchNewPromise = undefined;\r\n this.getSponsoredMessagePromise = undefined;\r\n \r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.disconnect();\r\n }\r\n \r\n if(this.unreadedObserver) {\r\n this.unreadedObserver.disconnect();\r\n this.unreaded.clear();\r\n this.unreadedSeen.clear();\r\n this.readPromise = undefined;\r\n }\r\n\r\n if(this.viewsObserver) {\r\n this.viewsObserver.disconnect();\r\n this.viewsMids.clear();\r\n }\r\n \r\n this.loadedTopTimes = this.loadedBottomTimes = 0;\r\n \r\n this.middleware.clean();\r\n \r\n this.onAnimateLadder = undefined;\r\n this.resolveLadderAnimation = undefined;\r\n this.emptyPlaceholderMid = undefined;\r\n this.sponsoredMessage = undefined;\r\n this.previousStickyDate = undefined;\r\n\r\n this.scrollingToBubble = undefined;\r\n ////console.timeEnd('appImManager cleanup');\r\n\r\n this.isTopPaddingSet = false;\r\n\r\n if(this.isScrollingTimeout) {\r\n clearTimeout(this.isScrollingTimeout);\r\n this.isScrollingTimeout = 0;\r\n }\r\n }\r\n\r\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string): {cached?: boolean, promise: Chat['setPeerPromise']} {\r\n //console.time('appImManager setPeer');\r\n //console.time('appImManager setPeer pre promise');\r\n ////console.time('appImManager: pre render start');\r\n if(!peerId) {\r\n this.cleanup(true);\r\n this.peerId = peerId;\r\n return null;\r\n }\r\n\r\n const samePeer = this.peerId === peerId;\r\n\r\n /* if(samePeer && this.chat.setPeerPromise) {\r\n return {cached: true, promise: this.chat.setPeerPromise};\r\n } */\r\n\r\n const chatType = this.chat.type;\r\n\r\n if(chatType === 'scheduled') {\r\n lastMsgId = 0;\r\n }\r\n\r\n this.historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n let topMessage = chatType === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : this.historyStorage.maxId ?? 0;\r\n const isTarget = lastMsgId !== undefined;\r\n\r\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\r\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\r\n topMessage = 0;\r\n } */\r\n\r\n let readMaxId = 0, savedPosition: ReturnType;\r\n if(!isTarget) {\r\n if(!samePeer) {\r\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\r\n }\r\n\r\n if(savedPosition) {\r\n \r\n } else if(topMessage) {\r\n readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId);\r\n if(/* dialog.unread_count */readMaxId && !samePeer) {\r\n lastMsgId = readMaxId;\r\n } else {\r\n lastMsgId = topMessage;\r\n //lastMsgID = topMessage;\r\n }\r\n }\r\n }\r\n\r\n const isJump = lastMsgId !== topMessage;\r\n\r\n const {scrollable} = this;\r\n \r\n if(samePeer) {\r\n const mounted = this.getMountedBubble(lastMsgId);\r\n if(mounted) {\r\n if(isTarget) {\r\n this.scrollToBubble(mounted.bubble, 'center');\r\n this.highlightBubble(mounted.bubble);\r\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\r\n } else if(topMessage && !isJump) {\r\n //this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\r\n scrollable.scrollTop = scrollable.scrollHeight;\r\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\r\n }\r\n\r\n if(startParam !== undefined) {\r\n this.chat.input.setStartParam(startParam);\r\n }\r\n \r\n return null;\r\n }\r\n } else {\r\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\r\n this.lazyLoadQueue.queueId = ++queueId;\r\n this.chat.apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\r\n }\r\n\r\n this.peerId = peerId;\r\n this.replyFollowHistory.length = 0;\r\n\r\n this.passEntities = {\r\n messageEntityBotCommand: this.appPeersManager.isAnyGroup(peerId) || this.appUsersManager.isBot(peerId)\r\n };\r\n }\r\n\r\n if(DEBUG) {\r\n this.log('setPeer peerId:', peerId, this.historyStorage, lastMsgId, topMessage);\r\n }\r\n\r\n // add last message, bc in getHistory will load < max_id\r\n const additionMsgId = isJump || chatType === 'scheduled' ? 0 : topMessage;\r\n\r\n /* this.setPeerPromise = null;\r\n this.preloader.detach();\r\n return true; */\r\n\r\n //////appSidebarRight.toggleSidebar(true);\r\n\r\n let maxBubbleId = 0;\r\n if(samePeer) {\r\n let el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(el) {\r\n maxBubbleId = +el.dataset.mid;\r\n }\r\n\r\n if(maxBubbleId <= 0) {\r\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map(mid => +mid));\r\n }\r\n } else {\r\n this.isFirstLoad = true;\r\n }\r\n\r\n const oldChatInner = this.chatInner;\r\n this.cleanup();\r\n const chatInner = this.chatInner = document.createElement('div');\r\n if(samePeer) {\r\n chatInner.className = oldChatInner.className;\r\n chatInner.classList.remove('disable-hover', 'is-scrolling');\r\n } else {\r\n chatInner.classList.add('bubbles-inner');\r\n }\r\n\r\n this.lazyLoadQueue.lock();\r\n\r\n let result: ReturnType;\r\n if(!savedPosition) {\r\n result = this.getHistory(lastMsgId, true, isJump, additionMsgId);\r\n } else {\r\n result = {\r\n promise: getHeavyAnimationPromise().then(() => {\r\n return this.performHistoryResult(savedPosition.mids, true, false, undefined);\r\n }) as any,\r\n cached: true\r\n };\r\n }\r\n\r\n const {promise, cached} = result;\r\n\r\n // clear \r\n if(!cached) {\r\n if(!samePeer) {\r\n scrollable.container.textContent = '';\r\n //oldChatInner.remove();\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam);\r\n this.preloader.attach(this.bubblesContainer);\r\n }\r\n }\r\n\r\n //console.timeEnd('appImManager setPeer pre promise');\r\n /* this.ladderDeferred && this.ladderDeferred.resolve();\r\n this.ladderDeferred = deferredPromise(); */\r\n \r\n animationIntersector.lockGroup(CHAT_ANIMATION_GROUP);\r\n const setPeerPromise = promise.then(() => {\r\n ////this.log('setPeer removing preloader');\r\n\r\n if(cached) {\r\n if(!samePeer) {\r\n this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam); // * костыль\r\n }\r\n } else {\r\n this.preloader.detach();\r\n }\r\n\r\n if(this.resolveLadderAnimation) {\r\n this.resolveLadderAnimation();\r\n this.resolveLadderAnimation = undefined;\r\n }\r\n\r\n // this.ladderDeferred.resolve();\r\n\r\n scrollable.lastScrollDirection = 0;\r\n scrollable.lastScrollTop = 0;\r\n replaceContent(scrollable.container, chatInner);\r\n\r\n animationIntersector.unlockGroup(CHAT_ANIMATION_GROUP);\r\n animationIntersector.checkAnimations(false, CHAT_ANIMATION_GROUP/* , true */);\r\n\r\n //fastRaf(() => {\r\n this.lazyLoadQueue.unlock();\r\n //});\r\n\r\n //if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\r\n if(savedPosition) {\r\n scrollable.scrollTop = savedPosition.top;\r\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n\r\n if(bubble) {\r\n const top = bubble.getBoundingClientRect().top;\r\n const distance = savedPosition.top - top;\r\n scrollable.scrollTop += distance;\r\n } */\r\n } else if((topMessage && isJump) || isTarget) {\r\n const fromUp = maxBubbleId > 0 && (maxBubbleId < lastMsgId || lastMsgId < 0);\r\n const followingUnread = readMaxId === lastMsgId && !isTarget;\r\n if(!fromUp && samePeer) {\r\n scrollable.scrollTop = 99999;\r\n } else if(fromUp/* && (samePeer || forwardingUnread) */) {\r\n scrollable.scrollTop = 0;\r\n }\r\n\r\n const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\r\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\r\n if(!bubble?.parentElement) {\r\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\r\n }\r\n \r\n // ! sometimes there can be no bubble\r\n if(bubble) {\r\n this.scrollToBubble(bubble, followingUnread ? 'start' : 'center', !samePeer ? FocusDirection.Static : undefined);\r\n if(!followingUnread) {\r\n this.highlightBubble(bubble);\r\n }\r\n }\r\n } else {\r\n scrollable.scrollTop = 99999;\r\n }\r\n\r\n this.onScroll();\r\n\r\n const middleware = this.getMiddleware();\r\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\r\n afterSetPromise.then(() => { // check whether list isn't full\r\n scrollable.checkForTriggers();\r\n });\r\n\r\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\r\n\r\n const needFetchInterval = this.appMessagesManager.isFetchIntervalNeeded(peerId);\r\n const needFetchNew = savedPosition || needFetchInterval;\r\n if(!needFetchNew) {\r\n // warning\r\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\r\n this.setLoaded('bottom', true);\r\n }\r\n } else {\r\n afterSetPromise.then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n scrollable.checkForTriggers();\r\n\r\n if(needFetchInterval) {\r\n const f = () => {\r\n this.fetchNewPromise = new Promise((resolve) => {\r\n if(!middleware() || !this.appMessagesManager.isFetchIntervalNeeded(peerId)) {\r\n resolve();\r\n return;\r\n }\r\n \r\n this.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((historyStorage) => {\r\n if(!middleware() || !historyStorage) {\r\n resolve();\r\n return;\r\n }\r\n \r\n const slice = historyStorage.history.slice;\r\n const isBottomEnd = slice.isEnd(SliceEnd.Bottom);\r\n if(scrollable.loadedAll.bottom && scrollable.loadedAll.bottom !== isBottomEnd) {\r\n this.setLoaded('bottom', isBottomEnd);\r\n this.onScroll();\r\n }\r\n\r\n setTimeout(f, 30e3);\r\n resolve();\r\n });\r\n }).finally(() => {\r\n this.fetchNewPromise = undefined;\r\n });\r\n };\r\n \r\n if(samePeer) {\r\n setTimeout(f, 30e3);\r\n } else {\r\n f();\r\n }\r\n }\r\n });\r\n }\r\n \r\n this.log('scrolledAllDown:', scrollable.loadedAll.bottom);\r\n\r\n //if(!this.unreaded.length && dialog) { // lol\r\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\r\n this.onScrolledAllDown();\r\n }\r\n\r\n if(chatType === 'chat') {\r\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\r\n if(dialog?.pFlags.unread_mark) {\r\n this.appMessagesManager.markDialogUnread(peerId, true);\r\n }\r\n }\r\n\r\n //this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\r\n\r\n /* if(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\r\n return new Promise((resolve) => fastRaf(resolve));\r\n } */\r\n //console.timeEnd('appImManager setPeer');\r\n }).catch(err => {\r\n this.log.error('getHistory promise error:', err);\r\n this.preloader.detach();\r\n throw err;\r\n });\r\n\r\n return {cached, promise: setPeerPromise};\r\n }\r\n\r\n public onScrolledAllDown() {\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n const storage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n this.appMessagesManager.readHistory(this.peerId, storage.maxId, this.chat.threadId, true);\r\n }\r\n }\r\n\r\n public finishPeerChange() {\r\n const isChannel = this.appPeersManager.isChannel(this.peerId);\r\n const canWrite = this.chat.canSend();\r\n \r\n this.chatInner.classList.toggle('has-rights', canWrite);\r\n this.bubblesContainer.classList.toggle('is-chat-input-hidden', !canWrite);\r\n\r\n this.chatInner.classList.toggle('is-chat', this.chat.isAnyGroup());\r\n this.chatInner.classList.toggle('is-channel', isChannel);\r\n }\r\n\r\n public renderMessagesQueue(message: any, bubble: HTMLElement, reverse: boolean, promises: Promise[]) {\r\n /* let dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(reverse) dateMessage.container.insertBefore(bubble, dateMessage.div.nextSibling);\r\n else dateMessage.container.append(bubble);\r\n return; */\r\n\r\n /* if(DEBUG && message.mid === 4314759167) {\r\n this.log('renderMessagesQueue', message, bubble, reverse, promises);\r\n } */\r\n\r\n this.messagesQueue.push({message, bubble, reverse, promises});\r\n\r\n return this.setMessagesQueuePromise(); \r\n }\r\n\r\n public setMessagesQueuePromise() {\r\n if(this.messagesQueuePromise || !this.messagesQueue.length) return Promise.resolve();\r\n\r\n return this.messagesQueuePromise = new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n const queue = this.messagesQueue.slice();\r\n this.messagesQueue.length = 0;\r\n\r\n const promises = queue.reduce((acc, {promises}) => (acc.push(...promises), acc), []);\r\n\r\n // promises.push(pause(200));\r\n\r\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\r\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\r\n // promises.push(getHeavyAnimationPromise());\r\n\r\n this.log('promises to call', promises, queue, this.isHeavyAnimationInProgress);\r\n const middleware = this.getMiddleware();\r\n Promise.all(promises).then(() => {\r\n if(!middleware()) {\r\n throw 'setMessagesQueuePromise: peer changed!';\r\n }\r\n\r\n if(this.messagesQueueOnRender) {\r\n this.messagesQueueOnRender();\r\n }\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n\r\n queue.forEach(({message, bubble, reverse}) => {\r\n this.setBubblePosition(bubble, message, reverse);\r\n });\r\n\r\n //setTimeout(() => {\r\n resolve();\r\n //}, 500);\r\n this.messagesQueuePromise = null;\r\n\r\n if(this.messagesQueue.length) {\r\n this.setMessagesQueuePromise();\r\n }\r\n\r\n this.setUnreadDelimiter(); // не нашёл места лучше\r\n // this.setStickyDateManually();\r\n }).catch(reject);\r\n }, 0);\r\n });\r\n\r\n //this.messagesQueuePromise.catch(() => {});\r\n }\r\n\r\n public setBubblePosition(bubble: HTMLElement, message: Message.message | Message.messageService, reverse: boolean) {\r\n if(message.pFlags.local) {\r\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\r\n return;\r\n }\r\n\r\n const dateMessage = this.getDateContainerByMessage(message, reverse);\r\n if(this.chat.type === 'scheduled' || this.chat.type === 'pinned'/* || true */) { // ! TEMP COMMENTED\r\n const offset = this.stickyIntersector ? 2 : 1;\r\n let children = Array.from(dateMessage.container.children).slice(offset) as HTMLElement[];\r\n let i = 0, foundMidOnSameTimestamp = 0;\r\n for(; i < children.length; ++i) {\r\n const t = children[i];\r\n const timestamp = +t.dataset.timestamp;\r\n if(message.date < timestamp) {\r\n break;\r\n } else if(message.date === timestamp) {\r\n foundMidOnSameTimestamp = +t.dataset.mid;\r\n }\r\n \r\n if(foundMidOnSameTimestamp && message.mid < foundMidOnSameTimestamp) {\r\n break;\r\n }\r\n }\r\n \r\n // * 1 for date, 1 for date sentinel\r\n let index = offset + i;\r\n /* if(bubble.parentElement) { // * if already mounted\r\n const currentIndex = whichChild(bubble);\r\n if(index > currentIndex) {\r\n index -= 1; // * minus for already mounted\r\n }\r\n } */\r\n \r\n positionElementByIndex(bubble, dateMessage.container, index);\r\n } else {\r\n if(reverse) {\r\n dateMessage.container.insertBefore(bubble, dateMessage.container.children[this.stickyIntersector ? 1 : 0].nextSibling);\r\n } else {\r\n dateMessage.container.append(bubble);\r\n }\r\n }\r\n\r\n if(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._))) {\r\n this.bubbleGroups.addBubble(bubble, message, reverse);\r\n } else {\r\n bubble.classList.add('is-group-first', 'is-group-last');\r\n }\r\n }\r\n\r\n public getMiddleware(additionalCallback?: () => boolean) {\r\n return this.middleware.get(additionalCallback);\r\n }\r\n \r\n // reverse means top\r\n private renderMessage(message: Message.message | Message.messageService, reverse = false, multipleRender = false, bubble: HTMLElement = null, updatePosition = true) {\r\n /* if(DEBUG) {\r\n this.log.debug('message to render:', message);\r\n } */\r\n if(!bubble && this.bubbles[message.mid]) {\r\n return;\r\n }\r\n\r\n const isMessage = message._ === 'message';\r\n const groupId = isMessage && message.grouped_id;\r\n\r\n //return;\r\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\r\n if(message.deleted) return;\r\n else if(groupId && albumMustBeRenderedFull) { // will render only last album's message\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n const maxId = Math.max(...storage.keys());\r\n if(message.mid < maxId) {\r\n return;\r\n }\r\n }\r\n \r\n const peerId = this.peerId;\r\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\r\n const our = message.fromId === rootScope.myId || (message.pFlags.out && this.appPeersManager.isMegagroup(this.peerId));\r\n \r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('message');\r\n \r\n //messageDiv.innerText = message.message;\r\n\r\n let bubbleContainer: HTMLDivElement;\r\n let contentWrapper: HTMLElement;\r\n \r\n // bubble\r\n if(!bubble) {\r\n contentWrapper = document.createElement('div');\r\n contentWrapper.classList.add('bubble-content-wrapper');\r\n \r\n bubbleContainer = document.createElement('div');\r\n bubbleContainer.classList.add('bubble-content');\r\n \r\n bubble = document.createElement('div');\r\n bubble.classList.add('bubble');\r\n contentWrapper.appendChild(bubbleContainer);\r\n bubble.appendChild(contentWrapper);\r\n\r\n if(!our && !message.pFlags.out && this.unreadedObserver) {\r\n //this.log('not our message', message, message.pFlags.unread);\r\n const isUnread = message.pFlags.unread || \r\n this.appMessagesManager.isMentionUnread(message) || \r\n (this.historyStorage.readMaxId !== undefined && this.historyStorage.readMaxId < message.mid);\r\n if(isUnread) {\r\n this.unreadedObserver.observe(bubble); \r\n this.unreaded.set(bubble, message.mid);\r\n }\r\n }\r\n } else {\r\n const save = ['is-highlighted', 'is-group-first', 'is-group-last'];\r\n const wasClassNames = bubble.className.split(' ');\r\n const classNames = ['bubble'].concat(save.filter(c => wasClassNames.includes(c)));\r\n bubble.className = classNames.join(' ');\r\n\r\n contentWrapper = bubble.lastElementChild as HTMLElement;\r\n if(!contentWrapper.classList.contains('bubble-content-wrapper')) {\r\n contentWrapper = bubble.querySelector('.bubble-content-wrapper');\r\n }\r\n \r\n bubbleContainer = contentWrapper.firstElementChild as HTMLDivElement;\r\n bubbleContainer.innerHTML = '';\r\n bubbleContainer.style.cssText = '';\r\n contentWrapper.innerHTML = '';\r\n contentWrapper.appendChild(bubbleContainer);\r\n //bubbleContainer.style.marginBottom = '';\r\n const transitionDelay = contentWrapper.style.transitionDelay;\r\n contentWrapper.style.cssText = '';\r\n contentWrapper.style.transitionDelay = transitionDelay;\r\n\r\n if(bubble === this.firstUnreadBubble) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n // * Нужно очистить прошлую информацию, полезно если удалить последний элемент из альбома в ПОСЛЕДНЕМ БАББЛЕ ГРУППЫ (видно по аватару)\r\n const originalMid = +bubble.dataset.mid;\r\n const sameMid = +message.mid === originalMid;\r\n /* if(updatePosition) {\r\n bubble.remove(); // * for positionElementByIndex\r\n } */\r\n\r\n if(!sameMid) {\r\n delete this.bubbles[originalMid];\r\n this.skippedMids.delete(originalMid);\r\n }\r\n\r\n //bubble.innerHTML = '';\r\n }\r\n\r\n // ! reset due to album edit or delete item\r\n this.bubbles[+message.mid] = bubble;\r\n bubble.dataset.mid = '' + message.mid;\r\n bubble.dataset.peerId = '' + message.peerId;\r\n bubble.dataset.timestamp = '' + message.date;\r\n\r\n const loadPromises: Promise[] = [];\r\n\r\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\r\n const action = message.action;\r\n if(action) {\r\n const _ = action._;\r\n if(IGNORE_ACTIONS.has(_) || (langPack.hasOwnProperty(_) && !langPack[_])) {\r\n this.skippedMids.add(+message.mid);\r\n return bubble;\r\n }\r\n }\r\n\r\n bubble.className = 'bubble service';\r\n\r\n bubbleContainer.innerHTML = '';\r\n const s = document.createElement('div');\r\n s.classList.add('service-msg');\r\n if(action) {\r\n if(action._ === 'messageActionChannelMigrateFrom') {\r\n s.append(i18n('ChatMigration.From', [new PeerTitle({peerId: action.chat_id.toPeerId(true)}).element]));\r\n } else if(action._ === 'messageActionChatMigrateTo') {\r\n s.append(i18n('ChatMigration.To', [new PeerTitle({peerId: action.channel_id.toPeerId(true)}).element]));\r\n } else {\r\n s.append(this.appMessagesManager.wrapMessageActionTextNew(message));\r\n }\r\n }\r\n bubbleContainer.append(s);\r\n\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n\r\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\r\n bubble.classList.add('is-group-last');\r\n }\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n let messageMedia: MessageMedia = isMessage && message.media;\r\n\r\n let messageMessage: string, totalEntities: MessageEntity[];\r\n if(isMessage) {\r\n if((messageMedia as MessageMedia.messageMediaDocument)?.document && \r\n !['video', 'gif'].includes(((messageMedia as MessageMedia.messageMediaDocument).document as MyDocument).type)) {\r\n // * just filter these cases for documents caption\r\n } else if(groupId && albumMustBeRenderedFull) {\r\n const t = this.appMessagesManager.getAlbumText(groupId);\r\n messageMessage = t.message;\r\n //totalEntities = t.entities;\r\n totalEntities = t.totalEntities;\r\n } else if(((messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument)?.type !== 'sticker') {\r\n messageMessage = message.message;\r\n //totalEntities = message.entities;\r\n totalEntities = message.totalEntities;\r\n }\r\n } else {\r\n if(message.action._ === 'messageActionPhoneCall') {\r\n messageMedia = {\r\n _: 'messageMediaCall',\r\n action: message.action\r\n };\r\n }\r\n }\r\n \r\n /* let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities\r\n }); */\r\n let richText = RichTextProcessor.wrapRichText(messageMessage, {\r\n entities: totalEntities,\r\n passEntities: this.passEntities\r\n });\r\n\r\n let canHaveTail = true;\r\n let isStandaloneMedia = false;\r\n let needToSetHTML = true;\r\n if(totalEntities && !messageMedia) {\r\n let emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji');\r\n let strLength = messageMessage.length;\r\n let emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\r\n \r\n if(emojiStrLength === strLength && emojiEntities.length <= 3 && totalEntities.length === emojiEntities.length) {\r\n if(rootScope.settings.emoji.big) {\r\n let sticker = this.appStickersManager.getAnimatedEmojiSticker(messageMessage);\r\n if(emojiEntities.length === 1 && !messageMedia && sticker) {\r\n messageMedia = {\r\n _: 'messageMediaDocument',\r\n document: sticker\r\n };\r\n } else {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n attachmentDiv.innerHTML = richText;\r\n \r\n bubble.classList.add('emoji-' + emojiEntities.length + 'x');\r\n \r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n bubble.classList.add('is-message-empty', 'emoji-big');\r\n isStandaloneMedia = true;\r\n canHaveTail = false;\r\n needToSetHTML = false;\r\n }\r\n \r\n bubble.classList.add('can-have-big-emoji');\r\n }\r\n \r\n /* if(strLength === emojiStrLength) {\r\n messageDiv.classList.add('emoji-only');\r\n messageDiv.classList.add('message-empty');\r\n } */\r\n }\r\n\r\n if(needToSetHTML) {\r\n setInnerHTML(messageDiv, richText);\r\n }\r\n \r\n const timeSpan = MessageRender.setTime(this.chat, message, bubble, bubbleContainer, messageDiv);\r\n bubbleContainer.prepend(messageDiv);\r\n //bubble.prepend(timeSpan, messageDiv); // that's bad\r\n\r\n if(isMessage && message.views) {\r\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\r\n const forward = document.createElement('div');\r\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\r\n bubbleContainer.prepend(forward);\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n if(!message.pFlags.is_outgoing && this.viewsObserver) {\r\n this.viewsObserver.observe(bubble);\r\n }\r\n }\r\n\r\n const replyMarkup = isMessage && message.reply_markup;\r\n if(replyMarkup && replyMarkup._ === 'replyInlineMarkup' && replyMarkup.rows && replyMarkup.rows.length) {\r\n const rows = replyMarkup.rows;\r\n\r\n const containerDiv = document.createElement('div');\r\n containerDiv.classList.add('reply-markup');\r\n rows.forEach((row) => {\r\n const buttons = row.buttons;\r\n if(!buttons || !buttons.length) return;\r\n\r\n const rowDiv = document.createElement('div');\r\n rowDiv.classList.add('reply-markup-row');\r\n\r\n buttons.forEach((button) => {\r\n const text = RichTextProcessor.wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\r\n\r\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\r\n \r\n switch(button._) {\r\n case 'keyboardButtonUrl': {\r\n const r = RichTextProcessor.wrapRichText(' ', {\r\n entities: [{\r\n _: 'messageEntityTextUrl',\r\n length: 1,\r\n offset: 0,\r\n url: button.url\r\n }]\r\n });\r\n\r\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\r\n buttonEl.classList.add('is-link', 'tgico');\r\n\r\n break;\r\n }\r\n\r\n case 'keyboardButtonSwitchInline': {\r\n buttonEl = document.createElement('button');\r\n buttonEl.classList.add('is-switch-inline', 'tgico');\r\n attachClickEvent(buttonEl, (e) => {\r\n cancelEvent(e);\r\n\r\n const botId = message.viaBotId || message.fromId;\r\n let promise: Promise;\r\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\r\n else promise = this.appInlineBotsManager.checkSwitchReturn(botId).then(peerId => {\r\n if(peerId) {\r\n return peerId;\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n const popup = new PopupForward({\r\n [this.peerId]: []\r\n }, (peerId) => {\r\n resolve(peerId);\r\n }, true);\r\n\r\n popup.addEventListener('close', () => {\r\n reject();\r\n });\r\n });\r\n });\r\n \r\n promise.then(peerId => {\r\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\r\n this.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\r\n });\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n buttonEl = document.createElement('button');\r\n break;\r\n }\r\n }\r\n \r\n buttonEl.classList.add('reply-markup-button', 'rp');\r\n buttonEl.insertAdjacentHTML('beforeend', text);\r\n\r\n ripple(buttonEl);\r\n\r\n rowDiv.append(buttonEl);\r\n });\r\n\r\n containerDiv.append(rowDiv);\r\n });\r\n\r\n attachClickEvent(containerDiv, (e) => {\r\n let target = e.target as HTMLElement;\r\n \r\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\r\n if(!target || target.classList.contains('is-link') || target.classList.contains('is-switch-inline')) return;\r\n\r\n cancelEvent(e);\r\n\r\n const column = whichChild(target);\r\n const row = rows[whichChild(target.parentElement)];\r\n\r\n if(!row.buttons || !row.buttons[column]) {\r\n this.log.warn('no such button', row, column, message);\r\n return;\r\n }\r\n\r\n const button = row.buttons[column];\r\n this.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button);\r\n });\r\n\r\n canHaveTail = false;\r\n bubble.classList.add('with-reply-markup');\r\n contentWrapper.append(containerDiv);\r\n }\r\n \r\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\r\n if(our) {\r\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\r\n let status = '';\r\n if(isOutgoing) status = 'is-sending';\r\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\r\n bubble.classList.add(status);\r\n }\r\n\r\n const messageWithReplies = isMessage && this.appMessagesManager.getMessageWithReplies(message);\r\n const withReplies = !!messageWithReplies && message.mid > 0;\r\n\r\n if(withReplies) {\r\n bubble.classList.add('with-replies');\r\n }\r\n\r\n const fwdFrom = isMessage && message.fwd_from;\r\n const fwdFromId = isMessage && message.fwdFromId;\r\n\r\n const isOut = our && (!fwdFrom || this.peerId !== rootScope.myId);\r\n let nameContainer: HTMLElement = bubbleContainer;\r\n\r\n // media\r\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\r\n let attachmentDiv = document.createElement('div');\r\n attachmentDiv.classList.add('attachment');\r\n \r\n if(!messageMessage) {\r\n bubble.classList.add('is-message-empty');\r\n }\r\n \r\n let processingWebPage = false;\r\n \r\n /* if(isMessage) */switch(messageMedia._) {\r\n case 'messageMediaPhoto': {\r\n const photo = messageMedia.photo;\r\n ////////this.log('messageMediaPhoto', photo);\r\n\r\n if(!messageMessage) {\r\n canHaveTail = false;\r\n }\r\n \r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name'); \r\n }\r\n\r\n bubble.classList.add('photo');\r\n \r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n \r\n break;\r\n }\r\n \r\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapPhoto({\r\n photo: photo as Photo.photo, \r\n message,\r\n container: attachmentDiv,\r\n withTail, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n\r\n break;\r\n }\r\n \r\n case 'messageMediaWebPage': {\r\n processingWebPage = true;\r\n \r\n let webpage: WebPage = messageMedia.webpage;\r\n ////////this.log('messageMediaWebPage', webpage);\r\n if(webpage._ !== 'webPage') {\r\n break;\r\n } \r\n \r\n bubble.classList.add('webpage');\r\n \r\n let box = document.createElement('div');\r\n box.classList.add('web');\r\n \r\n let quote = document.createElement('div');\r\n quote.classList.add('quote');\r\n\r\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\r\n const photo: Photo.photo = webpage.photo as any;\r\n if(photo || webpage.document) {\r\n previewResizer = document.createElement('div');\r\n previewResizer.classList.add('preview-resizer');\r\n preview = document.createElement('div');\r\n preview.classList.add('preview');\r\n previewResizer.append(preview);\r\n }\r\n \r\n const doc = webpage.document as MyDocument;\r\n if(doc) {\r\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\r\n //if(doc.size <= 20e6) {\r\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\r\n if(doc.type === 'round') {\r\n bubble.classList.add('round');\r\n preview.classList.add('is-round');\r\n } else {\r\n bubble.classList.add('video');\r\n }\r\n wrapVideo({\r\n doc, \r\n container: preview, \r\n message: message as Message.message, \r\n boxWidth: mediaSize.width,\r\n boxHeight: mediaSize.height,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n isOut,\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n //}\r\n } else {\r\n const docDiv = wrapDocument({\r\n message,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\r\n\r\n if(previewResizer) {\r\n quoteTextDiv.append(previewResizer);\r\n }\r\n\r\n let t: HTMLElement;\r\n if(webpage.site_name) {\r\n const html = RichTextProcessor.wrapRichText(webpage.url);\r\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\r\n a.classList.add('webpage-name');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, RichTextProcessor.wrapEmojiText(webpage.site_name));\r\n a.textContent = '';\r\n a.append(strong);\r\n quoteTextDiv.append(a);\r\n t = a;\r\n }\r\n\r\n if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\r\n quoteTextDiv.append(textDiv);\r\n t = textDiv;\r\n }\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } else {\r\n box.classList.add('no-text');\r\n } */\r\n\r\n quote.append(quoteTextDiv);\r\n\r\n if(photo && !doc) {\r\n bubble.classList.add('photo');\r\n\r\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\r\n let isSquare = false;\r\n if(size.w === size.h && t) {\r\n bubble.classList.add('is-square-photo');\r\n isSquare = true;\r\n this.appPhotosManager.setAttachmentSize(photo, preview, 48, 48, false);\r\n\r\n /* if(t) {\r\n t.append(timeSpan);\r\n } */\r\n } else if(size.h > size.w) {\r\n bubble.classList.add('is-vertical-photo');\r\n }\r\n\r\n wrapPhoto({\r\n photo, \r\n message, \r\n container: preview, \r\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width, \r\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height, \r\n isOut, \r\n lazyLoadQueue: this.lazyLoadQueue, \r\n middleware: this.getMiddleware(),\r\n loadPromises,\r\n withoutPreloader: isSquare,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n }\r\n \r\n box.append(quote);\r\n \r\n //bubble.prepend(box);\r\n // if(timeSpan.parentElement === messageDiv) {\r\n messageDiv.insertBefore(box, timeSpan);\r\n // } else {\r\n // messageDiv.append(box);\r\n // }\r\n \r\n //this.log('night running', bubble.scrollHeight);\r\n \r\n break;\r\n }\r\n \r\n case 'messageMediaDocument': {\r\n const doc = messageMedia.document as MyDocument;\r\n\r\n //this.log('messageMediaDocument', doc, bubble);\r\n \r\n if(doc.sticker/* && doc.size <= 1e6 */) {\r\n bubble.classList.add('sticker');\r\n canHaveTail = false;\r\n isStandaloneMedia = true;\r\n \r\n if(doc.animated) {\r\n bubble.classList.add('sticker-animated');\r\n }\r\n \r\n const sizes = mediaSizes.active;\r\n const size = bubble.classList.contains('emoji-big') ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\r\n this.appPhotosManager.setAttachmentSize(doc, attachmentDiv, size.width, size.height);\r\n //let preloader = new ProgressivePreloader(attachmentDiv, false);\r\n bubbleContainer.style.height = attachmentDiv.style.height;\r\n bubbleContainer.style.width = attachmentDiv.style.width;\r\n //appPhotosManager.setAttachmentSize(doc, bubble);\r\n wrapSticker({\r\n doc, \r\n div: attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n emoji: bubble.classList.contains('emoji-big') ? messageMessage : undefined,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\r\n //this.log('never get free 2', doc);\r\n\r\n const isRound = doc.type === 'round';\r\n if(isRound) {\r\n isStandaloneMedia = true;\r\n }\r\n\r\n if(isRound || !messageMessage) {\r\n canHaveTail = false;\r\n }\r\n\r\n if(!message.viaBotId) {\r\n bubble.classList.add('hide-name');\r\n }\r\n \r\n bubble.classList.add(isRound ? 'round' : 'video');\r\n const storage = this.appMessagesManager.groupedMessagesStorage[groupId];\r\n if(groupId && storage.size !== 1 && albumMustBeRenderedFull) {\r\n bubble.classList.add('is-album', 'is-grouped');\r\n \r\n wrapAlbum({\r\n groupId: groupId, \r\n attachmentDiv,\r\n middleware: this.getMiddleware(),\r\n isOut: our,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n });\r\n } else {\r\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\r\n if(withTail) bubble.classList.add('with-media-tail');\r\n wrapVideo({\r\n doc, \r\n container: attachmentDiv, \r\n message: message as Message.message, \r\n boxWidth: mediaSizes.active.regular.width,\r\n boxHeight: mediaSizes.active.regular.height, \r\n withTail, \r\n isOut,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n middleware: this.getMiddleware(),\r\n group: CHAT_ANIMATION_GROUP,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n searchContext: isRound ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n }\r\n } else {\r\n\r\n const newNameContainer = wrapGroupedDocuments({\r\n albumMustBeRenderedFull,\r\n message,\r\n bubble,\r\n messageDiv,\r\n chat: this.chat,\r\n loadPromises,\r\n noAutoDownload: this.chat.noAutoDownloadMedia,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\r\n peerId: this.peerId,\r\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\r\n threadId: this.chat.threadId,\r\n useSearch: !(message as Message.message).pFlags.is_scheduled,\r\n isScheduled: (message as Message.message).pFlags.is_scheduled\r\n } : undefined,\r\n });\r\n\r\n if(newNameContainer) {\r\n nameContainer = newNameContainer;\r\n }\r\n\r\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document-size, .audio');\r\n lastContainer && lastContainer.append(timeSpan.cloneNode(true));\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\r\n processingWebPage = true;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaCall': {\r\n const action = messageMedia.action;\r\n const div = document.createElement('div');\r\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\r\n\r\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\r\n div.dataset.type = type;\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('bubble-call-title');\r\n\r\n _i18n(title, isOut ? \r\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') : \r\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('bubble-call-subtitle');\r\n\r\n if(action.duration !== undefined) {\r\n subtitle.append(formatCallDuration(action.duration));\r\n } else {\r\n let langPackKey: LangPackKey;\r\n switch(action.reason._) {\r\n case 'phoneCallDiscardReasonBusy':\r\n langPackKey = 'Call.StatusBusy';\r\n break;\r\n case 'phoneCallDiscardReasonMissed':\r\n langPackKey = 'Chat.Service.Call.Missed';\r\n break;\r\n // case 'phoneCallDiscardReasonHangup':\r\n default:\r\n langPackKey = 'Chat.Service.Call.Cancelled';\r\n break;\r\n }\r\n\r\n subtitle.classList.add('is-reason');\r\n _i18n(subtitle, langPackKey);\r\n }\r\n\r\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\r\n\r\n div.append(title, subtitle);\r\n\r\n processingWebPage = true;\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('call-message');\r\n messageDiv.append(div);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaContact': {\r\n //this.log('wrapping contact', message);\r\n\r\n const contact = messageMedia;\r\n const contactDiv = document.createElement('div');\r\n contactDiv.classList.add('contact');\r\n contactDiv.dataset.peerId = '' + contact.user_id;\r\n\r\n processingWebPage = true;\r\n\r\n const texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\r\n\r\n const avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.setAttribute('peer', '' + contact.user_id.toPeerId());\r\n avatarElem.classList.add('contact-avatar', 'avatar-54');\r\n\r\n contactDiv.prepend(avatarElem);\r\n\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.classList.add('contact-message');\r\n messageDiv.append(contactDiv);\r\n\r\n break;\r\n }\r\n\r\n case 'messageMediaPoll': {\r\n bubble.classList.remove('is-message-empty');\r\n \r\n const pollElement = wrapPoll(message);\r\n messageDiv.prepend(pollElement);\r\n messageDiv.classList.add('poll-message');\r\n\r\n break;\r\n }\r\n \r\n default:\r\n bubble.classList.remove('is-message-empty');\r\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\r\n this.log.warn('unrecognized media type:', messageMedia._, message);\r\n break;\r\n }\r\n \r\n if(!processingWebPage) {\r\n bubbleContainer.append(attachmentDiv);\r\n }\r\n\r\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\r\n bubble.classList.add('no-tail');\r\n\r\n if(!bubble.classList.contains('with-media-tail')) {\r\n bubble.classList.add('use-border-radius');\r\n }\r\n } */\r\n }\r\n\r\n if(isStandaloneMedia) {\r\n bubble.classList.add('just-media');\r\n }\r\n\r\n if(this.chat.selection.isSelecting) {\r\n this.chat.selection.toggleElementCheckbox(bubble, true);\r\n }\r\n\r\n let savedFrom = '';\r\n \r\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\r\n const needName = (message.fromId !== rootScope.myId && this.appPeersManager.isAnyChat(peerId) && !this.appPeersManager.isBroadcast(peerId)) || message.viaBotId || (message as Message.message).pFlags.sponsored;\r\n if(needName || fwdFrom || message.reply_to_mid) { // chat\r\n let title: HTMLElement | DocumentFragment;\r\n let titleVia: typeof title;\r\n\r\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\r\n \r\n let isHidden = fwdFrom && !fwdFrom.from_id;\r\n if(message.viaBotId) {\r\n titleVia = document.createElement('span');\r\n titleVia.innerText = '@' + this.appUsersManager.getUser(message.viaBotId).username;\r\n titleVia.classList.add('peer-title');\r\n bubble.classList.add('must-have-name');\r\n }\r\n \r\n if(isHidden) {\r\n ///////this.log('message to render hidden', message);\r\n title = document.createElement('span');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(fwdFrom.from_name);\r\n title.classList.add('peer-title');\r\n //title = fwdFrom.from_name;\r\n bubble.classList.add('hidden-profile');\r\n } else {\r\n title = new PeerTitle({peerId: fwdFromId || message.fromId}).element;\r\n }\r\n\r\n if(message.reply_to_mid && message.reply_to_mid !== this.chat.threadId && isMessage) {\r\n MessageRender.setReply({\r\n chat: this.chat,\r\n bubble,\r\n bubbleContainer,\r\n message\r\n });\r\n }\r\n \r\n //this.log(title);\r\n \r\n let nameDiv: HTMLElement;\r\n if((fwdFromId || fwdFrom)) {\r\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\r\n bubble.classList.add('forwarded');\r\n }\r\n \r\n if(message.savedFrom) {\r\n savedFrom = message.savedFrom;\r\n title.dataset.savedFrom = savedFrom;\r\n }\r\n \r\n nameDiv = document.createElement('div');\r\n title.dataset.peerId = '' + fwdFromId;\r\n\r\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(fwdFromId, false);\r\n nameDiv.append(title);\r\n } else {\r\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\r\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\r\n const args: FormatterArguments = [title];\r\n if(isStandaloneMedia) {\r\n args.unshift(document.createElement('br'));\r\n }\r\n nameDiv.append(i18n('ForwardedFrom', [args]));\r\n }\r\n } else if(!message.viaBotId) {\r\n if(!isStandaloneMedia && needName) {\r\n nameDiv = document.createElement('div');\r\n nameDiv.append(title);\r\n\r\n if(!our) {\r\n nameDiv.style.color = this.appPeersManager.getPeerColorById(message.fromId, false);\r\n }\r\n\r\n nameDiv.dataset.peerId = '' + message.fromId;\r\n } else /* if(!message.reply_to_mid) */ {\r\n bubble.classList.add('hide-name');\r\n }\r\n }\r\n\r\n if(message.viaBotId) {\r\n if(!nameDiv) {\r\n nameDiv = document.createElement('div');\r\n } else {\r\n nameDiv.append(' ');\r\n }\r\n\r\n const span = document.createElement('span');\r\n span.append(i18n('ViaBot'), ' ', titleVia);\r\n span.classList.add('is-via');\r\n\r\n nameDiv.append(span);\r\n }\r\n\r\n if(nameDiv) {\r\n nameDiv.classList.add('name');\r\n nameContainer.append(nameDiv);\r\n }\r\n\r\n const needAvatar = this.chat.isAnyGroup() && !isOut;\r\n if(needAvatar) {\r\n let avatarElem = new AvatarElement();\r\n avatarElem.lazyLoadQueue = this.lazyLoadQueue;\r\n avatarElem.classList.add('user-avatar', 'avatar-40');\r\n avatarElem.loadPromises = loadPromises;\r\n\r\n if(!fwdFromId && fwdFrom && fwdFrom.from_name) {\r\n avatarElem.setAttribute('peer-title', /* '🔥 FF 🔥' */fwdFrom.from_name);\r\n }\r\n\r\n avatarElem.setAttribute('peer', '' + (((fwdFrom && (this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID));\r\n //avatarElem.update();\r\n \r\n //this.log('exec loadDialogPhoto', message);\r\n\r\n contentWrapper.append(avatarElem);\r\n }\r\n } else {\r\n bubble.classList.add('hide-name');\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n savedFrom = `${this.chat.peerId}_${message.mid}`;\r\n }\r\n\r\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\r\n if(isThreadStarter) {\r\n bubble.classList.add('is-thread-starter', 'is-group-last');\r\n }\r\n\r\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\r\n const goto = document.createElement('div');\r\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\r\n bubbleContainer.append(goto);\r\n bubble.dataset.savedFrom = savedFrom;\r\n bubble.classList.add('with-beside-button');\r\n }\r\n \r\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\r\n if(updatePosition) {\r\n this.renderMessagesQueue(message, bubble, reverse, loadPromises);\r\n }\r\n\r\n if(withReplies) {\r\n const isFooter = MessageRender.renderReplies({\r\n bubble,\r\n bubbleContainer,\r\n message: messageWithReplies,\r\n messageDiv,\r\n loadPromises,\r\n lazyLoadQueue: this.lazyLoadQueue\r\n });\r\n\r\n if(isFooter) {\r\n canHaveTail = true;\r\n }\r\n }\r\n\r\n if(canHaveTail) {\r\n bubble.classList.add('can-have-tail');\r\n\r\n bubbleContainer.append(generateTail());\r\n }\r\n\r\n return bubble;\r\n }\r\n\r\n private safeRenderMessage(message: any, reverse?: boolean, multipleRender?: boolean, bubble?: HTMLElement, updatePosition?: boolean) {\r\n try {\r\n return this.renderMessage(message, reverse, multipleRender, bubble, updatePosition);\r\n } catch(err) {\r\n this.log.error('renderMessage error:', err);\r\n }\r\n }\r\n\r\n public async performHistoryResult(history: (Message.message | Message.messageService | number)[], reverse: boolean, isBackLimit: boolean, additionMsgId?: number) {\r\n // commented bot getProfile in getHistory!\r\n // if(!history/* .filter((id: number) => id > 0) */.length) {\r\n // if(!isBackLimit) {\r\n // this.scrollable.loadedAll.top = true;\r\n\r\n // /* if(this.chat.type === 'discussion') {\r\n // const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n // if(serviceStartMessageId) history.push(serviceStartMessageId);\r\n // history.push(this.chat.threadId);\r\n // } */\r\n // } else {\r\n // this.scrollable.loadedAll.bottom = true;\r\n // }\r\n // }\r\n\r\n history = history.slice(); // need\r\n\r\n if(additionMsgId) {\r\n history.unshift(additionMsgId);\r\n }\r\n\r\n /* if(testScroll && additionMsgID) {\r\n for(let i = 0; i < 3; ++i) {\r\n let _history = history.slice();\r\n setTimeout(() => {\r\n this.performHistoryResult(_history, reverse, isBackLimit, 0, resetPromises);\r\n }, 0);\r\n }\r\n } */\r\n\r\n //console.time('appImManager render history');\r\n\r\n //await new Promise((resolve) => setTimeout(resolve, 1e3));\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will render some messages:', history.length, this.isHeavyAnimationInProgress, this.messagesQueuePromise);\r\n } */\r\n\r\n //const padding = 10000;\r\n //const realLength = this.scrollable.container.childElementCount;\r\n let previousScrollHeightMinusTop: number/* , previousScrollHeight: number */;\r\n //if(realLength > 0/* && (reverse || isSafari) */) { // for safari need set when scrolling bottom too\r\n //if(!this.scrollable.isHeavyScrolling) {\r\n this.messagesQueueOnRender = () => {\r\n const {scrollTop, scrollHeight} = this.scrollable;\r\n\r\n //previousScrollHeight = scrollHeight;\r\n //previousScrollHeight = scrollHeight + padding;\r\n previousScrollHeightMinusTop = reverse ? scrollHeight - scrollTop : scrollTop;\r\n\r\n //this.chatInner.style.paddingTop = padding + 'px';\r\n /* if(reverse) {\r\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\r\n } else {\r\n previousScrollHeightMinusTop = scrollTop;\r\n } */\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: messagesQueueOnRender, scrollTop:', scrollTop, scrollHeight, previousScrollHeightMinusTop);\r\n } */\r\n this.messagesQueueOnRender = undefined;\r\n };\r\n //}\r\n //}\r\n\r\n if(this.needReflowScroll) {\r\n reflowScrollableElement(this.scrollable.container);\r\n this.needReflowScroll = false;\r\n }\r\n\r\n const cb = (mid: typeof history[0]) => {\r\n const message: Message.message | Message.messageService = typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\r\n if(message.pFlags.local) {\r\n this.processLocalMessageRender(message);\r\n } else {\r\n this.safeRenderMessage(message, reverse, true);\r\n }\r\n };\r\n\r\n const length = history.length;\r\n if(reverse) for(let i = 0; i < length; ++i) cb(history[i]);\r\n else for(let i = length - 1; i >= 0; --i) cb(history[i]);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n const firstSlice = historyStorage.history.first;\r\n const lastSlice = historyStorage.history.last;\r\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\r\n this.setLoaded('bottom', true, false);\r\n }\r\n \r\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\r\n this.setLoaded('top', true, false);\r\n }\r\n } else {\r\n this.setLoaded('top', true);\r\n this.setLoaded('bottom', true);\r\n }\r\n\r\n await this.messagesQueuePromise;//.then(() => new Promise(resolve => setTimeout(resolve, 100)))\r\n\r\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.messagesQueueOnRenderAdditional();\r\n }\r\n }\r\n\r\n if(previousScrollHeightMinusTop !== undefined) {\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\r\n /* const scrollHeight = this.scrollable.scrollHeight;\r\n const addedHeight = scrollHeight - previousScrollHeight;\r\n \r\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\r\n \r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n this.log('performHistoryResult: will set scrollTop', \r\n previousScrollHeightMinusTop, this.scrollable.scrollHeight, \r\n newScrollTop, this.scrollable.container.clientHeight); */\r\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n const newScrollTop = reverse ? this.scrollable.scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\r\n \r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\r\n } */\r\n\r\n // touchSupport for safari iOS\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = 'hidden');\r\n this.scrollable.scrollTop = newScrollTop;\r\n //this.scrollable.scrollTop = this.scrollable.scrollHeight;\r\n //isTouchSupported && isApple && (this.scrollable.container.style.overflow = '');\r\n\r\n this.scrollable.lastScrollTop = newScrollTop;\r\n this.scrollable.lastScrollDirection = 0;\r\n\r\n if(IS_SAFARI/* && !isAppleMobile */) { // * fix blinking and jumping\r\n reflowScrollableElement(this.scrollable.container);\r\n }\r\n\r\n /* if(DEBUG) {\r\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, this.scrollable.scrollTop, this.scrollable.scrollHeight, this.isHeavyAnimationInProgress);\r\n } */\r\n }\r\n\r\n return true;\r\n }\r\n\r\n onDatePick = (timestamp: number) => {\r\n const peerId = this.peerId;\r\n this.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then(history => {\r\n if(!history?.messages?.length) {\r\n this.log.error('no history!');\r\n return;\r\n } else if(this.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\r\n //console.log('got history date:', history);\r\n });\r\n };\r\n\r\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\r\n //const middleware = this.getMiddleware();\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n return this.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\r\n } else if(this.chat.type === 'pinned') {\r\n const promise = this.appMessagesManager.getSearch({\r\n peerId: this.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId, \r\n limit: loadCount, \r\n backLimit\r\n })\r\n .then(value => ({history: value.history.map(m => m.mid)}));\r\n\r\n return promise;\r\n } else if(this.chat.type === 'scheduled') {\r\n return this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\r\n // this.setLoaded('top', true);\r\n // this.setLoaded('bottom', true);\r\n return {history: mids.slice().reverse()};\r\n });\r\n }\r\n }\r\n\r\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\r\n /* const middleware = this.getMiddleware();\r\n await this.ladderDeferred; */\r\n\r\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\r\n // @ts-ignore\r\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n return;\r\n }\r\n\r\n /* if(!middleware()) {\r\n return;\r\n } */\r\n\r\n if(!Object.keys(this.bubbles).length) {\r\n return;\r\n }\r\n\r\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\r\n\r\n if(isAdditionRender && additionMsgIds.length) {\r\n sortedMids = sortedMids.filter(mid => !additionMsgIds.includes(mid));\r\n }\r\n\r\n let targetMid: number;\r\n if(backLimit) {\r\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\r\n } else {\r\n if(additionMsgId) {\r\n targetMid = additionMsgId;\r\n } else { // * if maxId === 0\r\n targetMid = Math.max(...sortedMids);\r\n }\r\n }\r\n\r\n const topIds = sortedMids.slice(sortedMids.findIndex(mid => targetMid > mid));\r\n const middleIds = isAdditionRender ? [] : [targetMid];\r\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex(mid => targetMid >= mid)).reverse();\r\n \r\n if(DEBUG) {\r\n this.log('getHistory: targeting mid:', targetMid, maxId, additionMsgId, \r\n topIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)), \r\n bottomIds.map(m => this.appMessagesIdsManager.getServerMessageId(m)));\r\n }\r\n\r\n const setBubbles: HTMLElement[] = [];\r\n\r\n this.chatInner.classList.add('zoom-fading');\r\n const delay = isAdditionRender ? 10 : 40;\r\n const offsetIndex = isAdditionRender ? 0 : 1;\r\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\r\n const animationPromise = deferredPromise();\r\n let lastMsDelay = 0;\r\n mids.forEach((mid, idx) => {\r\n if(!this.bubbles[mid] || this.skippedMids.has(mid)) {\r\n this.log.warn('animateAsLadder: no bubble by mid:', mid);\r\n return;\r\n }\r\n\r\n const contentWrapper = this.bubbles[mid].lastElementChild as HTMLElement;\r\n\r\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\r\n //lastMsDelay = (idx + offsetIndex) * delay;\r\n //lastMsDelay = (idx || 0.1) * 1000;\r\n \r\n contentWrapper.classList.add('zoom-fade');\r\n contentWrapper.style.transitionDelay = lastMsDelay + 'ms';\r\n\r\n if(idx === (mids.length - 1)) {\r\n const onTransitionEnd = (e: TransitionEvent) => {\r\n if(e.target !== contentWrapper) {\r\n return;\r\n }\r\n\r\n animationPromise.resolve();\r\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\r\n };\r\n\r\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\r\n }\r\n \r\n //this.log('supa', bubble);\r\n\r\n setBubbles.push(contentWrapper);\r\n });\r\n\r\n if(!mids.length) {\r\n animationPromise.resolve();\r\n }\r\n\r\n return {lastMsDelay, animationPromise};\r\n };\r\n\r\n const topRes = animateAsLadder(topIds, offsetIndex);\r\n const middleRes = animateAsLadder(middleIds);\r\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\r\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\r\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\r\n\r\n if(this.onAnimateLadder) {\r\n await this.onAnimateLadder();\r\n }\r\n\r\n // fastRaf(() => {\r\n fastRaf(() => {\r\n this.setStickyDateManually(); // ! maybe it's not efficient\r\n\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.classList.remove('zoom-fade');\r\n });\r\n });\r\n // });\r\n\r\n let promise: Promise;\r\n if(topIds.length || middleIds.length || bottomIds.length) {\r\n promise = Promise.all(promises);\r\n\r\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\r\n .then(() => { \r\n fastRaf(() => {\r\n setBubbles.forEach(contentWrapper => {\r\n contentWrapper.style.transitionDelay = '';\r\n });\r\n\r\n this.chatInner.classList.remove('zoom-fading');\r\n });\r\n\r\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх, \r\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\r\n if(!IS_SAFARI) {\r\n this.needReflowScroll = true;\r\n }\r\n });\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private renderEmptyPlaceholder(type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting', bubble: HTMLElement, message: any, elements: (Node | string)[]) {\r\n const BASE_CLASS = 'empty-bubble-placeholder';\r\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\r\n\r\n let title: HTMLElement; \r\n if(type === 'group') title = i18n('GroupEmptyTitle1');\r\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\r\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\r\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\r\n title.classList.add('center', BASE_CLASS + '-title');\r\n\r\n elements.push(title);\r\n\r\n let listElements: HTMLElement[];\r\n if(type === 'group') {\r\n elements.push(i18n('GroupEmptyTitle2'));\r\n listElements = [\r\n i18n('GroupDescription1'),\r\n i18n('GroupDescription2'),\r\n i18n('GroupDescription3'),\r\n i18n('GroupDescription4')\r\n ];\r\n } else if(type === 'saved') {\r\n listElements = [\r\n i18n('ChatYourSelfDescription1'),\r\n i18n('ChatYourSelfDescription2'),\r\n i18n('ChatYourSelfDescription3'),\r\n i18n('ChatYourSelfDescription4')\r\n ];\r\n } else if(type === 'greeting') {\r\n const subtitle = i18n('NoMessagesGreetingsDescription');\r\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\r\n\r\n this.messagesQueue.findAndSplice(q => q.bubble === bubble);\r\n\r\n const stickerDiv = document.createElement('div');\r\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\r\n\r\n const middleware = this.getMiddleware();\r\n \r\n const loadPromise = this.appStickersManager.getGreetingSticker().then(doc => {\r\n if(!middleware()) return;\r\n\r\n const loadPromises: Promise[] = [];\r\n wrapSticker({\r\n doc, \r\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\r\n div: stickerDiv,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n group: CHAT_ANIMATION_GROUP,\r\n //play: !!message.pending || !multipleRender,\r\n play: true,\r\n loop: true,\r\n withThumb: true,\r\n loadPromises\r\n });\r\n\r\n attachClickEvent(stickerDiv, (e) => {\r\n cancelEvent(e);\r\n EmoticonsDropdown.onMediaClick({target: e.target});\r\n });\r\n\r\n return Promise.all(loadPromises);\r\n });\r\n\r\n this.renderMessagesQueue(message, bubble, false, [loadPromise]);\r\n\r\n elements.push(subtitle, stickerDiv);\r\n }\r\n\r\n if(listElements) {\r\n elements.push(\r\n ...listElements.map(elem => {\r\n const span = document.createElement('span');\r\n span.classList.add(BASE_CLASS + '-list-item');\r\n span.append(elem);\r\n return span;\r\n })\r\n );\r\n \r\n if(type === 'group') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add('tgico-check');\r\n elem.prepend(i);\r\n });\r\n } else if(type === 'saved') {\r\n listElements.forEach(elem => {\r\n const i = document.createElement('span');\r\n i.classList.add(BASE_CLASS + '-list-bullet');\r\n i.innerText = '•';\r\n elem.prepend(i);\r\n });\r\n }\r\n }\r\n\r\n if(elements.length > 1) {\r\n bubble.classList.add('has-description');\r\n }\r\n\r\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\r\n }\r\n\r\n private processLocalMessageRender(message: Message.message | Message.messageService) {\r\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\r\n const bubble = this.safeRenderMessage(message, undefined, undefined, undefined, isSponsored);\r\n bubble.classList.add('is-group-last', 'is-group-first');\r\n\r\n if(!isSponsored) {\r\n bubble.classList.add('bubble-first');\r\n bubble.classList.remove('can-have-tail', 'is-in');\r\n }\r\n\r\n const elements: (Node | string)[] = [];\r\n const isBot = this.appPeersManager.isBot(this.peerId);\r\n if(isSponsored) {\r\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\r\n\r\n bubble.classList.add('avoid-selection');\r\n\r\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\r\n const peerId = this.appPeersManager.getPeerId(sponsoredMessage.from_id);\r\n // const peer = this.appPeersManager.getPeer(peerId);\r\n if(sponsoredMessage.channel_post) {\r\n text = 'OpenChannelPost';\r\n mid = this.appMessagesIdsManager.generateMessageId(sponsoredMessage.channel_post);\r\n } else if(sponsoredMessage.start_param) {\r\n text = 'Chat.Message.ViewBot';\r\n startParam = sponsoredMessage.start_param;\r\n } else {\r\n text = this.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\r\n }\r\n\r\n if(sponsoredMessage.chat_invite) {\r\n callback = () => {\r\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite).show();\r\n };\r\n } else if(sponsoredMessage.chat_invite_hash) {\r\n callback = () => {\r\n const link: InternalLink = {\r\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\r\n invite: sponsoredMessage.chat_invite_hash\r\n };\r\n \r\n this.chat.appImManager.processInternalLink(link);\r\n };\r\n } else {\r\n callback = () => {\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid,\r\n startParam\r\n });\r\n };\r\n }\r\n\r\n const button = Button('btn-primary btn-primary-transparent bubble-view-button', {\r\n text\r\n });\r\n\r\n this.viewsObserver.observe(button); \r\n\r\n if(callback) {\r\n attachClickEvent(button, callback);\r\n }\r\n\r\n bubble.querySelector('.bubble-content').prepend(button);\r\n\r\n return;\r\n } else if(isBot && message._ === 'message') {\r\n const b = document.createElement('b');\r\n b.append(i18n('BotInfoTitle'));\r\n elements.push(b, '\\n\\n');\r\n } else if(this.appPeersManager.isAnyGroup(this.peerId) && this.appPeersManager.getPeer(this.peerId).pFlags.creator) {\r\n this.renderEmptyPlaceholder('group', bubble, message, elements);\r\n } else if(this.chat.type === 'scheduled') {\r\n this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\r\n } else if(rootScope.myId === this.peerId) {\r\n this.renderEmptyPlaceholder('saved', bubble, message, elements);\r\n } else if(this.appPeersManager.isUser(this.peerId) && !isBot && this.chat.canSend() && this.chat.type === 'chat') {\r\n this.renderEmptyPlaceholder('greeting', bubble, message, elements);\r\n } else {\r\n this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\r\n }\r\n\r\n /* for(let i = 1; i < elements.length; i += 2) {\r\n elements.splice(i, 0, '\\n');\r\n } */\r\n\r\n if(elements.length) {\r\n const messageDiv = bubble.querySelector('.message, .service-msg');\r\n messageDiv.prepend(...elements);\r\n }\r\n\r\n const method: 'append' | 'prepend' = isSponsored ? 'append' : 'prepend';\r\n if(this.messagesQueueOnRenderAdditional) {\r\n this.onAnimateLadder = () => {\r\n this.chatInner[method](bubble);\r\n this.onAnimateLadder = undefined;\r\n\r\n // need raf here because animation won't fire if this message is single\r\n if(!this.messagesQueuePromise) {\r\n return fastRafPromise();\r\n }\r\n };\r\n } else {\r\n this.chatInner[method](bubble);\r\n }\r\n\r\n // if(!isSponsored) {\r\n this.emptyPlaceholderMid = message.mid;\r\n // }\r\n }\r\n\r\n private generateLocalMessageId(addOffset = 0) {\r\n // const INCREMENT = 0x10;\r\n let offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\r\n // offset = this.appMessagesIdsManager.generateMessageId(offset);\r\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\r\n const id = -Math.abs(offset);\r\n const mid = -Math.abs(this.appMessagesIdsManager.generateMessageId(id));\r\n return {id, mid};\r\n }\r\n\r\n private generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): GenerateLocalMessageType {\r\n const {id, mid} = this.generateLocalMessageId(addOffset);\r\n const message: Omit & {message?: string} = {\r\n _: service ? 'messageService' : 'message',\r\n date: 0,\r\n id,\r\n mid,\r\n peer_id: this.appPeersManager.getOutputPeer(this.peerId),\r\n pFlags: {\r\n local: true\r\n }\r\n };\r\n\r\n if(!service) {\r\n message.message = '';\r\n }/* else {\r\n (message as Message.messageService).action = {} as any;\r\n } */\r\n\r\n assumeType>(message);\r\n\r\n fill && fill(message);\r\n\r\n this.appMessagesManager.saveMessages([message], {storage: new Map()});\r\n message.mid = mid;\r\n return message;\r\n }\r\n\r\n private setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\r\n const willChange = this.scrollable.loadedAll[side] !== value;\r\n if(!willChange) {\r\n return;\r\n }\r\n\r\n this.scrollable.loadedAll[side] = value;\r\n\r\n /* if(!checkPlaceholders) {\r\n return;\r\n } */\r\n\r\n if(side === 'bottom' && this.appPeersManager.isBroadcast(this.peerId)/* && false */) {\r\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\r\n if(value) {\r\n const middleware = this.getMiddleware(() => {\r\n return this.scrollable.loadedAll.bottom && !this.bubbles[mid] && this.getSponsoredMessagePromise === promise;\r\n });\r\n \r\n const promise = this.getSponsoredMessagePromise = this.chat.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\r\n channel: this.appChatsManager.getChannelInput(this.peerId.toChatId())\r\n }, {cacheSeconds: 300}).then(sponsoredMessages => {\r\n if(!middleware()) return;\r\n\r\n /* forEachReverse(sponsoredMessages.messages, (message, idx, arr) => {\r\n if(message.chat_invite || message.chat_invite_hash) {\r\n arr.splice(idx, 1);\r\n }\r\n }); */\r\n\r\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\r\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\r\n \r\n const sponsoredMessage = sponsoredMessages.messages.shift();\r\n if(!sponsoredMessage) {\r\n return;\r\n }\r\n\r\n sponsoredMessages.messages.push(sponsoredMessage);\r\n const message = this.generateLocalFirstMessage(false, (message) => {\r\n message.message = sponsoredMessage.message;\r\n message.from_id = sponsoredMessage.from_id;\r\n message.entities = sponsoredMessage.entities;\r\n message.pFlags.sponsored = true;\r\n message.sponsoredMessage = sponsoredMessage;\r\n }, SPONSORED_MESSAGE_ID_OFFSET);\r\n \r\n return Promise.all([\r\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\r\n this.messagesQueuePromise\r\n ]).then(() => {\r\n if(!middleware()) return;\r\n // this.processLocalMessageRender(message);\r\n const promise = this.performHistoryResult([message], false, true);\r\n });\r\n }).finally(() => {\r\n this.getSponsoredMessagePromise = undefined;\r\n });\r\n } else {\r\n this.deleteMessagesByIds([mid]);\r\n this.getSponsoredMessagePromise = undefined;\r\n }\r\n }\r\n\r\n if(side === 'top' && value && this.appPeersManager.isBot(this.peerId)) {\r\n this.log('inject bot description');\r\n\r\n const middleware = this.getMiddleware();\r\n return this.appProfileManager.getProfile(this.peerId.toUserId()).then(userFull => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(!userFull.bot_info?.description) {\r\n this.checkIfEmptyPlaceholderNeeded();\r\n return;\r\n }\r\n\r\n const message = this.generateLocalFirstMessage(false, message => {\r\n message.message = userFull.bot_info.description;\r\n });\r\n\r\n this.processLocalMessageRender(message);\r\n });\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n }\r\n\r\n public checkIfEmptyPlaceholderNeeded() {\r\n if(this.scrollable.loadedAll.top && \r\n this.scrollable.loadedAll.bottom && \r\n this.emptyPlaceholderMid === undefined && \r\n (\r\n !this.appMessagesManager.getHistoryStorage(this.peerId).count || \r\n (\r\n Object.keys(this.bubbles).length && \r\n !this.getRenderedLength()\r\n ) ||\r\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\r\n )\r\n ) {\r\n this.log('inject empty peer placeholder');\r\n\r\n const message = this.generateLocalFirstMessage(true);\r\n this.processLocalMessageRender(message);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Load and render history\r\n * @param maxId max message id\r\n * @param reverse 'true' means up\r\n * @param isBackLimit is search\r\n * @param additionMsgId for the last message\r\n * @param justLoad do not render\r\n */\r\n public getHistory(maxId = 0, reverse = false, isBackLimit = false, additionMsgId = 0, justLoad = false): {cached: boolean, promise: Promise} {\r\n const peerId = this.peerId;\r\n\r\n //console.time('appImManager call getHistory');\r\n const pageCount = Math.min(30, windowSize.height / 38/* * 1.25 */ | 0);\r\n //const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\r\n const realLoadCount = Object.keys(this.bubbles).length > 0/* || additionMsgId */ ? Math.max(40, pageCount) : pageCount;//const realLoadCount = 50;\r\n //const realLoadCount = pageCount;//const realLoadCount = 50;\r\n let loadCount = realLoadCount;\r\n \r\n /* if(TEST_SCROLL) {\r\n //loadCount = 1;\r\n if(Object.keys(this.bubbles).length > 0)\r\n return {cached: false, promise: Promise.resolve(true)};\r\n } */\r\n if(TEST_SCROLL !== undefined) {\r\n if(TEST_SCROLL) {\r\n if(Object.keys(this.bubbles).length > 0) {\r\n --TEST_SCROLL;\r\n }\r\n } else {\r\n return {cached: false, promise: Promise.resolve(true)};\r\n }\r\n }\r\n \r\n ////console.time('render history total');\r\n \r\n let backLimit = 0;\r\n if(isBackLimit) {\r\n backLimit = loadCount;\r\n\r\n if(!reverse) { // if not jump\r\n loadCount = 0;\r\n //maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\r\n }\r\n }\r\n\r\n let additionMsgIds: number[];\r\n if(additionMsgId && !isBackLimit) {\r\n if(this.chat.type === 'pinned') {\r\n additionMsgIds = [additionMsgId];\r\n } else {\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const slice = historyStorage.history.slice;\r\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\r\n additionMsgIds = slice.slice();\r\n\r\n // * filter last album, because we don't know is it the last item\r\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\r\n const message = this.chat.getMessage(additionMsgIds[i]);\r\n if(message.grouped_id) additionMsgIds.splice(i, 1);\r\n else break;\r\n }\r\n\r\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\r\n }\r\n }\r\n }\r\n\r\n /* const result = additionMsgID ? \r\n {history: [additionMsgID]} : \r\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\r\n let result: ReturnType | {history: number[]} = this.requestHistory(maxId, loadCount, backLimit) as any;\r\n let resultPromise: Promise;\r\n\r\n //const isFirstMessageRender = !!additionMsgID && result instanceof Promise && !appMessagesManager.getMessage(additionMsgID).grouped_id;\r\n const isAdditionRender = additionMsgIds?.length && result instanceof Promise;\r\n const isFirstMessageRender = (this.isFirstLoad && backLimit && result instanceof Promise) || isAdditionRender;\r\n if(isAdditionRender) {\r\n resultPromise = result as Promise;\r\n result = {history: additionMsgIds};\r\n //additionMsgID = 0;\r\n }\r\n\r\n this.isFirstLoad = false;\r\n\r\n const processResult = async(historyResult: typeof result) => {\r\n if('offsetIdOffset' in historyResult && historyResult.history.isEnd(SliceEnd.Top)) {\r\n if(this.chat.type === 'discussion') { // * inject discussion start\r\n //this.log('discussion got history', loadCount, backLimit, historyResult, isTopEnd);\r\n const serviceStartMessageId = this.appMessagesManager.threadsServiceMessagesIdsStorage[this.peerId + '_' + this.chat.threadId];\r\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\r\n historyResult.history.push(...this.chat.getMidsByMid(this.chat.threadId).reverse());\r\n }\r\n\r\n await this.setLoaded('top', true);\r\n }\r\n };\r\n\r\n const sup = (result: HistoryResult) => {\r\n /* if(maxId && result.history?.length) {\r\n if(this.bubbles[maxId]) {\r\n result.history.findAndSplice(mid => mid === maxId); \r\n }\r\n } */\r\n\r\n ////console.timeEnd('render history total');\r\n \r\n return getHeavyAnimationPromise().then(() => {\r\n return processResult(result);\r\n }).then(() => {\r\n return this.performHistoryResult(result.history || [], reverse, isBackLimit, !isAdditionRender && additionMsgId);\r\n });\r\n };\r\n\r\n const processPromise = (result: Promise) => {\r\n const promise = result.then((result) => {\r\n //this.log('getHistory not cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n\r\n if(reverse ? this.getHistoryTopPromise !== promise : this.getHistoryBottomPromise !== promise) {\r\n this.log.warn('getHistory: peer changed');\r\n ////console.timeEnd('render history total');\r\n return Promise.reject();\r\n }\r\n\r\n if(justLoad) {\r\n this.scrollable.onScroll(); // нужно делать из-за ранней прогрузки\r\n return true;\r\n }\r\n //console.timeEnd('appImManager call getHistory');\r\n\r\n return sup(result);\r\n }, (err) => {\r\n this.log.error('getHistory error:', err);\r\n throw err;\r\n });\r\n \r\n return promise;\r\n };\r\n\r\n let promise: Promise, cached: boolean;\r\n if(result instanceof Promise) {\r\n cached = false;\r\n promise = processPromise(result);\r\n } else if(justLoad) {\r\n return null;\r\n } else {\r\n cached = true;\r\n //this.log('getHistory cached result by maxId:', maxId, reverse, isBackLimit, result, peerId, justLoad);\r\n promise = sup(result as HistoryResult);\r\n //return (reverse ? this.getHistoryTopPromise = promise : this.getHistoryBottomPromise = promise);\r\n //return this.performHistoryResult(result.history || [], reverse, isBackLimit, additionMsgID, true);\r\n }\r\n\r\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\r\n\r\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\r\n let times = isAdditionRender ? 2 : 1;\r\n this.messagesQueueOnRenderAdditional = () => {\r\n this.log('ship went past rocks of magnets');\r\n\r\n if(--times) return;\r\n\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n \r\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\r\n promise.then(() => {\r\n setTimeout(() => { // preload messages\r\n this.loadMoreHistory(reverse, true);\r\n }, 0);\r\n });\r\n };\r\n } else {\r\n this.messagesQueueOnRenderAdditional = undefined;\r\n }\r\n\r\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\r\n waitPromise.then(() => {\r\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\r\n });\r\n\r\n if(justLoad) {\r\n return null;\r\n }\r\n\r\n /* false && */!isFirstMessageRender && promise.then(() => {\r\n if(reverse) {\r\n this.loadedTopTimes++;\r\n this.loadedBottomTimes = Math.max(0, --this.loadedBottomTimes);\r\n } else {\r\n this.loadedBottomTimes++;\r\n this.loadedTopTimes = Math.max(0, --this.loadedTopTimes);\r\n }\r\n\r\n let ids: number[];\r\n if((reverse && this.loadedTopTimes > 2) || (!reverse && this.loadedBottomTimes > 2)) {\r\n ids = getObjectKeysAndSort(this.bubbles);\r\n }\r\n\r\n //let removeCount = loadCount / 2;\r\n const safeCount = realLoadCount * 2; // cause i've been runningrunningrunning all day\r\n //this.log('getHistory: slice loadedTimes:', reverse, pageCount, this.loadedTopTimes, this.loadedBottomTimes, ids?.length, safeCount);\r\n if(ids && ids.length > safeCount) {\r\n if(reverse) {\r\n //ids = ids.slice(-removeCount);\r\n //ids = ids.slice(removeCount * 2);\r\n ids = ids.slice(safeCount);\r\n this.setLoaded('bottom', false);\r\n\r\n //this.log('getHistory: slice bottom messages:', ids.length, loadCount);\r\n //this.getHistoryBottomPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n } else {\r\n //ids = ids.slice(0, removeCount);\r\n //ids = ids.slice(0, ids.length - (removeCount * 2));\r\n ids = ids.slice(0, ids.length - safeCount);\r\n this.setLoaded('top', false);\r\n\r\n //this.log('getHistory: slice up messages:', ids.length, loadCount);\r\n //this.getHistoryTopPromise = undefined; // !WARNING, это нужно для обратной загрузки истории, если запрос словил флуд\r\n }\r\n\r\n //this.log('getHistory: will slice ids:', ids, reverse);\r\n\r\n this.deleteMessagesByIds(ids, false);\r\n }\r\n });\r\n\r\n promise.then(() => {\r\n // preload more\r\n //if(!isFirstMessageRender) {\r\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\r\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\r\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\r\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\r\n setTimeout(() => {\r\n if(reverse) {\r\n this.loadMoreHistory(true, true);\r\n } else {\r\n this.loadMoreHistory(false, true);\r\n }\r\n }, 0);\r\n //}\r\n }\r\n //}\r\n });\r\n\r\n return {cached, promise};\r\n }\r\n\r\n public setUnreadDelimiter() {\r\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\r\n return;\r\n }\r\n\r\n if(this.attachedUnreadBubble) {\r\n return;\r\n }\r\n\r\n const historyStorage = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId);\r\n let readMaxId = this.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\r\n if(!readMaxId) return;\r\n\r\n readMaxId = Object.keys(this.bubbles)\r\n .filter(mid => !this.bubbles[mid].classList.contains('is-out'))\r\n .map(i => +i)\r\n .sort((a, b) => a - b)\r\n .find(i => i > readMaxId);\r\n\r\n if(readMaxId && this.bubbles[readMaxId]) {\r\n let bubble = this.bubbles[readMaxId];\r\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\r\n this.firstUnreadBubble.classList.remove('is-first-unread');\r\n this.firstUnreadBubble = null;\r\n }\r\n\r\n if(readMaxId !== historyStorage.maxId) {\r\n bubble.classList.add('is-first-unread');\r\n }\r\n\r\n this.firstUnreadBubble = bubble;\r\n this.attachedUnreadBubble = true;\r\n }\r\n }\r\n\r\n public deleteEmptyDateGroups() {\r\n const mustBeCount = 1 + +!!this.stickyIntersector;\r\n let deleted = false;\r\n for(const i in this.dateMessages) {\r\n const dateMessage = this.dateMessages[i];\r\n\r\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\r\n dateMessage.container.remove();\r\n if(this.stickyIntersector) {\r\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\r\n }\r\n delete this.dateMessages[i];\r\n deleted = true;\r\n\r\n // * no sense in it\r\n /* if(dateMessage.div === this.previousStickyDate) {\r\n this.previousStickyDate = undefined;\r\n } */\r\n }\r\n }\r\n\r\n if(!deleted) {\r\n return;\r\n }\r\n\r\n this.checkIfEmptyPlaceholderNeeded();\r\n this.setStickyDateManually();\r\n }\r\n}\r\n\r\nexport function generateTail() {\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\r\n svg.setAttributeNS(null, 'width', '11');\r\n svg.setAttributeNS(null, 'height', '20');\r\n svg.classList.add('bubble-tail');\r\n\r\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\r\n use.setAttributeNS(null, 'href', '#message-tail-filled');\r\n\r\n svg.append(use);\r\n\r\n return svg;\r\n}\r\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport { addCancelButton } from \".\";\nimport PopupPeer, { PopupPeerButtonCallbackCheckboxes, PopupPeerOptions } from \"./peer\";\nimport appPeersManager from \"../../lib/appManagers/appPeersManager\";\nimport rootScope from \"../../lib/rootScope\";\nimport { FormatterArguments, LangPackKey } from \"../../lib/langPack\";\nimport appChatsManager from \"../../lib/appManagers/appChatsManager\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class PopupPinMessage {\n constructor(peerId: PeerId, mid: number, unpin?: true, onConfirm?: () => void) {\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments, \n buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const canUnpin = appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + (appMessagesManager.pinnedMessages[peerId]?.count || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n \n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n \n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n \n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [new PeerTitle({peerId}).element],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function isSelectionEmpty(selection = window.getSelection()) {\r\n if(!selection || !selection.rangeCount) {\r\n return true;\r\n }\r\n\r\n const selectionRange = selection.getRangeAt(0);\r\n if(!selectionRange.toString() || !selectionRange.START_TO_END) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { ReportReason } from \"../../layer\";\nimport appMessagesManager from \"../../lib/appManagers/appMessagesManager\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport InputField from \"../inputField\";\nimport { toastNew } from \"../toast\";\nimport { wrapSticker } from \"../wrappers\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true, \n descriptionLangKey: 'ReportInfo', \n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then(bool => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }], \n body: true\n });\n\n const div = document.createElement('div');\n const doc = appStickersManager.getAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n const size = 100;\n wrapSticker({\n doc,\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size,\n loop: false,\n play: true\n }).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport whichChild from \"../../helpers/dom/whichChild\";\nimport { ReportReason } from \"../../layer\";\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\nimport { LangPackKey } from \"../../lib/langPack\";\nimport Button from \"../button\";\nimport PopupPeer from \"./peer\";\nimport PopupReportMessagesConfirm from \"./reportMessagesConfirm\";\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach(b => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = appStickersManager.preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n \n this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, { i18n } from \"../../lib/langPack\";\nimport Scrollable from \"../scrollable\";\nimport PopupPeer from \"./peer\";\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }]\n });\n\n const scrollable = new Scrollable(undefined);\n scrollable.onAdditionalScroll = () => {\n scrollable.container.classList.toggle('scrolled-top', !scrollable.scrollTop);\n scrollable.container.classList.toggle('scrolled-bottom', scrollable.isScrolledDown);\n };\n\n this.description.replaceWith(scrollable.container);\n\n scrollable.container.append(this.description);\n scrollable.container.classList.add('scrolled-top');\n\n this.show();\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\r\nimport type Chat from \"./chat\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu, positionMenu } from \"../misc\";\r\nimport PopupDeleteMessages from \"../popups/deleteMessages\";\r\nimport PopupForward from \"../popups/forward\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport { copyTextToClipboard } from \"../../helpers/clipboard\";\r\nimport PopupSendNow from \"../popups/sendNow\";\r\nimport { toast } from \"../toast\";\r\nimport I18n, { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { Message, Poll, Chat as MTChat, MessageMedia } from \"../../layer\";\r\nimport PopupReportMessages from \"../popups/reportMessages\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport PopupSponsored from \"../popups/sponsored\";\r\n\r\nexport default class ChatContextMenu {\r\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean, notDirect?: () => boolean, withSelection?: true, isSponsored?: true})[];\r\n private element: HTMLElement;\r\n\r\n private isSelectable: boolean;\r\n private isSelected: boolean;\r\n private target: HTMLElement;\r\n private isTargetAGroupedItem: boolean;\r\n private isTextSelected: boolean;\r\n private isAnchorTarget: boolean;\r\n private isUsernameTarget: boolean;\r\n private peerId: PeerId;\r\n private mid: number;\r\n private message: Message.message | Message.messageService;\r\n private noForwards: boolean;\r\n\r\n constructor(private attachTo: HTMLElement, \r\n private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appPeersManager: AppPeersManager, \r\n private appPollsManager: AppPollsManager,\r\n private appDocsManager: AppDocsManager,\r\n private appMessagesIdsManager: AppMessagesIdsManager\r\n ) {\r\n const onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n let bubble: HTMLElement, contentWrapper: HTMLElement;\r\n\r\n try {\r\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\r\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\r\n } catch(e) {}\r\n\r\n // ! context menu click by date bubble (there is no pointer-events)\r\n if(!bubble || bubble.classList.contains('bubble-first')) return;\r\n\r\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\r\n if(this.element.classList.contains('active')) {\r\n return false;\r\n }\r\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\r\n\r\n let mid = +bubble.dataset.mid;\r\n if(!mid) return;\r\n\r\n const isSponsored = mid < 0;\r\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\r\n this.peerId = this.chat.peerId;\r\n //this.msgID = msgID;\r\n this.target = e.target as HTMLElement;\r\n this.isTextSelected = !isSelectionEmpty();\r\n this.isAnchorTarget = this.target.tagName === 'A' && (\r\n (this.target as HTMLAnchorElement).target === '_blank' || \r\n this.target.classList.contains('anchor-url')\r\n );\r\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\r\n\r\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\r\n if(chat.selection.isSelecting && !contentWrapper) {\r\n if(isSponsored) {\r\n return;\r\n }\r\n\r\n const mids = this.chat.getMidsByMid(mid);\r\n if(mids.length > 1) {\r\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ? \r\n mid : \r\n mids.find(mid => this.chat.selection.isMidSelected(this.peerId, mid));\r\n if(selectedMid) {\r\n mid = selectedMid;\r\n }\r\n }\r\n }\r\n\r\n const groupedItem = findUpClassName(this.target, 'grouped-item');\r\n this.isTargetAGroupedItem = !!groupedItem;\r\n if(groupedItem) {\r\n this.mid = +groupedItem.dataset.mid;\r\n } else {\r\n this.mid = mid;\r\n }\r\n\r\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\r\n this.message = this.chat.getMessage(this.mid);\r\n if(isSponsored) {\r\n this.buttons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.isSponsored);\r\n });\r\n } else {\r\n this.noForwards = !this.appMessagesManager.canForward(this.message);\r\n\r\n this.buttons.forEach(button => {\r\n let good: boolean;\r\n \r\n //if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\r\n if(chat.selection.isSelecting && !button.withSelection) {\r\n good = false;\r\n } else {\r\n good = contentWrapper || IS_TOUCH_SUPPORTED || true ? \r\n button.verify() : \r\n button.notDirect && button.verify() && button.notDirect();\r\n }\r\n \r\n button.element.classList.toggle('hide', !good);\r\n });\r\n }\r\n\r\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\r\n //bubble.parentElement.append(this.element);\r\n //appImManager.log('contextmenu', e, bubble, side);\r\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, side);\r\n openBtnMenu(this.element, () => {\r\n this.mid = 0;\r\n this.peerId = undefined;\r\n this.target = null;\r\n });\r\n };\r\n\r\n if(IS_TOUCH_SUPPORTED/* && false */) {\r\n attachClickEvent(attachTo, (e) => {\r\n if(chat.selection.isSelecting) {\r\n return;\r\n }\r\n\r\n const className = (e.target as HTMLElement).className;\r\n if(!className || !className.includes) return;\r\n\r\n chat.log('touchend', e);\r\n\r\n const good = ['bubble', 'bubble-content-wrapper', 'bubble-content', 'message', 'time', 'inner'].find(c => className.match(new RegExp(c + '($|\\\\s)')));\r\n if(good) {\r\n cancelEvent(e);\r\n //onContextMenu((e as TouchEvent).changedTouches[0]);\r\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\r\n onContextMenu(e);\r\n }\r\n }, {listenerSetter: this.chat.bubbles.listenerSetter});\r\n } else attachContextMenuListener(attachTo, onContextMenu, this.chat.bubbles.listenerSetter);\r\n }\r\n\r\n private init() {\r\n this.buttons = [{\r\n icon: 'send2',\r\n text: 'MessageScheduleSend',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'send2',\r\n text: 'Message.Context.Selection.SendNow',\r\n onClick: this.onSendScheduledClick,\r\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'schedule',\r\n text: 'MessageScheduleEditTime',\r\n onClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n assumeType(this.message);\r\n this.appMessagesManager.editMessage(this.message, this.message.message, {\r\n scheduleDate: this.chat.input.scheduleDate,\r\n entities: this.message.entities\r\n });\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }, new Date(this.message.date * 1000));\r\n },\r\n verify: () => this.chat.type === 'scheduled'\r\n }, {\r\n icon: 'reply',\r\n text: 'Reply',\r\n onClick: this.onReplyClick,\r\n verify: () => this.chat.canSend() && \r\n !this.message.pFlags.is_outgoing && \r\n !!this.chat.input.messageInput && \r\n this.chat.type !== 'scheduled'/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'edit',\r\n text: 'Edit',\r\n onClick: this.onEditClick,\r\n verify: () => this.appMessagesManager.canEditMessage(this.message, 'text') && !!this.chat.input.messageInput\r\n }, {\r\n icon: 'copy',\r\n text: 'Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\r\n }, {\r\n icon: 'copy',\r\n text: 'Chat.CopySelectedText',\r\n onClick: this.onCopyClick,\r\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\r\n }, {\r\n icon: 'copy',\r\n text: 'Message.Context.Selection.Copy',\r\n onClick: this.onCopyClick,\r\n verify: () => {\r\n if(!this.isSelected || this.noForwards) {\r\n return false;\r\n }\r\n\r\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\r\n for(const mid of mids) {\r\n if(!!this.appMessagesManager.getMessageByPeer(peerId, mid).message) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n },\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'CopyLink',\r\n onClick: this.onCopyAnchorLinkClick,\r\n verify: () => this.isAnchorTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Username',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.isUsernameTarget,\r\n withSelection: true\r\n }, {\r\n icon: 'copy',\r\n text: 'Text.Context.Copy.Hashtag',\r\n onClick: () => {\r\n copyTextToClipboard(this.target.innerHTML);\r\n },\r\n verify: () => this.target.classList.contains('anchor-hashtag'),\r\n withSelection: true\r\n }, {\r\n icon: 'link',\r\n text: 'MessageContext.CopyMessageLink1',\r\n onClick: this.onCopyLinkClick,\r\n verify: () => this.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\r\n }, {\r\n icon: 'pin',\r\n text: 'Message.Context.Pin',\r\n onClick: this.onPinClick,\r\n verify: () => !this.message.pFlags.is_outgoing && \r\n this.message._ !== 'messageService' && \r\n !this.message.pFlags.pinned && \r\n this.appPeersManager.canPinMessage(this.peerId) && \r\n this.chat.type !== 'scheduled',\r\n }, {\r\n icon: 'unpin',\r\n text: 'Message.Context.Unpin',\r\n onClick: this.onUnpinClick,\r\n verify: () => (this.message as Message.message).pFlags.pinned && this.appPeersManager.canPinMessage(this.peerId),\r\n }, {\r\n icon: 'download',\r\n text: 'MediaViewer.Context.Download',\r\n onClick: () => {\r\n this.appDocsManager.saveDocFile((this.message as any).media.document);\r\n },\r\n verify: () => {\r\n if(this.message.pFlags.is_outgoing) {\r\n return false;\r\n }\r\n \r\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\r\n if(!doc) return false;\r\n \r\n let hasTarget = !!IS_TOUCH_SUPPORTED;\r\n const isGoodType = !doc.type || !(['gif', 'video', 'sticker'] as MyDocument['type'][]).includes(doc.type);\r\n if(isGoodType) hasTarget = hasTarget || !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio');\r\n return isGoodType && hasTarget;\r\n }\r\n }, {\r\n icon: 'checkretract',\r\n text: 'Chat.Poll.Unvote',\r\n onClick: this.onRetractVote,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll as Poll;\r\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'stop',\r\n text: 'Chat.Poll.Stop',\r\n onClick: this.onStopPoll,\r\n verify: () => {\r\n const poll = (this.message as any).media?.poll;\r\n return this.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\r\n }/* ,\r\n cancelEvent: true */\r\n }, {\r\n icon: 'forward',\r\n text: 'Forward',\r\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\r\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || !this.message.pFlags.out) && this.message._ !== 'messageService'\r\n }, {\r\n icon: 'forward',\r\n text: 'Message.Context.Selection.Forward',\r\n onClick: this.onForwardClick,\r\n verify: () => this.chat.selection.selectionForwardBtn && \r\n this.isSelected && \r\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'flag',\r\n text: 'ReportChat',\r\n onClick: () => {\r\n new PopupReportMessages(this.peerId, [this.mid]);\r\n },\r\n verify: () => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && this.appPeersManager.isChannel(this.peerId),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Select',\r\n onClick: this.onSelectClick,\r\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'select',\r\n text: 'Message.Context.Selection.Clear',\r\n onClick: this.onClearSelectionClick,\r\n verify: () => this.isSelected,\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.appMessagesManager.canDeleteMessage(this.message)\r\n }, {\r\n icon: 'delete danger',\r\n text: 'Message.Context.Selection.Delete',\r\n onClick: this.onDeleteClick,\r\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\r\n notDirect: () => true,\r\n withSelection: true\r\n }, {\r\n icon: 'info',\r\n text: 'Chat.Message.Sponsored.What',\r\n onClick: () => {\r\n new PopupSponsored();\r\n },\r\n verify: () => false,\r\n isSponsored: true\r\n }];\r\n\r\n this.element = ButtonMenu(this.buttons, this.chat.bubbles.listenerSetter);\r\n this.element.id = 'bubble-contextmenu';\r\n this.element.classList.add('contextmenu');\r\n this.chat.container.append(this.element);\r\n }\r\n\r\n private onSendScheduledClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\r\n } else {\r\n new PopupSendNow(this.peerId, this.chat.getMidsByMid(this.mid));\r\n }\r\n };\r\n\r\n private onReplyClick = () => {\r\n this.chat.input.initMessageReply(this.mid);\r\n };\r\n\r\n private onEditClick = () => {\r\n this.chat.input.initMessageEditing(this.mid);\r\n };\r\n\r\n private onCopyClick = () => {\r\n if(isSelectionEmpty()) {\r\n const mids = this.chat.selection.isSelecting ? \r\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) : \r\n [this.mid];\r\n\r\n const str = mids.reduce((acc, mid) => {\r\n const message = this.chat.getMessage(mid);\r\n return acc + (message?.message ? message.message + '\\n' : '');\r\n }, '').trim();\r\n\r\n copyTextToClipboard(str);\r\n } else {\r\n document.execCommand('copy');\r\n //cancelSelection();\r\n }\r\n };\r\n\r\n private onCopyAnchorLinkClick = () => {\r\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\r\n };\r\n\r\n private onCopyLinkClick = () => {\r\n let threadMessage: Message.message;\r\n if(this.chat.type === 'discussion') {\r\n threadMessage = this.appMessagesManager.getMessageByPeer(this.peerId, this.chat.threadId);\r\n }\r\n\r\n const username = this.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : this.peerId);\r\n const msgId = this.appMessagesIdsManager.getServerMessageId(this.mid);\r\n let url = 'https://t.me/';\r\n let key: LangPackKey;\r\n if(username) {\r\n url += username + '/' + (threadMessage ? this.appMessagesIdsManager.getServerMessageId(threadMessage.fwd_from.channel_post) : msgId);\r\n if(threadMessage) url += '?comment=' + msgId;\r\n key = 'LinkCopied';\r\n } else {\r\n url += 'c/' + this.peerId.toChatId() + '/' + msgId;\r\n if(threadMessage) url += '?thread=' + this.appMessagesIdsManager.getServerMessageId(threadMessage.mid);\r\n key = 'LinkCopiedPrivateInfo';\r\n }\r\n\r\n toast(I18n.format(key, true));\r\n\r\n copyTextToClipboard(url);\r\n };\r\n\r\n private onPinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid);\r\n };\r\n\r\n private onUnpinClick = () => {\r\n new PopupPinMessage(this.peerId, this.mid, true);\r\n };\r\n\r\n private onRetractVote = () => {\r\n this.appPollsManager.sendVote(this.message, []);\r\n };\r\n\r\n private onStopPoll = () => {\r\n this.appPollsManager.stopPoll(this.message);\r\n };\r\n\r\n private onForwardClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\r\n } else {\r\n const mids = this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid);\r\n new PopupForward({\r\n [this.peerId]: mids\r\n });\r\n }\r\n };\r\n\r\n private onSelectClick = () => {\r\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\r\n };\r\n\r\n private onClearSelectionClick = () => {\r\n this.chat.selection.cancelSelection();\r\n };\r\n\r\n private onDeleteClick = () => {\r\n if(this.chat.selection.isSelecting) {\r\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\r\n } else {\r\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : this.chat.getMidsByMid(this.mid), this.chat.type);\r\n }\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\r\nimport { attachContextMenuListener, openBtnMenu } from \"../misc\";\r\n\r\nexport default class SendMenu {\r\n public sendMenu: HTMLDivElement;\r\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\r\n private type: 'schedule' | 'reminder';\r\n \r\n constructor(options: {\r\n onSilentClick: () => void,\r\n onScheduleClick: () => void,\r\n listenerSetter?: ListenerSetter,\r\n openSide: string,\r\n onContextElement: HTMLElement,\r\n onOpen?: () => boolean\r\n }) {\r\n this.sendMenuButtons = [{\r\n icon: 'mute',\r\n text: 'Chat.Send.WithoutSound',\r\n onClick: options.onSilentClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.ScheduledMessage',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'schedule'\r\n }, {\r\n icon: 'schedule',\r\n text: 'Chat.Send.SetReminder',\r\n onClick: options.onScheduleClick,\r\n verify: () => this.type === 'reminder'\r\n }];\r\n \r\n this.sendMenu = ButtonMenu(this.sendMenuButtons, options.listenerSetter);\r\n this.sendMenu.classList.add('menu-send', options.openSide);\r\n\r\n attachContextMenuListener(options.onContextElement, (e: any) => {\r\n if(options.onOpen && !options.onOpen()) {\r\n return;\r\n }\r\n\r\n this.sendMenuButtons.forEach(button => {\r\n button.element.classList.toggle('hide', !button.verify());\r\n });\r\n \r\n cancelEvent(e);\r\n openBtnMenu(this.sendMenu);\r\n }, options.listenerSetter);\r\n }\r\n\r\n public setPeerId(peerId: PeerId) {\r\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"../chat/chat\";\r\nimport PopupElement from \".\";\r\nimport CheckboxField from \"../checkboxField\";\r\nimport InputField from \"../inputField\";\r\nimport RadioField from \"../radioField\";\r\nimport Scrollable from \"../scrollable\";\r\nimport SendContextMenu from \"../chat/sendContextMenu\";\r\nimport I18n, { _i18n } from \"../../lib/langPack\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport getRichValue from \"../../helpers/dom/getRichValue\";\r\nimport isInputEmpty from \"../../helpers/dom/isInputEmpty\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { Poll } from \"../../layer\";\r\n\r\nconst MAX_LENGTH_QUESTION = 255;\r\nconst MAX_LENGTH_OPTION = 100;\r\nconst MAX_LENGTH_SOLUTION = 200;\r\n\r\nexport default class PopupCreatePoll extends PopupElement {\r\n private questionInputField: InputField;\r\n private questions: HTMLElement;\r\n private scrollable: Scrollable;\r\n private tempId = 0;\r\n\r\n private anonymousCheckboxField: CheckboxField;\r\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\r\n\r\n private correctAnswers: Uint8Array[];\r\n private quizSolutionField: InputField;\r\n private optionInputFields: InputField[];\r\n\r\n constructor(private chat: Chat) {\r\n super('popup-create-poll popup-new-media', null, {closable: true, withConfirm: 'Create', body: true});\r\n\r\n _i18n(this.title, 'NewPoll');\r\n\r\n this.questionInputField = new InputField({\r\n placeholder: 'AskAQuestion',\r\n label: 'AskAQuestion', \r\n name: 'question', \r\n maxLength: MAX_LENGTH_QUESTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n this.optionInputFields = [];\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n const sendMenu = new SendContextMenu({\r\n onSilentClick: () => {\r\n this.chat.input.sendSilent = true;\r\n this.send();\r\n },\r\n onScheduleClick: () => {\r\n this.chat.input.scheduleSending(() => {\r\n this.send();\r\n });\r\n },\r\n openSide: 'bottom-left',\r\n onContextElement: this.btnConfirm,\r\n });\r\n \r\n sendMenu.setPeerId(this.chat.peerId);\r\n\r\n this.header.append(sendMenu.sendMenu);\r\n }\r\n\r\n this.header.append(this.questionInputField.container);\r\n\r\n const hr = document.createElement('hr');\r\n const d = document.createElement('div');\r\n d.classList.add('caption');\r\n _i18n(d, 'PollOptions');\r\n\r\n this.questions = document.createElement('form');\r\n this.questions.classList.add('poll-create-questions');\r\n\r\n const dd = document.createElement('div');\r\n dd.classList.add('poll-create-settings');\r\n \r\n const settingsCaption = document.createElement('div');\r\n settingsCaption.classList.add('caption');\r\n _i18n(settingsCaption, 'Settings');\r\n\r\n if(!this.chat.appPeersManager.isBroadcast(this.chat.peerId)) {\r\n this.anonymousCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Anonymous', \r\n name: 'anonymous'\r\n });\r\n this.anonymousCheckboxField.input.checked = true;\r\n dd.append(this.anonymousCheckboxField.label);\r\n }\r\n \r\n this.multipleCheckboxField = new CheckboxField({\r\n text: 'NewPoll.MultipleChoice', \r\n name: 'multiple'\r\n });\r\n this.quizCheckboxField = new CheckboxField({\r\n text: 'NewPoll.Quiz', \r\n name: 'quiz'\r\n });\r\n\r\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\r\n const checked = this.multipleCheckboxField.input.checked;\r\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\r\n });\r\n\r\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\r\n const checked = this.quizCheckboxField.input.checked;\r\n\r\n (Array.from(this.questions.children) as HTMLElement[]).map(el => {\r\n el.classList.toggle('radio-field', checked);\r\n });\r\n\r\n if(!checked) {\r\n this.correctAnswers = undefined;\r\n this.quizSolutionField.setValueSilently('');\r\n }\r\n\r\n quizElements.forEach(el => el.classList.toggle('hide', !checked));\r\n\r\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\r\n this.handleChange();\r\n });\r\n\r\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\r\n\r\n const quizElements: HTMLElement[] = [];\r\n\r\n const quizSolutionCaption = document.createElement('div');\r\n quizSolutionCaption.classList.add('caption');\r\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\r\n\r\n const quizHr = document.createElement('hr');\r\n\r\n const quizSolutionContainer = document.createElement('div');\r\n quizSolutionContainer.classList.add('poll-create-questions');\r\n\r\n this.quizSolutionField = new InputField({\r\n placeholder: 'NewPoll.Explanation.Placeholder', \r\n label: 'NewPoll.Explanation.Placeholder',\r\n name: 'solution',\r\n maxLength: MAX_LENGTH_SOLUTION\r\n });\r\n\r\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\r\n this.handleChange();\r\n });\r\n\r\n const quizSolutionSubtitle = document.createElement('div');\r\n quizSolutionSubtitle.classList.add('subtitle');\r\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\r\n\r\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\r\n\r\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\r\n quizElements.forEach(el => el.classList.add('hide'));\r\n\r\n this.body.parentElement.insertBefore(hr, this.body);\r\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\r\n\r\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.scrollable = new Scrollable(this.body);\r\n this.appendMoreField();\r\n\r\n this.onEscape = () => {\r\n return !this.getFilledAnswers().length;\r\n };\r\n\r\n this.handleChange();\r\n }\r\n\r\n private getFilledAnswers() {\r\n const answers = Array.from(this.questions.children).map((el, idx) => {\r\n const input = el.querySelector('.input-field-input') as HTMLElement;\r\n return input instanceof HTMLInputElement ? input.value : getRichValue(input, false).value;\r\n }).filter(v => !!v.trim());\r\n\r\n return answers;\r\n }\r\n\r\n private onSubmitClick = () => {\r\n this.send();\r\n };\r\n\r\n private validate() {\r\n const question = this.questionInputField.value;\r\n if(!question) {\r\n return false;\r\n }\r\n\r\n if(question.length > MAX_LENGTH_QUESTION) {\r\n return false;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\r\n return false;\r\n }\r\n\r\n const answers = this.getFilledAnswers();\r\n if(answers.length < 2) {\r\n return false;\r\n }\r\n \r\n const tooLongOption = answers.find(a => a.length > MAX_LENGTH_OPTION);\r\n if(tooLongOption) {\r\n return false;\r\n }\r\n\r\n const {value: quizSolution} = getRichValue(this.quizSolutionField.input, false);\r\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleChange() {\r\n const valid = this.validate();\r\n this.btnConfirm.toggleAttribute('disabled', !valid);\r\n }\r\n\r\n public send(force = false) {\r\n const question = this.questionInputField.value;\r\n\r\n const answers = this.getFilledAnswers();\r\n\r\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValue(this.quizSolutionField.input);\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.chat.input.scheduleSending(() => {\r\n this.send(true);\r\n });\r\n \r\n return;\r\n }\r\n\r\n this.hide();\r\n\r\n //const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\r\n //const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\r\n\r\n const pFlags: Poll['pFlags'] = {};\r\n\r\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\r\n pFlags.public_voters = true;\r\n }\r\n\r\n if(this.multipleCheckboxField.input.checked) {\r\n pFlags.multiple_choice = true;\r\n }\r\n\r\n if(this.quizCheckboxField.input.checked) {\r\n pFlags.quiz = true;\r\n }\r\n\r\n const poll: Poll = {\r\n _: 'poll',\r\n pFlags,\r\n question,\r\n answers: answers.map((value, idx) => {\r\n return {\r\n _: 'pollAnswer',\r\n text: value,\r\n option: new Uint8Array([idx])\r\n };\r\n }),\r\n id: undefined\r\n };\r\n //poll.id = randomIDS;\r\n\r\n const inputMediaPoll = this.chat.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\r\n\r\n //console.log('Will try to create poll:', inputMediaPoll);\r\n\r\n this.chat.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\r\n threadId: this.chat.threadId,\r\n replyToMsgId: this.chat.input.replyToMsgId,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent\r\n });\r\n\r\n if(this.chat.input.helperType === 'reply') {\r\n this.chat.input.clearHelper();\r\n }\r\n\r\n this.chat.input.onMessageSent(false, false);\r\n }\r\n\r\n onInput = (e: Event) => {\r\n const target = e.target as HTMLInputElement;\r\n\r\n const radioLabel = findUpTag(target, 'LABEL');\r\n const isEmpty = isInputEmpty(target);\r\n if(!isEmpty) {\r\n target.parentElement.classList.add('is-filled');\r\n radioLabel.classList.remove('hidden-widget');\r\n radioLabel.firstElementChild.removeAttribute('disabled');\r\n }\r\n\r\n const isLast = !radioLabel.nextElementSibling;\r\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\r\n this.appendMoreField();\r\n }\r\n\r\n this.handleChange();\r\n };\r\n\r\n onDeleteClick = (e: MouseEvent) => {\r\n const target = e.target as HTMLSpanElement;\r\n const label = findUpTag(target, 'LABEL');\r\n const idx = whichChild(label);\r\n\r\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\r\n this.correctAnswers = undefined;\r\n }\r\n\r\n label.remove();\r\n this.optionInputFields.splice(idx, 1);\r\n\r\n this.optionInputFields.forEach((inputField, idx) => {\r\n inputField.options.labelOptions.length = 0;\r\n inputField.options.labelOptions.push(idx + 1);\r\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\r\n i18nElement.update();\r\n });\r\n\r\n this.handleChange();\r\n };\r\n\r\n private appendMoreField() {\r\n const tempId = this.tempId++;\r\n const idx = this.questions.childElementCount + 1;\r\n const questionField = new InputField({\r\n placeholder: 'NewPoll.OptionsAddOption', \r\n label: 'NewPoll.OptionLabel',\r\n labelOptions: [idx],\r\n name: 'question-' + tempId, \r\n maxLength: MAX_LENGTH_OPTION\r\n });\r\n this.listenerSetter.add(questionField.input)('input', this.onInput);\r\n\r\n const radioField = new RadioField({\r\n text: '', \r\n name: 'question'\r\n });\r\n radioField.main.append(questionField.container);\r\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\r\n radioField.label.classList.add('hidden-widget');\r\n radioField.input.disabled = true;\r\n if(!this.quizCheckboxField.input.checked) {\r\n radioField.label.classList.remove('radio-field');\r\n }\r\n this.listenerSetter.add(radioField.input)('change', () => {\r\n const checked = radioField.input.checked;\r\n if(checked) {\r\n const idx = whichChild(radioField.label);\r\n this.correctAnswers = [new Uint8Array([idx])];\r\n this.handleChange();\r\n }\r\n });\r\n\r\n const deleteBtn = document.createElement('span');\r\n deleteBtn.classList.add('btn-icon', 'tgico-close');\r\n questionField.container.append(deleteBtn);\r\n \r\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\r\n\r\n this.questions.append(radioField.label);\r\n\r\n this.scrollable.scrollIntoViewNew({\r\n element: this.questions.lastElementChild as HTMLElement, \r\n position: 'center'\r\n });\r\n //this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\r\n\r\n this.optionInputFields.push(questionField);\r\n }\r\n}\r\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then(response => response.arrayBuffer())\n .then(arrayBuffer => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 \n && d[i + 1] == 0xF9 \n && d[i + 2] == 0x04 \n && d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n \n // Should be aware browsers have a minimum frame delay \n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from \"../chat/chat\";\nimport InputField from \"../inputField\";\nimport PopupElement from \".\";\nimport Scrollable from \"../scrollable\";\nimport { toast } from \"../toast\";\nimport { prepareAlbum, wrapDocument } from \"../wrappers\";\nimport CheckboxField from \"../checkboxField\";\nimport SendContextMenu from \"../chat/sendContextMenu\";\nimport { createPosterFromMedia, createPosterFromVideo, onMediaLoad } from \"../../helpers/files\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport I18n, { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport placeCaretAtEnd from \"../../helpers/dom/placeCaretAtEnd\";\nimport rootScope from \"../../lib/rootScope\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { MediaSize } from \"../../helpers/mediaSizes\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from \"../../helpers/getGifDuration\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\n\ntype SendFileParams = Partial<{\n file: File,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n width: number,\n height: number,\n duration: number,\n noSound: boolean,\n itemDiv: HTMLElement\n}>;\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n\n constructor(private chat: Chat, private files: File[], willAttachType: PopupNewMedia['willAttach']['type']) {\n super('popup-send-photo popup-new-media', null, {closable: true, withConfirm: 'Modal.Send', confirmShortcutIsSendShortcut: true, body: true});\n\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n \n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: rootScope.config.caption_length_max\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files = [];\n currentPopup = undefined;\n });\n\n currentPopup = this;\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems', \n name: 'group-items'\n });\n this.container.append(...[this.groupCheckboxField.label, this.mediaCheckboxField?.label, this.inputField.container].filter(Boolean));\n \n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n \n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find(file => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[this.groupCheckboxField?.label, this.mediaCheckboxField.label, this.inputField.container].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n \n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter(file => {\n const found = this.files.find(_file => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n \n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.hasAttribute('contenteditable')) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n \n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > rootScope.config.caption_length_max) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n this.hide();\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' ? true : undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n //console.log('will send files with options:', willAttach);\n\n const {peerId, input} = this.chat;\n const {sendSilent, scheduleDate} = input;\n\n sendFileDetails.forEach(d => {\n d.itemDiv = undefined;\n });\n\n const {length} = sendFileDetails;\n const replyToMsgId = input.replyToMsgId;\n this.iterate((sendFileDetails) => {\n if(caption && sendFileDetails.length !== length) {\n this.chat.appMessagesManager.sendText(peerId, caption, {\n replyToMsgId, \n threadId: this.chat.threadId,\n silent: sendSilent, \n scheduleDate,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const w = {\n ...willAttach,\n sendFileDetails\n };\n\n this.chat.appMessagesManager.sendAlbum(peerId, w.sendFileDetails.map(d => d.file), Object.assign({\n caption,\n replyToMsgId,\n threadId: this.chat.threadId,\n isMedia: isMedia,\n silent: sendSilent,\n scheduleDate,\n clearDraft: true as true\n }, w));\n\n caption = undefined;\n });\n \n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n }\n\n private attachMedia(file: File, params: SendFileParams, itemDiv: HTMLElement) {\n itemDiv.classList.add('popup-item-media');\n\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = document.createElement('video');\n const source = document.createElement('source');\n source.src = params.objectURL = URL.createObjectURL(file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n video.setAttribute('playsinline', 'true');\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n \n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n return createPosterFromVideo(video).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n });\n });\n\n video.append(source);\n } else {\n const img = new Image();\n promise = new Promise((resolve) => {\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n itemDiv.append(img);\n \n if(file.type === 'image/gif') {\n params.noSound = true;\n \n Promise.all([\n getGifDuration(img).then(duration => {\n params.duration = Math.ceil(duration);\n }),\n \n createPosterFromMedia(img).then(thumb => {\n params.thumb = {\n url: URL.createObjectURL(thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {\n resolve();\n });\n } else {\n resolve();\n }\n };\n });\n \n img.src = params.objectURL = URL.createObjectURL(file);\n }\n\n return promise;\n }\n\n private attachDocument(file: File, params: SendFileParams, itemDiv: HTMLElement): ReturnType {\n itemDiv.classList.add('popup-item-document');\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio) {\n params.objectURL = URL.createObjectURL(file);\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n fileName: file.name ? RichTextProcessor.wrapEmojiText(file.name) : '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n cacheContext.url = params.objectURL;\n cacheContext.downloaded = file.size;\n\n const docDiv = wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any\n });\n\n const promise = new Promise((resolve) => {\n const finish = () => {\n itemDiv.append(docDiv);\n resolve();\n };\n \n if(isPhoto) {\n const img = new Image();\n img.src = params.objectURL;\n img.onload = () => {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n \n finish();\n };\n \n img.onerror = finish;\n } else {\n finish();\n }\n });\n\n return promise;\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const params: SendFileParams = {};\n params.file = file;\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(file, params, itemDiv) : this.attachDocument(file, params, itemDiv);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n \n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach(file => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter(n => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else \n \n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(div: HTMLElement, params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n div.style.width = size.width + 'px';\n div.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(div);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach(p => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n willAttach.sendFileDetails.length = 0;\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n Promise.all(files.map(this.attachFile)).then(() => {\n mediaContainer.innerHTML = '';\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n if(this.shouldCompress(sendFileDetails[0].file.type) && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map(s => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map(o => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params.itemDiv, params);\n });\n }\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport fastSmoothScroll from \"../fastSmoothScroll\";\r\nimport { cancelEvent } from \"./cancelEvent\";\r\nimport { attachClickEvent, detachClickEvent } from \"./clickEvent\";\r\nimport findUpAsChild from \"./findUpAsChild\";\r\nimport findUpClassName from \"./findUpClassName\";\r\n\r\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\r\nconst HANDLE_EVENT = 'keydown';\r\nconst ACTIVE_CLASS_NAME = 'active';\r\n\r\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\r\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\r\n\r\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: {\r\n list: HTMLElement, \r\n type: 'xy' | 'x' | 'y',\r\n onSelect: (target: Element) => void | boolean,\r\n once: boolean,\r\n waitForKey?: string[]\r\n}) {\r\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\r\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS)); \r\n\r\n let target: Element;\r\n const getCurrentTarget = () => {\r\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\r\n };\r\n\r\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\r\n if(target === _target) {\r\n return;\r\n }\r\n\r\n let hadTarget = false;\r\n if(target) {\r\n hadTarget = true;\r\n target.classList.remove(ACTIVE_CLASS_NAME);\r\n }\r\n\r\n target = _target;\r\n if(!target) return;\r\n target.classList.add(ACTIVE_CLASS_NAME);\r\n\r\n if(hadTarget && scrollable && scrollTo) {\r\n fastSmoothScroll({\r\n container: scrollable, \r\n element: target as HTMLElement, \r\n position: 'center', \r\n forceDuration: 100, \r\n axis: type === 'x' ? 'x' : 'y'\r\n });\r\n }\r\n };\r\n\r\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\r\n let nextTarget: Element;\r\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\r\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\r\n\r\n return nextTarget;\r\n };\r\n\r\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\r\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\r\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\r\n const currentRect = currentTarget.getBoundingClientRect();\r\n\r\n let nextTarget = currentTarget[property] || list[endProperty];\r\n while(nextTarget !== currentTarget) {\r\n const targetRect = nextTarget.getBoundingClientRect();\r\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\r\n break;\r\n }\r\n\r\n nextTarget = nextTarget[property] || list[endProperty];\r\n }\r\n\r\n return nextTarget;\r\n };\r\n\r\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\r\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\r\n handleArrowKey = (currentTarget, key) => {\r\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\r\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\r\n };\r\n } else { // flex-direction: row | column;\r\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\r\n }\r\n\r\n let onKeyDown = (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(!keyNames.has(key as any)) {\r\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\r\n cancelEvent(e);\r\n fireSelect(getCurrentTarget());\r\n }\r\n\r\n return;\r\n }\r\n\r\n cancelEvent(e);\r\n\r\n if(list.childElementCount > 1) {\r\n let currentTarget = getCurrentTarget();\r\n currentTarget = handleArrowKey(currentTarget, key as any);\r\n setCurrentTarget(currentTarget, true);\r\n }\r\n };\r\n\r\n const scrollable = findUpClassName(list, 'scrollable');\r\n list.classList.add('navigable-list');\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n };\r\n\r\n const onClick = (e: Event) => {\r\n cancelEvent(e); // cancel keyboard closening\r\n\r\n const target = findUpAsChild(e.target, list) as HTMLElement;\r\n if(!target) {\r\n return;\r\n }\r\n\r\n setCurrentTarget(target, false);\r\n fireSelect(getCurrentTarget());\r\n };\r\n\r\n const fireSelect = (target: Element) => {\r\n const canContinue = onSelect(target);\r\n if(canContinue !== undefined ? !canContinue : once) {\r\n detach();\r\n }\r\n };\r\n\r\n let attached = false;\r\n const attach = () => {\r\n if(attached) return;\r\n attached = true;\r\n // const input = document.activeElement as HTMLElement;\r\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n list.addEventListener('mousemove', onMouseMove, {passive: true});\r\n attachClickEvent(list, onClick);\r\n };\r\n\r\n const detach = () => {\r\n if(!attached) return;\r\n attached = false;\r\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n list.removeEventListener('mousemove', onMouseMove);\r\n detachClickEvent(list, onClick);\r\n };\r\n\r\n const resetTarget = () => {\r\n if(waitForKeySet) return;\r\n setCurrentTarget(list.firstElementChild, false);\r\n };\r\n\r\n if(waitForKeySet) {\r\n const _onKeyDown = onKeyDown;\r\n onKeyDown = (e) => {\r\n if(waitForKeySet.has(e.key)) {\r\n cancelEvent(e);\r\n\r\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\r\n onKeyDown = _onKeyDown;\r\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\r\n\r\n waitForKeySet = undefined;\r\n resetTarget();\r\n }\r\n };\r\n } else {\r\n resetTarget();\r\n }\r\n\r\n attach();\r\n\r\n return {\r\n attach,\r\n detach,\r\n resetTarget\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport attachListNavigation from \"../../helpers/dom/attachListNavigation\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport SetTransition from \"../singleTransition\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompleteHelper extends EventListenerBase<{\r\n hidden: () => void,\r\n visible: () => void,\r\n}> {\r\n protected hidden = true;\r\n protected container: HTMLElement;\r\n protected list: HTMLElement;\r\n protected resetTarget: () => void;\r\n protected attach: () => void;\r\n protected detach: () => void;\r\n protected init?(): void;\r\n\r\n protected controller: AutocompleteHelperController;\r\n protected listType: 'xy' | 'x' | 'y';\r\n protected onSelect: (target: Element) => boolean | void;\r\n protected waitForKey?: string[];\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n constructor(options: {\r\n appendTo: HTMLElement,\r\n controller: AutocompleteHelper['controller'],\r\n listType: AutocompleteHelper['listType'],\r\n onSelect: AutocompleteHelper['onSelect'],\r\n waitForKey?: AutocompleteHelper['waitForKey']\r\n }) {\r\n super(false);\r\n\r\n safeAssign(this, options);\r\n \r\n this.container = document.createElement('div');\r\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\r\n \r\n options.appendTo.append(this.container);\r\n \r\n this.attachNavigation();\r\n\r\n this.controller.addHelper(this);\r\n }\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n if(enabled) {\r\n this.attach && this.attach();\r\n } else {\r\n this.detach && this.detach();\r\n }\r\n }\r\n\r\n protected onVisible = () => {\r\n if(this.detach) { // it can be so because 'visible' calls before animation's end\r\n this.detach();\r\n }\r\n\r\n const list = this.list;\r\n const {attach, detach, resetTarget} = attachListNavigation({\r\n list, \r\n type: this.listType,\r\n onSelect: this.onSelect,\r\n once: true,\r\n waitForKey: this.waitForKey\r\n });\r\n\r\n this.attach = attach;\r\n this.detach = detach;\r\n this.resetTarget = resetTarget;\r\n if(!IS_MOBILE && !this.navigationItem) {\r\n this.navigationItem = {\r\n type: 'autocomplete-helper',\r\n onPop: () => {\r\n this.navigationItem = undefined;\r\n this.toggle(true);\r\n },\r\n noBlurOnPop: true\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n\r\n this.addEventListener('hidden', () => {\r\n this.resetTarget = undefined;\r\n this.attach = undefined;\r\n this.detach = undefined;\r\n\r\n list.innerHTML = '';\r\n detach();\r\n\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n }, {once: true});\r\n };\r\n\r\n protected attachNavigation() {\r\n this.addEventListener('visible', this.onVisible);\r\n }\r\n\r\n public toggle(hide?: boolean, fromController = false) {\r\n if(this.init) {\r\n return;\r\n }\r\n \r\n if(hide === undefined) {\r\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\r\n }\r\n\r\n if(this.hidden === hide) {\r\n if(!hide) {\r\n this.dispatchEvent('visible'); // reset target and listener\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.hidden = hide;\r\n\r\n if(!hide) {\r\n this.controller.hideOtherHelpers(this);\r\n this.dispatchEvent('visible'); // fire it before so target will be set\r\n } else {\r\n if(this.navigationItem) {\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n }\r\n\r\n if(!fromController) {\r\n this.controller.hideOtherHelpers();\r\n }\r\n\r\n if(this.detach) { // force detach here\r\n this.detach();\r\n }\r\n }\r\n\r\n SetTransition(this.container, 'is-visible', !hide, rootScope.settings.animationsEnabled ? 200 : 0, () => {\r\n this.hidden && this.dispatchEvent('hidden');\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport { CHAT_ANIMATION_GROUP } from \"../../lib/appManagers/appImManager\";\r\nimport appStickersManager from \"../../lib/appManagers/appStickersManager\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { EmoticonsDropdown } from \"../emoticonsDropdown\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class StickersHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private onChangeScreen: () => void;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n onSelect: (target) => {\r\n return !EmoticonsDropdown.onMediaClick({target}, true);\r\n }, \r\n waitForKey: ['ArrowUp', 'ArrowDown']\r\n });\r\n\r\n this.container.classList.add('stickers-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n\r\n rootScope.dispatchEvent('choosing_sticker', true);\r\n });\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n\r\n rootScope.dispatchEvent('choosing_sticker', false);\r\n });\r\n }\r\n\r\n public checkEmoticon(emoticon: string) {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.clear();\r\n }\r\n\r\n appStickersManager.preloadAnimatedEmojiSticker(emoticon);\r\n appStickersManager.getStickersByEmoticon(emoticon)\r\n .then((stickers) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const container = this.list.cloneNode() as HTMLElement;\r\n\r\n let ready: Promise;\r\n\r\n this.lazyLoadQueue.clear();\r\n if(stickers.length) {\r\n ready = new Promise((resolve) => {\r\n const promises: Promise[] = [];\r\n stickers.forEach(sticker => {\r\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\r\n });\r\n\r\n (Promise.all(promises) as Promise).finally(resolve);\r\n });\r\n } else {\r\n ready = Promise.resolve();\r\n }\r\n\r\n ready.then(() => {\r\n this.list.replaceWith(container);\r\n this.list = container;\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n\r\n this.toggle(!stickers.length);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, CHAT_ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { SEND_WHEN_ONLINE_TIMESTAMP } from \"../../lib/mtproto/constants\";\r\nimport Button from \"../button\";\r\nimport PopupDatePicker from \"./datePicker\";\r\n\r\nconst getMinDate = () => {\r\n const date = new Date();\r\n //date.setDate(date.getDate() - 1);\r\n date.setHours(0, 0, 0, 0);\r\n return date;\r\n};\r\n\r\nconst getMaxDate = () => {\r\n const date = new Date();\r\n date.setFullYear(date.getFullYear() + 1);\r\n date.setDate(date.getDate() - 1);\r\n return date;\r\n};\r\n\r\nconst checkDate = (date: Date) => {\r\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\r\n};\r\n\r\nexport default class PopupSchedule extends PopupDatePicker {\r\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\r\n super(checkDate(initDate), onPick, {\r\n noButtons: true,\r\n noTitle: true,\r\n closable: true,\r\n withConfirm: true,\r\n minDate: getMinDate(),\r\n maxDate: getMaxDate(),\r\n withTime: true,\r\n showOverflowMonths: true,\r\n confirmShortcutIsSendShortcut: true\r\n });\r\n\r\n this.element.classList.add('popup-schedule');\r\n this.header.append(this.controlsDiv);\r\n this.title.replaceWith(this.monthTitle);\r\n this.body.append(this.btnConfirm);\r\n\r\n if(canSendWhenOnline) {\r\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\r\n this.body.append(btnSendWhenOnline);\r\n\r\n attachClickEvent(btnSendWhenOnline, () => {\r\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\r\n this.hide();\r\n });\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { MessageEntity } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport getRichElementValue from \"./getRichElementValue\";\r\n\r\nexport default function getRichValueWithCaret(field: HTMLElement, withEntities = true) {\r\n const lines: string[] = [];\r\n const line: string[] = [];\r\n\r\n const sel = window.getSelection();\r\n let selNode: Node;\r\n let selOffset: number;\r\n if(sel && sel.rangeCount) {\r\n const range = sel.getRangeAt(0);\r\n const startOffset = range.startOffset;\r\n if(\r\n range.startContainer &&\r\n range.startContainer == range.endContainer &&\r\n startOffset == range.endOffset\r\n ) {\r\n // * if focused on img, or caret has been set via placeCaretAtEnd\r\n const possibleChildrenFocusOffset = startOffset - 1;\r\n const childNodes = field.childNodes;\r\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\r\n selNode = childNodes[possibleChildrenFocusOffset];\r\n selOffset = 0;\r\n\r\n for(let i = 0; i < range.endOffset; ++i) {\r\n const node = childNodes[i];\r\n const value = node.nodeValue || (node as HTMLImageElement).alt;\r\n\r\n if(value) {\r\n selOffset += value.length;\r\n }\r\n }\r\n } else {\r\n selNode = range.startContainer;\r\n selOffset = startOffset;\r\n }\r\n }\r\n }\r\n\r\n const entities: MessageEntity[] = withEntities ? [] : undefined;\r\n getRichElementValue(field, lines, line, selNode, selOffset, entities);\r\n\r\n if(line.length) {\r\n lines.push(line.join(''));\r\n }\r\n\r\n let value = lines.join('\\n');\r\n const caretPos = value.indexOf('\\x01');\r\n if(caretPos != -1) {\r\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\r\n }\r\n value = value.replace(/\\u00A0/g, ' ');\r\n\r\n if(entities) {\r\n RichTextProcessor.combineSameEntities(entities);\r\n }\r\n\r\n return {value, entities, caretPos};\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatInput from \"./input\";\r\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\r\nimport { appendEmoji, getEmojiFromElement } from \"../emoticonsDropdown/tabs/emoji\";\r\nimport { ScrollableX } from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class EmojiHelper extends AutocompleteHelper {\r\n private scrollable: ScrollableX;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController, \r\n chatInput: ChatInput, \r\n private appEmojiManager: AppEmojiManager) {\r\n super({\r\n appendTo,\r\n controller, \r\n listType: 'x', \r\n onSelect: (target) => {\r\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\r\n }\r\n });\r\n\r\n this.container.classList.add('emoji-helper');\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new ScrollableX(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollLeft = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(emojis: string[], waitForKey: boolean) {\r\n if(this.init) {\r\n if(!emojis.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n \r\n emojis = emojis.slice(0, 80);\r\n\r\n if(emojis.length) {\r\n this.list.innerHTML = '';\r\n emojis.forEach(emoji => {\r\n appendEmoji(emoji, this.list, false, true);\r\n });\r\n }\r\n\r\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\r\n this.toggle(!emojis.length);\r\n\r\n /* window.requestAnimationFrame(() => {\r\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\r\n }); */\r\n }\r\n\r\n public checkQuery(query: string, firstChar: string) {\r\n const middleware = this.controller.getMiddleware();\r\n this.appEmojiManager.getBothEmojiKeywords().then(() => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const q = query.replace(/^:/, '');\r\n const emojis = this.appEmojiManager.searchEmojis(q);\r\n this.render(emojis, firstChar !== ':');\r\n //console.log(emojis);\r\n });\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport AvatarElement from \"../avatar\";\r\nimport PeerTitle from \"../peerTitle\";\r\nimport Scrollable from \"../scrollable\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\n\r\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\r\n protected static BASE_CLASS = 'autocomplete-peer-helper';\r\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\r\n private scrollable: Scrollable;\r\n\r\n constructor(appendTo: HTMLElement, controller: AutocompleteHelperController, protected className: string, onSelect: (target: Element) => boolean | void) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'y', \r\n onSelect\r\n });\r\n\r\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\r\n }\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0);\r\n });\r\n }\r\n\r\n public render(data: {peerId: PeerId, name?: string, description?: string}[]) {\r\n if(this.init) {\r\n if(!data.length) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(data.length) {\r\n this.list.innerHTML = '';\r\n data.forEach(d => {\r\n const div = AutocompletePeerHelper.listElement({\r\n className: this.className,\r\n peerId: d.peerId,\r\n name: d.name,\r\n description: d.description\r\n });\r\n\r\n this.list.append(div);\r\n });\r\n }\r\n\r\n this.toggle(!data.length);\r\n }\r\n\r\n public static listElement(options: {\r\n className: string,\r\n peerId: PeerId,\r\n name?: string,\r\n description?: string\r\n }) {\r\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\r\n options.className += '-list-element';\r\n\r\n const div = document.createElement('div');\r\n div.classList.add(BASE, options.className);\r\n div.dataset.peerId = '' + options.peerId;\r\n \r\n const avatar = new AvatarElement();\r\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\r\n avatar.setAttribute('dialog', '0');\r\n avatar.setAttribute('peer', '' + options.peerId);\r\n \r\n const name = document.createElement('div');\r\n name.classList.add(BASE + '-name', options.className + '-name');\r\n if(!options.name) {\r\n name.append(new PeerTitle({\r\n peerId: options.peerId,\r\n dialog: false,\r\n onlyFirstName: false,\r\n plainText: false\r\n }).element);\r\n } else {\r\n name.innerHTML = RichTextProcessor.wrapEmojiText(options.name);\r\n }\r\n \r\n div.append(avatar, name);\r\n\r\n if(options.description) {\r\n const description = document.createElement('div');\r\n description.classList.add(BASE + '-description', options.className + '-description');\r\n description.innerHTML = RichTextProcessor.wrapEmojiText(options.description);\r\n div.append(description);\r\n }\r\n \r\n return div;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { BotInfo } from \"../../layer\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\nimport SearchIndex from \"../../lib/searchIndex\";\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId) {\n if(!this.appUsersManager.isBot(peerId)) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getProfileByPeerId(peerId).then(full => {\n if(!middleware()) {\n return;\n }\n\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n const index = new SearchIndex({\n ignoreCase: true\n });\n \n const commands: Map = new Map();\n botInfos.forEach(botInfo => {\n botInfo.commands.forEach(botCommand => {\n const c = '/' + botCommand.command;\n commands.set(botCommand.command, {\n peerId: botInfo.user_id.toPeerId(false), \n name: c, \n description: botCommand.description\n });\n\n index.indexObject(botCommand.command, c);\n });\n });\n\n const found = index.search(query);\n const filtered = Array.from(found).map(command => commands.get(command));\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { getMiddleware } from \"../../helpers/middleware\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\n\r\nexport default class AutocompleteHelperController {\r\n private helpers: Set = new Set();\r\n private middleware = getMiddleware();\r\n /* private tempId = 0;\r\n\r\n public incrementToggleCount() {\r\n return ++this.tempId;\r\n }\r\n\r\n public getToggleCount() {\r\n return this.tempId;\r\n } */\r\n\r\n public toggleListNavigation(enabled: boolean) {\r\n for(const helper of this.helpers) {\r\n helper.toggleListNavigation(enabled);\r\n }\r\n }\r\n\r\n public getMiddleware() {\r\n this.middleware.clean();\r\n return this.middleware.get();\r\n }\r\n\r\n public addHelper(helper: AutocompleteHelper) {\r\n this.helpers.add(helper);\r\n }\r\n\r\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\r\n this.helpers.forEach(helper => {\r\n if(helper !== preserveHelper) {\r\n helper.toggle(true, true);\r\n }\r\n });\r\n\r\n if(!preserveHelper) {\r\n this.middleware.clean();\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from \"./input\";\nimport type { MessageEntity } from \"../../layer\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\nimport AutocompletePeerHelper from \"./autocompletePeerHelper\";\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(appendTo: HTMLElement, \n controller: AutocompleteHelperController, \n chatInput: ChatInput, \n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager) {\n super(appendTo, \n controller,\n 'mentions-helper',\n (target) => {\n const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId());\n let str = '', entity: MessageEntity;\n if(user.username) {\n str = '@' + user.username;\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(peerIds => {\n if(!middleware()) return;\n \n const username = trimmed.slice(1).toLowerCase();\n this.render(peerIds.map(peerId => {\n const user = this.appUsersManager.getUser(peerId);\n if(user.username && user.username.toLowerCase() === username) { // hide full matched suggestion\n return;\n }\n\n return {\n peerId,\n description: user.username ? '@' + user.username : undefined\n };\n }).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type ChatInput from \"./input\";\r\nimport DropdownHover from \"../../helpers/dropdownHover\";\r\nimport { KeyboardButton, ReplyMarkup } from \"../../layer\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport ListenerSetter, { Listener } from \"../../helpers/listenerSetter\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport findUpAsChild from \"../../helpers/dom/findUpAsChild\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport confirmationPopup from \"../confirmationPopup\";\r\n\r\nexport default class ReplyKeyboard extends DropdownHover {\r\n private static BASE_CLASS = 'reply-keyboard';\r\n private appendTo: HTMLElement;\r\n private listenerSetter: ListenerSetter;\r\n private appMessagesManager: AppMessagesManager;\r\n private btnHover: HTMLElement;\r\n private peerId: PeerId;\r\n private touchListener: Listener;\r\n private chatInput: ChatInput;\r\n\r\n constructor(options: {\r\n listenerSetter: ListenerSetter,\r\n appMessagesManager: AppMessagesManager,\r\n appendTo: HTMLElement,\r\n btnHover: HTMLElement,\r\n chatInput: ChatInput\r\n }) {\r\n super({\r\n element: document.createElement('div')\r\n });\r\n\r\n safeAssign(this, options);\r\n\r\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\r\n this.element.style.display = 'none';\r\n\r\n this.attachButtonListener(this.btnHover, this.listenerSetter);\r\n this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => {\r\n if(this.peerId === peerId) {\r\n if(this.checkAvailability() && this.isActive()) {\r\n this.render();\r\n }\r\n\r\n getHeavyAnimationPromise().then(() => {\r\n this.checkForceReply();\r\n });\r\n }\r\n });\r\n }\r\n\r\n protected init() {\r\n this.appendTo.append(this.element);\r\n\r\n this.listenerSetter.add(this)('open', () => {\r\n this.render();\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\r\n this.listenerSetter.add(this)('close', () => {\r\n this.listenerSetter.remove(this.touchListener);\r\n }, {once: true});\r\n }\r\n });\r\n \r\n this.listenerSetter.add(this.element)('click', (e) => {\r\n const target = findUpClassName(e.target, 'btn');\r\n if(!target) {\r\n return;\r\n }\r\n\r\n const type = target.dataset.type as KeyboardButton['_'];\r\n const {peerId} = this;\r\n switch(type) {\r\n case 'keyboardButtonRequestPhone': {\r\n confirmationPopup({\r\n titleLangKey: 'ShareYouPhoneNumberTitle',\r\n button: {\r\n langKey: 'OK'\r\n },\r\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\r\n }).then(() => {\r\n this.appMessagesManager.sendContact(peerId, rootScope.myId);\r\n });\r\n break;\r\n }\r\n\r\n default: {\r\n this.appMessagesManager.sendText(peerId, target.dataset.text);\r\n break;\r\n }\r\n }\r\n\r\n this.toggle(false);\r\n });\r\n\r\n return super.init();\r\n }\r\n\r\n private onBodyTouchStart = (e: TouchEvent) => {\r\n const target = e.touches[0].target as HTMLElement;\r\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\r\n cancelEvent(e);\r\n this.toggle(false);\r\n }\r\n };\r\n\r\n public checkForceReply() {\r\n const replyMarkup = this.getReplyMarkup();\r\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\r\n !replyMarkup.pFlags.hidden && \r\n !replyMarkup.pFlags.used) {\r\n replyMarkup.pFlags.used = true;\r\n this.chatInput.initMessageReply(replyMarkup.mid);\r\n }\r\n }\r\n\r\n private getReplyMarkup(): ReplyMarkup {\r\n return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? {\r\n _: 'replyKeyboardHide'\r\n };\r\n }\r\n\r\n public render(replyMarkup: ReplyMarkup.replyKeyboardMarkup = this.getReplyMarkup() as any) {\r\n this.element.innerHTML = '';\r\n\r\n for(const row of replyMarkup.rows) {\r\n const div = document.createElement('div');\r\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\r\n\r\n for(const button of row.buttons) {\r\n const btn = document.createElement('button');\r\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\r\n btn.innerHTML = RichTextProcessor.wrapEmojiText(button.text);\r\n btn.dataset.text = button.text;\r\n btn.dataset.type = button._;\r\n div.append(btn);\r\n }\r\n\r\n this.element.append(div);\r\n }\r\n }\r\n\r\n public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) {\r\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\r\n this.btnHover.classList.toggle('hide', hide);\r\n\r\n if(hide) {\r\n this.toggle(false);\r\n }\r\n\r\n return !hide;\r\n }\r\n\r\n public setPeer(peerId: PeerId) {\r\n this.peerId = peerId;\r\n\r\n this.checkAvailability();\r\n this.checkForceReply();\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\r\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\r\nimport type Chat from \"./chat\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\nimport { WebDocument } from \"../../layer\";\r\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport LazyLoadQueue from \"../lazyLoadQueue\";\r\nimport Scrollable from \"../scrollable\";\r\nimport { renderImageWithFadeIn, wrapPhoto } from \"../wrappers\";\r\nimport AutocompleteHelper from \"./autocompleteHelper\";\r\nimport AutocompleteHelperController from \"./autocompleteHelperController\";\r\nimport Button from \"../button\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { MyPhoto } from \"../../lib/appManagers/appPhotosManager\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport GifsMasonry from \"../gifsMasonry\";\r\nimport { SuperStickerRenderer } from \"../emoticonsDropdown/tabs/stickers\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\n\r\nconst ANIMATION_GROUP = 'INLINE-HELPER';\r\n// const GRID_ITEMS = 5;\r\n\r\nexport default class InlineHelper extends AutocompleteHelper {\r\n private scrollable: Scrollable;\r\n private lazyLoadQueue: LazyLoadQueue;\r\n private gifsMasonry: GifsMasonry;\r\n private superStickerRenderer: SuperStickerRenderer;\r\n private onChangeScreen: () => void;\r\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\r\n\r\n constructor(appendTo: HTMLElement, \r\n controller: AutocompleteHelperController,\r\n private chat: Chat,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager) {\r\n super({\r\n appendTo, \r\n controller,\r\n listType: 'xy', \r\n waitForKey: ['ArrowUp', 'ArrowDown'],\r\n onSelect: (target) => {\r\n if(!target) return false; // can happen when there is only button\r\n const {peerId, botId, queryId} = this.list.dataset;\r\n return this.chat.input.getReadyToSend(() => {\r\n const queryAndResultIds = this.appInlineBotsManager.generateQId(queryId, (target as HTMLElement).dataset.resultId);\r\n this.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\r\n clearDraft: true,\r\n scheduleDate: this.chat.input.scheduleDate,\r\n silent: this.chat.input.sendSilent,\r\n replyToMsgId: this.chat.input.replyToMsgId\r\n });\r\n\r\n this.chat.input.onMessageSent(true, true);\r\n });\r\n }\r\n });\r\n\r\n this.container.classList.add('inline-helper');\r\n\r\n this.addEventListener('visible', () => {\r\n setTimeout(() => { // it is not rendered yet\r\n this.scrollable.container.scrollTop = 0;\r\n }, 0); \r\n });\r\n\r\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\r\n\r\n this.addEventListener('hidden', () => {\r\n if(this.onChangeScreen) {\r\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\r\n this.onChangeScreen = undefined;\r\n }\r\n });\r\n }\r\n\r\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\r\n const middleware = this.controller.getMiddleware();\r\n\r\n const peer = await this.appUsersManager.resolveUsername(username);\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(peer._ !== 'user') {\r\n throw 'NOT_A_BOT';\r\n }\r\n\r\n const renderPromise = this.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then(botResults => {\r\n if(!middleware()) {\r\n throw 'PEER_CHANGED';\r\n }\r\n\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n const list = this.list.cloneNode() as HTMLElement;\r\n list.dataset.peerId = '' + peerId;\r\n list.dataset.botId = '' + peer.id;\r\n list.dataset.queryId = '' + botResults.query_id;\r\n\r\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\r\n\r\n this.lazyLoadQueue.clear();\r\n this.superStickerRenderer.clear();\r\n \r\n const loadPromises: Promise[] = [];\r\n const isGallery = !!botResults.pFlags.gallery;\r\n // botResults.results.length = 3;\r\n for(const item of botResults.results) {\r\n const container = document.createElement('div');\r\n container.classList.add('inline-helper-result');\r\n container.dataset.resultId = item.id;\r\n \r\n const preview = isGallery ? undefined : document.createElement('div');\r\n if(preview) {\r\n preview.classList.add('inline-helper-result-preview');\r\n\r\n container.append(preview);\r\n }\r\n\r\n list.append(container);\r\n\r\n if(!isGallery) {\r\n preview.classList.add('empty');\r\n preview.innerHTML = RichTextProcessor.wrapEmojiText([...item.title.trim()][0]);\r\n\r\n const title = document.createElement('div');\r\n title.classList.add('inline-helper-result-title');\r\n title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = RichTextProcessor.wrapRichText(item.description, {\r\n noCommands: true,\r\n noLinks: true\r\n });\r\n \r\n container.append(title, description);\r\n \r\n const separator = document.createElement('div');\r\n separator.classList.add('inline-helper-separator');\r\n \r\n list.append(separator);\r\n } else {\r\n container.classList.add('grid-item');\r\n }\r\n \r\n if(item._ === 'botInlineResult') {\r\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\r\n let mediaContainer: HTMLElement;\r\n if(preview) {\r\n mediaContainer = document.createElement('div');\r\n preview.append(mediaContainer);\r\n } else {\r\n mediaContainer = container;\r\n }\r\n\r\n mediaContainer.classList.add('media-container'); \r\n isGallery && mediaContainer.classList.add('no-border-radius');\r\n\r\n this.lazyLoadQueue.push({\r\n div: container,\r\n load: () => {\r\n return appDownloadManager.download({\r\n dcId: 4,\r\n location: {\r\n _: 'inputWebFileLocation',\r\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\r\n url: item.thumb.url\r\n },\r\n size: item.thumb.size,\r\n mimeType: item.thumb.mime_type\r\n }).then(blob => {\r\n const image = new Image();\r\n image.classList.add('media-photo');\r\n readBlobAsDataURL(blob).then(dataURL => {\r\n renderImageWithFadeIn(mediaContainer, image, dataURL, true);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n } else {\r\n const media = item.document as MyDocument || item.photo as MyPhoto;\r\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\r\n assumeType(media);\r\n\r\n if(media.type === 'gif') {\r\n gifsMasonry.add(media, container);\r\n } else if(media.type === 'sticker') {\r\n container.classList.add('super-sticker');\r\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\r\n if(media.sticker === 2) {\r\n this.superStickerRenderer.observeAnimatedDiv(container);\r\n }\r\n }\r\n } else if(media) {\r\n const size = isGallery ? 48 : undefined;\r\n isGallery && container.classList.add('no-border-radius');\r\n wrapPhoto({\r\n photo: media,\r\n container: isGallery ? container : preview,\r\n boxWidth: size,\r\n boxHeight: size,\r\n middleware,\r\n lazyLoadQueue: this.lazyLoadQueue,\r\n loadPromises\r\n });\r\n }\r\n }\r\n }\r\n\r\n return Promise.all(loadPromises).then(() => {\r\n if(!middleware()) {\r\n gifsMasonry.clear();\r\n return;\r\n }\r\n\r\n list.classList.toggle('is-gallery', isGallery);\r\n list.classList.toggle('super-stickers', isGallery);\r\n this.container.classList.toggle('is-gallery', isGallery);\r\n\r\n /* if(isGallery) {\r\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\r\n }\r\n\r\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\r\n\r\n const parent = this.list.parentElement;\r\n parent.textContent = '';\r\n if(botResults.switch_pm) {\r\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\r\n btnSwitchToPM.insertAdjacentHTML('beforeend', RichTextProcessor.wrapEmojiText(botResults.switch_pm.text));\r\n attachClickEvent(btnSwitchToPM, (e) => {\r\n this.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\r\n });\r\n parent.append(btnSwitchToPM);\r\n }\r\n parent.append(this.list = list);\r\n\r\n if(this.gifsMasonry) {\r\n this.gifsMasonry.detach();\r\n }\r\n this.gifsMasonry = gifsMasonry;\r\n gifsMasonry.attach();\r\n\r\n if(!this.onChangeScreen) {\r\n this.onChangeScreen = () => {\r\n if(this.list.classList.contains('is-gallery')) {\r\n const width = (this.list.childElementCount * mediaSizes.active.esgSticker.width) + (this.list.childElementCount - 1 * 1);\r\n this.list.style.width = width + 'px';\r\n } else {\r\n this.list.style.width = '';\r\n }\r\n };\r\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\r\n }\r\n\r\n this.onChangeScreen();\r\n \r\n this.toggle(!botResults.results.length && !botResults.switch_pm);\r\n this.scrollable.scrollTop = 0;\r\n });\r\n });\r\n\r\n return {user: peer, renderPromise};\r\n };\r\n\r\n protected init() {\r\n this.list = document.createElement('div');\r\n this.list.classList.add('inline-helper-results');\r\n\r\n this.container.append(this.list);\r\n\r\n this.scrollable = new Scrollable(this.container);\r\n this.lazyLoadQueue = new LazyLoadQueue();\r\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppNotificationsManager } from '../../lib/appManagers/appNotificationsManager';\r\nimport type { AppChatsManager } from '../../lib/appManagers/appChatsManager';\r\nimport type { AppDocsManager, MyDocument } from \"../../lib/appManagers/appDocsManager\";\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from '../../lib/appManagers/appPeersManager';\r\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\r\nimport type { AppImManager } from '../../lib/appManagers/appImManager';\r\nimport type { AppDraftsManager, MyDraftMessage } from '../../lib/appManagers/appDraftsManager';\r\nimport type { AppEmojiManager } from '../../lib/appManagers/appEmojiManager';\r\nimport type { ServerTimeManager } from '../../lib/mtproto/serverTimeManager';\r\nimport type { AppUsersManager } from '../../lib/appManagers/appUsersManager';\r\nimport type { AppInlineBotsManager } from '../../lib/appManagers/appInlineBotsManager';\r\nimport type { AppMessagesIdsManager } from '../../lib/appManagers/appMessagesIdsManager';\r\nimport type Chat from './chat';\r\nimport Recorder from '../../../public/recorder.min';\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport apiManager from \"../../lib/mtproto/mtprotoworker\";\r\n//import Recorder from '../opus-recorder/dist/recorder.min';\r\nimport opusDecodeController from \"../../lib/opusDecodeController\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonMenu, { ButtonMenuItemOptions } from '../buttonMenu';\r\nimport emoticonsDropdown from \"../emoticonsDropdown\";\r\nimport PopupCreatePoll from \"../popups/createPoll\";\r\nimport PopupForward from '../popups/forward';\r\nimport PopupNewMedia from '../popups/newMedia';\r\nimport { toast } from \"../toast\";\r\nimport { wrapReply } from \"../wrappers\";\r\nimport InputField from '../inputField';\r\nimport { MessageEntity, DraftMessage, WebPage, Message } from '../../layer';\r\nimport StickersHelper from './stickersHelper';\r\nimport ButtonIcon from '../buttonIcon';\r\nimport ButtonMenuToggle from '../buttonMenuToggle';\r\nimport ListenerSetter, { Listener } from '../../helpers/listenerSetter';\r\nimport Button from '../button';\r\nimport PopupSchedule from '../popups/schedule';\r\nimport SendMenu from './sendContextMenu';\r\nimport rootScope from '../../lib/rootScope';\r\nimport PopupPinMessage from '../popups/unpinMessage';\r\nimport { tsNow } from '../../helpers/date';\r\nimport appNavigationController, { NavigationItem } from '../appNavigationController';\r\nimport { IS_MOBILE, IS_MOBILE_SAFARI } from '../../environment/userAgent';\r\nimport I18n, { i18n, join, LangPackKey } from '../../lib/langPack';\r\nimport { generateTail } from './bubbles';\r\nimport findUpClassName from '../../helpers/dom/findUpClassName';\r\nimport ButtonCorner from '../buttonCorner';\r\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\r\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\r\nimport cancelSelection from '../../helpers/dom/cancelSelection';\r\nimport { attachClickEvent, simulateClickEvent } from '../../helpers/dom/clickEvent';\r\nimport getRichValue from '../../helpers/dom/getRichValue';\r\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\r\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\r\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\r\nimport { MarkdownType, markdownTags } from '../../helpers/dom/getRichElementValue';\r\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\r\nimport EmojiHelper from './emojiHelper';\r\nimport CommandsHelper from './commandsHelper';\r\nimport AutocompleteHelperController from './autocompleteHelperController';\r\nimport AutocompleteHelper from './autocompleteHelper';\r\nimport MentionsHelper from './mentionsHelper';\r\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\r\nimport { emojiFromCodePoints } from '../../vendor/emoji';\r\nimport ReplyKeyboard from './replyKeyboard';\r\nimport InlineHelper from './inlineHelper';\r\nimport debounce from '../../helpers/schedulers/debounce';\r\nimport noop from '../../helpers/noop';\r\nimport { openBtnMenu, putPreloader } from '../misc';\r\nimport SetTransition from '../singleTransition';\r\nimport PeerTitle from '../peerTitle';\r\nimport { fastRaf } from '../../helpers/schedulers';\r\nimport PopupDeleteMessages from '../popups/deleteMessages';\r\nimport fixSafariStickyInputFocusing, { IS_STICKY_INPUT_BUGGED } from '../../helpers/dom/fixSafariStickyInputFocusing';\r\nimport { copy } from '../../helpers/object';\r\nimport PopupPeer from '../popups/peer';\r\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\r\nimport appMediaPlaybackController from '../appMediaPlaybackController';\r\nimport { BOT_START_PARAM, NULL_PEER_ID } from '../../lib/mtproto/mtproto_config';\r\nimport setCaretAt from '../../helpers/dom/setCaretAt';\r\nimport CheckboxField from '../checkboxField';\r\nimport DropdownHover from '../../helpers/dropdownHover';\r\nimport RadioForm from '../radioForm';\r\nimport findUpTag from '../../helpers/dom/findUpTag';\r\nimport toggleDisability from '../../helpers/dom/toggleDisability';\r\n\r\nconst RECORD_MIN_TIME = 500;\r\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\r\n\r\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\r\n\r\nexport default class ChatInput {\r\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\r\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\r\n public messageInput: HTMLElement;\r\n public messageInputField: InputField;\r\n private fileInput: HTMLInputElement;\r\n private inputMessageContainer: HTMLDivElement;\r\n private btnSend: HTMLButtonElement;\r\n private btnCancelRecord: HTMLButtonElement;\r\n private lastUrl = '';\r\n private lastTimeType = 0;\r\n\r\n public chatInput: HTMLElement;\r\n public inputContainer: HTMLElement;\r\n public rowsWrapper: HTMLDivElement;\r\n private newMessageWrapper: HTMLDivElement;\r\n private btnToggleEmoticons: HTMLButtonElement;\r\n private btnToggleReplyMarkup: HTMLButtonElement;\r\n private btnSendContainer: HTMLDivElement;\r\n\r\n private replyKeyboard: ReplyKeyboard;\r\n\r\n private attachMenu: HTMLButtonElement;\r\n private attachMenuButtons: (ButtonMenuItemOptions & {verify: (peerId: PeerId, threadId: number) => boolean})[];\r\n\r\n private sendMenu: SendMenu;\r\n\r\n private replyElements: {\r\n container: HTMLElement,\r\n cancelBtn: HTMLButtonElement,\r\n iconBtn: HTMLButtonElement\r\n } = {} as any;\r\n\r\n private forwardElements: {\r\n changePeer: ButtonMenuItemOptions,\r\n showSender: ButtonMenuItemOptions,\r\n hideSender: ButtonMenuItemOptions,\r\n showCaption: ButtonMenuItemOptions,\r\n hideCaption: ButtonMenuItemOptions,\r\n container: HTMLElement,\r\n modifyArgs?: ButtonMenuItemOptions[]\r\n }; \r\n private forwardHover: DropdownHover;\r\n private forwardWasDroppingAuthor: boolean;\r\n\r\n private getWebPagePromise: Promise;\r\n private willSendWebPage: WebPage = null;\r\n private forwarding: {[fromPeerId: PeerId]: number[]};\r\n public replyToMsgId: number;\r\n public editMsgId: number;\r\n public editMessage: Message.message;\r\n private noWebPage: true;\r\n public scheduleDate: number;\r\n public sendSilent: true;\r\n public startParam: string;\r\n\r\n private recorder: any;\r\n public recording = false;\r\n private recordCanceled = false;\r\n private recordTimeEl: HTMLElement;\r\n private recordRippleEl: HTMLElement;\r\n private recordStartTime = 0;\r\n private recordingOverlayListener: Listener;\r\n private recordingNavigationItem: NavigationItem;\r\n\r\n // private scrollTop = 0;\r\n // private scrollOffsetTop = 0;\r\n // private scrollDiff = 0;\r\n\r\n public helperType: Exclude;\r\n private helperFunc: () => void;\r\n private helperWaitingForward: boolean;\r\n\r\n public willAttachType: 'document' | 'media';\r\n\r\n private lockRedo = false;\r\n private canRedoFromHTML = '';\r\n private readonly undoHistory: string[] = [];\r\n private readonly executedHistory: string[] = [];\r\n private canUndoFromHTML = '';\r\n\r\n private autocompleteHelperController: AutocompleteHelperController;\r\n private stickersHelper: StickersHelper;\r\n private emojiHelper: EmojiHelper;\r\n private commandsHelper: CommandsHelper;\r\n private mentionsHelper: MentionsHelper;\r\n private inlineHelper: InlineHelper;\r\n private listenerSetter: ListenerSetter;\r\n\r\n private pinnedControlBtn: HTMLButtonElement;\r\n\r\n private goDownBtn: HTMLButtonElement;\r\n private goDownUnreadBadge: HTMLElement;\r\n private goMentionBtn: HTMLButtonElement;\r\n private goMentionUnreadBadge: HTMLSpanElement;\r\n private btnScheduled: HTMLButtonElement;\r\n\r\n private btnPreloader: HTMLButtonElement;\r\n\r\n private saveDraftDebounced: () => void;\r\n\r\n private fakeRowsWrapper: HTMLDivElement;\r\n\r\n private previousQuery: string;\r\n \r\n private releaseMediaPlayback: () => void;\r\n\r\n private botStartBtn: HTMLButtonElement;\r\n private rowsWrapperWrapper: HTMLDivElement;\r\n private controlContainer: HTMLElement;\r\n private fakeSelectionWrapper: HTMLDivElement;\r\n\r\n private fakeWrapperTo: HTMLElement;\r\n private toggleBotStartBtnDisability: () => void;\r\n\r\n // private activeContainer: HTMLElement;\r\n\r\n constructor(private chat: Chat, \r\n private appMessagesManager: AppMessagesManager, \r\n private appMessagesIdsManager: AppMessagesIdsManager, \r\n private appDocsManager: AppDocsManager, \r\n private appChatsManager: AppChatsManager, \r\n private appPeersManager: AppPeersManager, \r\n private appWebPagesManager: AppWebPagesManager, \r\n private appImManager: AppImManager, \r\n private appDraftsManager: AppDraftsManager, \r\n private serverTimeManager: ServerTimeManager, \r\n private appNotificationsManager: AppNotificationsManager,\r\n private appEmojiManager: AppEmojiManager,\r\n private appUsersManager: AppUsersManager,\r\n private appInlineBotsManager: AppInlineBotsManager\r\n ) {\r\n this.listenerSetter = new ListenerSetter();\r\n }\r\n\r\n public construct() {\r\n this.chatInput = document.createElement('div');\r\n this.chatInput.classList.add('chat-input');\r\n this.chatInput.style.display = 'none';\r\n\r\n this.inputContainer = document.createElement('div');\r\n this.inputContainer.classList.add('chat-input-container');\r\n\r\n this.rowsWrapperWrapper = document.createElement('div');\r\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\r\n\r\n this.rowsWrapper = document.createElement('div');\r\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\r\n\r\n this.rowsWrapperWrapper.append(this.rowsWrapper);\r\n\r\n const tail = generateTail();\r\n this.rowsWrapper.append(tail);\r\n\r\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\r\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\r\n\r\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\r\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\r\n\r\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\r\n this.chatInput.append(this.inputContainer);\r\n\r\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button bubbles-go-down hide'});\r\n this.inputContainer.append(this.goDownBtn);\r\n\r\n attachClickEvent(this.goDownBtn, (e) => {\r\n cancelEvent(e);\r\n this.chat.bubbles.onGoDownClick();\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n // * constructor end\r\n\r\n /* let setScrollTopTimeout: number;\r\n // @ts-ignore\r\n let height = window.visualViewport.height; */\r\n // @ts-ignore\r\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n // const wasScrolledDown = scrollable.isScrolledDown;\r\n \r\n // /* if(wasScrolledDown) {\r\n // this.saveScroll();\r\n // } */\r\n \r\n // // @ts-ignore\r\n // let newHeight = window.visualViewport.height;\r\n // const diff = height - newHeight;\r\n // const scrollTop = scrollable.scrollTop;\r\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n\r\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n // setScrollTopTimeout = window.setTimeout(() => {\r\n // const diff = height - newHeight;\r\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\r\n // height = newHeight;\r\n\r\n // scrollable.scrollTop = needScrollTop;\r\n \r\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n\r\n // /* if(isScrolledDown) {\r\n // scrollable.scrollTop = scrollable.scrollHeight;\r\n // } */\r\n\r\n // //scrollable.scrollTop += diff;\r\n // setScrollTopTimeout = 0;\r\n // }, 0);\r\n // });\r\n\r\n // ! Can't use it with resizeObserver\r\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\r\n const scrollable = this.chat.bubbles.scrollable;\r\n const wasScrolledDown = scrollable.isScrolledDown;\r\n\r\n // @ts-ignore\r\n let newHeight = window.visualViewport.height;\r\n const diff = height - newHeight;\r\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\r\n\r\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\r\n\r\n scrollable.scrollTop = needScrollTop;\r\n height = newHeight;\r\n\r\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\r\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\r\n scrollable.scrollTop = needScrollTop;\r\n \r\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\r\n setScrollTopTimeout = 0;\r\n }, 0);\r\n }); */\r\n\r\n const c = this.controlContainer = document.createElement('div');\r\n c.classList.add('chat-input-control', 'chat-input-wrapper');\r\n this.inputContainer.append(c);\r\n }\r\n\r\n public constructPeerHelpers() {\r\n this.replyElements.container = document.createElement('div');\r\n this.replyElements.container.classList.add('reply-wrapper');\r\n\r\n this.replyElements.iconBtn = ButtonIcon('');\r\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\r\n\r\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\r\n\r\n //\r\n\r\n const onHideAuthorClick = () => {\r\n isChangingAuthor = true;\r\n return this.canToggleHideAuthor();\r\n };\r\n\r\n const onHideCaptionClick = () => {\r\n isChangingAuthor = false;\r\n };\r\n\r\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\r\n let isChangingAuthor = false;\r\n const forwardButtons: ButtonMenuItemOptions[] = [\r\n forwardElements.showSender = {\r\n text: 'Chat.Alert.Forward.Action.Show1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideSender = {\r\n text: 'Chat.Alert.Forward.Action.Hide1',\r\n onClick: onHideAuthorClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.showCaption = {\r\n text: 'Chat.Alert.Forward.Action.ShowCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: true})\r\n },\r\n forwardElements.hideCaption = {\r\n text: 'Chat.Alert.Forward.Action.HideCaption',\r\n onClick: onHideCaptionClick,\r\n checkboxField: new CheckboxField({checked: false})\r\n },\r\n forwardElements.changePeer = {\r\n text: 'Chat.Alert.Forward.Action.Another',\r\n onClick: () => {\r\n this.changeForwardRecipient();\r\n },\r\n icon: 'replace'\r\n }\r\n ];\r\n const forwardBtnMenu = forwardElements.container = ButtonMenu(forwardButtons, this.listenerSetter);\r\n // forwardBtnMenu.classList.add('top-center');\r\n\r\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\r\n const groups: {\r\n elements: HTMLElement[],\r\n onChange: (value: string, event: Event) => void\r\n }[] = [{\r\n elements: children.slice(0, 2),\r\n onChange: (value, e) => {\r\n const checked = !!+value;\r\n if(isChangingAuthor) {\r\n this.forwardWasDroppingAuthor = !checked;\r\n }\r\n\r\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\r\n if(replyTitle) {\r\n const el = replyTitle.firstElementChild as HTMLElement;\r\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\r\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n i.key = langPackKey;\r\n i.update();\r\n }\r\n }\r\n }, {\r\n elements: children.slice(2, 4),\r\n onChange: (value) => {\r\n const checked = !!+value;\r\n let b: ButtonMenuItemOptions;\r\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\r\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\r\n } else {\r\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\r\n }\r\n\r\n b.checkboxField.checked = true;\r\n }\r\n }];\r\n groups.forEach(group => {\r\n const container = RadioForm(group.elements.map(e => {\r\n return {\r\n container: e, \r\n input: e.querySelector('input')\r\n };\r\n }), group.onChange);\r\n\r\n const hr = document.createElement('hr');\r\n container.append(hr);\r\n forwardBtnMenu.append(container);\r\n });\r\n\r\n forwardBtnMenu.append(forwardElements.changePeer.element);\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const forwardHover = this.forwardHover = new DropdownHover({\r\n element: forwardBtnMenu\r\n });\r\n }\r\n\r\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\r\n this.replyElements.container.append(forwardBtnMenu);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const {input} = b.checkboxField;\r\n input.type = 'radio';\r\n input.name = idx < 2 ? 'author' : 'caption';\r\n input.value = '' + +!(idx % 2);\r\n });\r\n\r\n //\r\n\r\n this.newMessageWrapper = document.createElement('div');\r\n this.newMessageWrapper.classList.add('new-message-wrapper');\r\n\r\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\r\n\r\n this.inputMessageContainer = document.createElement('div');\r\n this.inputMessageContainer.classList.add('input-message-container');\r\n\r\n if(this.chat.type === 'chat') {\r\n this.goDownUnreadBadge = document.createElement('span');\r\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goDownBtn.append(this.goDownUnreadBadge);\r\n\r\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button bubbles-go-mention'});\r\n this.goMentionUnreadBadge = document.createElement('span');\r\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\r\n this.goMentionBtn.append(this.goMentionUnreadBadge);\r\n this.inputContainer.append(this.goMentionBtn);\r\n\r\n attachClickEvent(this.goMentionBtn, (e) => {\r\n cancelEvent(e);\r\n this.appMessagesManager.goToNextMention(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\r\n\r\n attachClickEvent(this.btnScheduled, (e) => {\r\n this.appImManager.openScheduled(this.chat.peerId);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.btnScheduled.classList.remove('hide');\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\r\n if(this.chat.peerId !== peerId) {\r\n return;\r\n }\r\n\r\n this.appMessagesManager.getScheduledMessages(this.chat.peerId).then(value => {\r\n this.btnScheduled.classList.toggle('hide', !value.length);\r\n });\r\n });\r\n\r\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\r\n this.replyKeyboard = new ReplyKeyboard({\r\n appendTo: this.rowsWrapper,\r\n listenerSetter: this.listenerSetter,\r\n appMessagesManager: this.appMessagesManager,\r\n btnHover: this.btnToggleReplyMarkup,\r\n chatInput: this\r\n });\r\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\r\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\r\n }\r\n\r\n this.attachMenuButtons = [{\r\n icon: 'image',\r\n text: 'Chat.Input.Attach.PhotoOrVideo',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\r\n this.fileInput.setAttribute('accept', accept);\r\n this.willAttachType = 'media';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'document',\r\n text: 'Chat.Input.Attach.Document',\r\n onClick: () => {\r\n this.fileInput.value = '';\r\n this.fileInput.removeAttribute('accept');\r\n this.willAttachType = 'document';\r\n this.fileInput.click();\r\n },\r\n verify: () => this.chat.canSend('send_media')\r\n }, {\r\n icon: 'poll',\r\n text: 'Poll',\r\n onClick: () => {\r\n new PopupCreatePoll(this.chat).show();\r\n },\r\n verify: (peerId) => peerId.isAnyChat() && this.chat.canSend('send_polls')\r\n }];\r\n\r\n this.attachMenu = ButtonMenuToggle({noRipple: true, listenerSetter: this.listenerSetter}, 'top-left', this.attachMenuButtons);\r\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\r\n this.attachMenu.classList.remove('tgico-more');\r\n\r\n //this.inputContainer.append(this.sendMenu);\r\n\r\n this.recordTimeEl = document.createElement('div');\r\n this.recordTimeEl.classList.add('record-time');\r\n\r\n this.fileInput = document.createElement('input');\r\n this.fileInput.type = 'file';\r\n this.fileInput.multiple = true;\r\n this.fileInput.style.display = 'none';\r\n\r\n this.newMessageWrapper.append(...[this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\r\n\r\n this.rowsWrapper.append(this.replyElements.container);\r\n this.autocompleteHelperController = new AutocompleteHelperController();\r\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController);\r\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.appEmojiManager);\r\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.chat.appProfileManager, this.chat.appUsersManager);\r\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.appUsersManager, this.appInlineBotsManager);\r\n this.rowsWrapper.append(this.newMessageWrapper);\r\n\r\n this.btnCancelRecord = ButtonIcon('delete danger btn-circle z-depth-1 btn-record-cancel');\r\n\r\n this.btnSendContainer = document.createElement('div');\r\n this.btnSendContainer.classList.add('btn-send-container');\r\n\r\n this.recordRippleEl = document.createElement('div');\r\n this.recordRippleEl.classList.add('record-ripple');\r\n\r\n this.btnSend = ButtonIcon('none btn-circle z-depth-1 btn-send animated-button-icon');\r\n this.btnSend.insertAdjacentHTML('afterbegin', `\r\n \r\n \r\n \r\n \r\n `);\r\n\r\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\r\n\r\n if(this.chat.type !== 'scheduled') {\r\n this.sendMenu = new SendMenu({\r\n onSilentClick: () => {\r\n this.sendSilent = true;\r\n this.sendMessage();\r\n },\r\n onScheduleClick: () => {\r\n this.scheduleSending(undefined);\r\n },\r\n listenerSetter: this.listenerSetter,\r\n openSide: 'top-left',\r\n onContextElement: this.btnSend,\r\n onOpen: () => {\r\n return !this.isInputEmpty() || !!Object.keys(this.forwarding).length;\r\n }\r\n });\r\n \r\n this.btnSendContainer.append(this.sendMenu.sendMenu);\r\n }\r\n\r\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\r\n\r\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\r\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\r\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\r\n\r\n this.attachMessageInputField();\r\n\r\n /* this.attachMenu.addEventListener('mousedown', (e) => {\r\n const hidden = this.attachMenu.querySelectorAll('.hide');\r\n if(hidden.length === this.attachMenuButtons.length) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n cancelEvent(e);\r\n return false;\r\n }\r\n }, {passive: false, capture: true}); */\r\n\r\n this.listenerSetter.add(rootScope)('settings_updated', () => {\r\n if(this.stickersHelper || this.emojiHelper) {\r\n // this.previousQuery = undefined;\r\n this.previousQuery = '';\r\n this.checkAutocomplete();\r\n /* if(!rootScope.settings.stickers.suggest) {\r\n this.stickersHelper.checkEmoticon('');\r\n } else {\r\n this.onMessageInput();\r\n } */\r\n }\r\n\r\n if(this.messageInputField) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\r\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId) return;\r\n this.setDraft(draft, true, force);\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_changing', (chat) => {\r\n if(this.chat === chat) {\r\n this.saveDraft();\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('chat_changing', ({from, to}) => {\r\n if(this.chat === from) {\r\n this.autocompleteHelperController.toggleListNavigation(false);\r\n } else if(this.chat === to) {\r\n this.autocompleteHelperController.toggleListNavigation(true);\r\n }\r\n });\r\n\r\n if(this.chat.type === 'scheduled') {\r\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\r\n if(this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n });\r\n } else {\r\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\r\n if(this.chat.peerId === peerId) {\r\n if(msgs.has(this.editMsgId)) {\r\n this.onMessageSent();\r\n }\r\n\r\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\r\n this.clearHelper('reply');\r\n }\r\n\r\n /* if(this.chat.isStartButtonNeeded()) {\r\n this.setStartParam(BOT_START_PARAM);\r\n } */\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\r\n if(dialogs[this.chat.peerId]) {\r\n if(this.startParam === BOT_START_PARAM) {\r\n this.setStartParam();\r\n } else { // updateNewMessage comes earlier than dialog appers\r\n this.center(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n try {\r\n this.recorder = new Recorder({\r\n //encoderBitRate: 32,\r\n //encoderPath: \"../dist/encoderWorker.min.js\",\r\n encoderSampleRate: 48000,\r\n monitorGain: 0,\r\n numberOfChannels: 1,\r\n recordingGain: 1,\r\n reuseWorker: true\r\n });\r\n } catch(err) {\r\n console.error('Recorder constructor error:', err);\r\n }\r\n\r\n this.updateSendBtn();\r\n\r\n this.listenerSetter.add(this.fileInput)('change', (e) => {\r\n let files = (e.target as HTMLInputElement & EventTarget).files;\r\n if(!files.length) {\r\n return;\r\n }\r\n \r\n new PopupNewMedia(this.chat, Array.from(files).slice(), this.willAttachType);\r\n this.fileInput.value = '';\r\n }, false);\r\n\r\n /* let time = Date.now();\r\n this.btnSend.addEventListener('touchstart', (e) => {\r\n time = Date.now();\r\n });\r\n\r\n let eventName1 = 'touchend';\r\n this.btnSend.addEventListener(eventName1, (e: Event) => {\r\n //cancelEvent(e);\r\n console.log(eventName1 + ', time: ' + (Date.now() - time));\r\n });\r\n\r\n let eventName = 'mousedown';\r\n this.btnSend.addEventListener(eventName, (e: Event) => {\r\n cancelEvent(e);\r\n console.log(eventName + ', time: ' + (Date.now() - time));\r\n }); */\r\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\r\n\r\n if(this.recorder) {\r\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.recorder.onstop = () => {\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n this.recordRippleEl.style.transform = '';\r\n };\r\n \r\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\r\n if(this.releaseMediaPlayback) {\r\n this.releaseMediaPlayback();\r\n this.releaseMediaPlayback = undefined;\r\n }\r\n\r\n if(this.recordingOverlayListener) {\r\n this.listenerSetter.remove(this.recordingOverlayListener);\r\n this.recordingOverlayListener = undefined;\r\n }\r\n\r\n if(this.recordingNavigationItem) {\r\n appNavigationController.removeItem(this.recordingNavigationItem);\r\n this.recordingNavigationItem = undefined;\r\n }\r\n\r\n if(this.recordCanceled) {\r\n return;\r\n }\r\n\r\n const {peerId, threadId} = this.chat;\r\n const replyToMsgId = this.replyToMsgId;\r\n \r\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\r\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\r\n /* const fileName = new Date().toISOString() + \".opus\";\r\n console.log('Recorder data received', typedArray, dataBlob); */\r\n\r\n //let perf = performance.now();\r\n opusDecodeController.decode(typedArray, true).then(result => {\r\n //console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\r\n \r\n opusDecodeController.setKeepAlive(false);\r\n \r\n // тут objectURL ставится уже с audio/wav\r\n this.appMessagesManager.sendFile(peerId, dataBlob, {\r\n isVoiceMessage: true,\r\n isMedia: true,\r\n duration,\r\n waveform: result.waveform,\r\n objectURL: result.url,\r\n replyToMsgId,\r\n threadId,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, true);\r\n });\r\n };\r\n }\r\n\r\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\r\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\r\n\r\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\r\n\r\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\r\n this.botStartBtn.append(i18n('BotStart'));\r\n\r\n attachClickEvent(this.botStartBtn, () => {\r\n const {startParam} = this;\r\n if(startParam === undefined) {\r\n return;\r\n }\r\n\r\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\r\n const peerId = this.chat.peerId;\r\n const middleware = this.chat.bubbles.getMiddleware(() => {\r\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\r\n });\r\n\r\n this.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\r\n if(middleware()) {\r\n toggle();\r\n this.toggleBotStartBtnDisability = undefined;\r\n this.setStartParam();\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.controlContainer.append(this.botStartBtn);\r\n }\r\n\r\n public constructPinnedHelpers() {\r\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\r\n this.controlContainer.append(this.pinnedControlBtn);\r\n\r\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\r\n const peerId = this.chat.peerId;\r\n\r\n new PopupPinMessage(peerId, 0, true, () => {\r\n this.chat.appImManager.setPeer(); // * close tab\r\n\r\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\r\n const originalChat = this.chat.appImManager.chat;\r\n if(originalChat.topbar.pinnedMessage) {\r\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\r\n }\r\n });\r\n });\r\n\r\n this.chatInput.classList.add('type-pinned');\r\n }\r\n\r\n public center(animate = false) {\r\n const neededFakeContainer = this.getNeededFakeContainer();\r\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\r\n return;\r\n }\r\n\r\n if(neededFakeContainer === this.fakeWrapperTo) {\r\n return;\r\n }\r\n\r\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\r\n this.inputContainer.classList.remove('is-centering');\r\n void this.rowsWrapper.offsetLeft; // reflow\r\n // this.inputContainer.classList.add('is-centering');\r\n // void this.rowsWrapper.offsetLeft; // reflow\r\n } */\r\n\r\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\r\n const forwards = !!neededFakeContainer;\r\n const oldFakeWrapperTo = this.fakeWrapperTo;\r\n let transform = '', borderRadius = '', needTranslateX: number;\r\n // if(forwards) {]\r\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\r\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\r\n const widthFrom = fakeRowsRect.width;\r\n const widthTo = fakeSelectionRect.width;\r\n\r\n if(widthFrom !== widthTo) {\r\n const scale = (widthTo/* - 8 */) / widthFrom;\r\n const initTranslateX = (widthFrom - widthTo) / 2;\r\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\r\n\r\n if(forwards) {\r\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\r\n // transform = `translateX(0px) scaleX(${scale})`;\r\n \r\n if(scale < 1) {\r\n const br = 12;\r\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\r\n }\r\n }\r\n //scale = widthTo / widthFrom;\r\n }\r\n // }\r\n\r\n this.fakeWrapperTo = neededFakeContainer;\r\n\r\n const duration = animate ? 200 : 0;\r\n SetTransition(this.inputContainer, 'is-centering', forwards, duration);\r\n SetTransition(this.rowsWrapperWrapper, 'is-centering-to-control', !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')), duration);\r\n this.rowsWrapper.style.transform = transform;\r\n this.rowsWrapper.style.borderRadius = borderRadius;\r\n\r\n return {\r\n transform, \r\n borderRadius, \r\n needTranslateX: oldFakeWrapperTo && (\r\n (\r\n neededFakeContainer && \r\n neededFakeContainer.classList.contains('chat-input-control') && \r\n oldFakeWrapperTo === this.fakeSelectionWrapper\r\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\r\n ) ? needTranslateX * -.5 : needTranslateX,\r\n widthFrom, \r\n widthTo\r\n };\r\n }\r\n\r\n public setStartParam(startParam?: string) {\r\n if(this.startParam === startParam) {\r\n return;\r\n }\r\n\r\n this.startParam = startParam;\r\n this.center(true);\r\n }\r\n\r\n public getNeededFakeContainer() {\r\n if(this.chat.selection.isSelecting) {\r\n return this.fakeSelectionWrapper;\r\n } else if(this.startParam !== undefined || \r\n !this.chat.canSend() || \r\n this.chat.type === 'pinned' || \r\n this.chat.isStartButtonNeeded()\r\n ) {\r\n return this.controlContainer;\r\n }\r\n }\r\n\r\n // public getActiveContainer() {\r\n // if(this.chat.selection.isSelecting) {\r\n // return this.chat\r\n // }\r\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\r\n // }\r\n\r\n // public setActiveContainer() {\r\n // const container = this.activeContainer;\r\n // const newContainer = this.getActiveContainer();\r\n // if(newContainer === container) {\r\n // return;\r\n // }\r\n\r\n\r\n // }\r\n\r\n private onCancelRecordClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n \r\n this.recordCanceled = true;\r\n this.recorder.stop();\r\n opusDecodeController.setKeepAlive(false);\r\n };\r\n\r\n private onEmoticonsOpen = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\r\n };\r\n\r\n private onEmoticonsClose = () => {\r\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\r\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\r\n };\r\n\r\n public getReadyToSend(callback: () => void) {\r\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\r\n }\r\n\r\n public scheduleSending = (callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\r\n const {peerId} = this.chat;\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && this.appUsersManager.isUserOnlineVisible(peerId);\r\n\r\n new PopupSchedule(initDate, (timestamp) => {\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\r\n if(timestamp <= minTimestamp) {\r\n timestamp = undefined;\r\n }\r\n\r\n this.scheduleDate = timestamp;\r\n callback();\r\n\r\n if(this.chat.type !== 'scheduled' && timestamp) {\r\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\r\n if(!middleware()) {\r\n return;\r\n }\r\n\r\n this.appImManager.openScheduled(peerId);\r\n }, 0);\r\n }\r\n }, canSendWhenOnline).show();\r\n };\r\n\r\n public setUnreadCount() {\r\n if(!this.goDownUnreadBadge) {\r\n return;\r\n }\r\n \r\n const dialog = this.appMessagesManager.getDialogOnly(this.chat.peerId);\r\n const count = dialog?.unread_count;\r\n this.goDownUnreadBadge.innerText = '' + (count || '');\r\n this.goDownUnreadBadge.classList.toggle('badge-gray', this.appNotificationsManager.isPeerLocalMuted(this.chat.peerId, true));\r\n\r\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\r\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\r\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\r\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\r\n }\r\n }\r\n\r\n public saveDraft() {\r\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\r\n \r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n let draft: DraftMessage.draftMessage;\r\n if(value.length || this.replyToMsgId) {\r\n draft = {\r\n _: 'draftMessage',\r\n date: tsNow(true) + this.serverTimeManager.serverTimeOffset,\r\n message: value,\r\n entities: entities.length ? entities : undefined,\r\n pFlags: {\r\n no_webpage: this.noWebPage\r\n },\r\n reply_to_msg_id: this.replyToMsgId\r\n };\r\n }\r\n\r\n this.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\r\n }\r\n\r\n public destroy() {\r\n //this.chat.log.error('Input destroying');\r\n\r\n this.listenerSetter.removeAll();\r\n }\r\n\r\n public cleanup(helperToo = true) {\r\n if(!this.chat.peerId) {\r\n this.chatInput.style.display = 'none';\r\n this.goDownBtn.classList.add('hide');\r\n }\r\n\r\n cancelSelection();\r\n\r\n this.lastTimeType = 0;\r\n this.startParam = undefined;\r\n\r\n if(this.toggleBotStartBtnDisability) {\r\n this.toggleBotStartBtnDisability();\r\n this.toggleBotStartBtnDisability = undefined;\r\n }\r\n\r\n if(this.messageInput) {\r\n this.clearInput();\r\n helperToo && this.clearHelper();\r\n }\r\n }\r\n\r\n public setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\r\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\r\n \r\n if(!draft) {\r\n draft = this.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\r\n\r\n if(!draft) {\r\n if(force) { // this situation can only happen when sending message with clearDraft\r\n /* const height = this.chatInput.getBoundingClientRect().height;\r\n const willChangeHeight = 78 - height;\r\n this.willChangeHeight = willChangeHeight; */\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n this.t();\r\n }\r\n\r\n this.messageInputField.inputFake.textContent = '';\r\n this.messageInputField.onFakeInput(false);\r\n\r\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\r\n fastRaf(() => {\r\n this.onMessageSent();\r\n });\r\n });\r\n }\r\n \r\n return false;\r\n }\r\n }\r\n\r\n if(this.messageInputField.value === draft.rMessage && this.replyToMsgId === draft.reply_to_msg_id) return false;\r\n\r\n if(fromUpdate) {\r\n this.clearHelper();\r\n }\r\n\r\n this.noWebPage = draft.pFlags.no_webpage;\r\n if(draft.reply_to_msg_id) {\r\n this.initMessageReply(draft.reply_to_msg_id);\r\n }\r\n\r\n this.setInputValue(draft.rMessage, fromUpdate, fromUpdate);\r\n return true;\r\n }\r\n\r\n public finishPeerChange(startParam?: string) {\r\n const peerId = this.chat.peerId;\r\n\r\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput} = this;\r\n chatInput.style.display = '';\r\n \r\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\r\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\r\n goDownBtn.classList.remove('hide');\r\n\r\n if(this.goDownUnreadBadge) {\r\n this.setUnreadCount();\r\n }\r\n\r\n if(this.chat.type === 'pinned') {\r\n chatInput.classList.toggle('can-pin', this.appPeersManager.canPinMessage(peerId));\r\n }/* else if(this.chat.type === 'chat') {\r\n } */\r\n\r\n if(forwardElements) {\r\n this.forwardWasDroppingAuthor = false;\r\n forwardElements.showCaption.checkboxField.setValueSilently(true);\r\n forwardElements.showSender.checkboxField.setValueSilently(true);\r\n }\r\n\r\n if(btnScheduled) {\r\n btnScheduled.classList.add('hide');\r\n const middleware = this.chat.bubbles.getMiddleware();\r\n this.appMessagesManager.getScheduledMessages(peerId).then(mids => {\r\n if(!middleware()) return;\r\n btnScheduled.classList.toggle('hide', !mids.length);\r\n });\r\n }\r\n\r\n if(replyKeyboard) {\r\n replyKeyboard.setPeer(peerId);\r\n }\r\n\r\n if(sendMenu) {\r\n sendMenu.setPeerId(peerId);\r\n }\r\n \r\n if(this.messageInput) {\r\n this.updateMessageInput();\r\n } else if(this.pinnedControlBtn) {\r\n this.pinnedControlBtn.append(i18n(this.appPeersManager.canPinMessage(this.chat.peerId) ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\r\n }\r\n\r\n // * testing\r\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\r\n \r\n this.startParam = startParam;\r\n\r\n this.center(false);\r\n }\r\n\r\n public updateMessageInput() {\r\n const {chatInput, attachMenu, messageInput} = this;\r\n const {peerId, threadId} = this.chat;\r\n const canWrite = this.chat.canSend();\r\n const isHidden = chatInput.classList.contains('is-hidden');\r\n const willBeHidden = !canWrite;\r\n if(isHidden !== willBeHidden) {\r\n chatInput.classList.add('no-transition');\r\n chatInput.classList.toggle('is-hidden', !canWrite);\r\n void chatInput.offsetLeft; // reflow\r\n chatInput.classList.remove('no-transition');\r\n }\r\n\r\n const i = I18n.weakMap.get(messageInput) as I18n.IntlElement;\r\n if(i) {\r\n let key: LangPackKey;\r\n if(threadId) {\r\n key = 'Comment';\r\n } else if(this.appPeersManager.isBroadcast(peerId)) {\r\n key = 'ChannelBroadcast';\r\n } else if(this.appMessagesManager.isAnonymousSending(peerId)) {\r\n key = 'SendAnonymously';\r\n } else {\r\n key = 'Message';\r\n }\r\n\r\n i.compareAndUpdate({key});\r\n }\r\n\r\n const visible = this.attachMenuButtons.filter(button => {\r\n const good = button.verify(peerId, threadId);\r\n button.element.classList.toggle('hide', !good);\r\n return good;\r\n });\r\n\r\n if(!canWrite) {\r\n messageInput.removeAttribute('contenteditable');\r\n } else {\r\n messageInput.setAttribute('contenteditable', 'true');\r\n this.setDraft(undefined, false);\r\n\r\n if(!messageInput.innerHTML) {\r\n this.messageInputField.onFakeInput();\r\n }\r\n }\r\n \r\n attachMenu.toggleAttribute('disabled', !visible.length);\r\n attachMenu.classList.toggle('btn-disabled', !visible.length);\r\n this.updateSendBtn();\r\n }\r\n\r\n private attachMessageInputField() {\r\n const oldInputField = this.messageInputField;\r\n this.messageInputField = new InputField({\r\n placeholder: 'Message',\r\n name: 'message',\r\n animate: true\r\n });\r\n\r\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\r\n this.messageInput = this.messageInputField.input;\r\n this.messageInput.classList.add('no-scrollbar');\r\n this.attachMessageInputListeners();\r\n \r\n if(IS_STICKY_INPUT_BUGGED) {\r\n fixSafariStickyInputFocusing(this.messageInput);\r\n }\r\n\r\n if(oldInputField) {\r\n oldInputField.input.replaceWith(this.messageInputField.input);\r\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\r\n } else {\r\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\r\n }\r\n }\r\n\r\n private attachMessageInputListeners() {\r\n this.listenerSetter.add(this.messageInput)('keydown', (e: KeyboardEvent) => {\r\n const key = e.key;\r\n if(isSendShortcutPressed(e)) {\r\n cancelEvent(e);\r\n this.sendMessage();\r\n } else if(e.ctrlKey || e.metaKey) {\r\n this.handleMarkdownShortcut(e);\r\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\r\n e.preventDefault();\r\n\r\n if(key === 'PageUp') {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n \r\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\r\n range.collapse(true);\r\n \r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n } else {\r\n placeCaretAtEnd(this.messageInput);\r\n }\r\n }\r\n });\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n attachClickEvent(this.messageInput, (e) => {\r\n this.appImManager.selectTab(1); // * set chat tab for album orientation\r\n //this.saveScroll();\r\n emoticonsDropdown.toggle(false);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n /* this.listenerSetter.add(window)('resize', () => {\r\n this.restoreScroll();\r\n }); */\r\n\r\n /* if(isSafari) { \r\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\r\n window.requestAnimationFrame(() => {\r\n window.requestAnimationFrame(() => {\r\n emoticonsDropdown.toggle(false);\r\n });\r\n });\r\n });\r\n } */\r\n }\r\n\r\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n const inputType = (e as InputEvent).inputType;\r\n //console.log('message beforeinput event', e);\r\n\r\n if(inputType.indexOf('format') === 0) {\r\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\r\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\r\n if(this.applyMarkdown(markdownType)) {\r\n cancelEvent(e); // * cancel legacy markdown event\r\n }\r\n }\r\n }); */\r\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\r\n this.listenerSetter.add(this.messageInput)('keyup', () => {\r\n this.checkAutocomplete();\r\n });\r\n\r\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\r\n this.listenerSetter.add(this.messageInput)('focusin', () => {\r\n if(this.chat.bubbles.scrollable.loadedAll.bottom) {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\r\n }\r\n }); \r\n }\r\n }\r\n\r\n private prepareDocumentExecute = () => {\r\n this.executedHistory.push(this.messageInput.innerHTML);\r\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\r\n };\r\n\r\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\r\n cancelEvent(e); // cancel legacy event\r\n\r\n let html = this.messageInput.innerHTML;\r\n if(html && html !== needHTML) {\r\n this.lockRedo = true;\r\n\r\n let sameHTMLTimes = 0;\r\n do {\r\n document.execCommand(type, false, null);\r\n const currentHTML = this.messageInput.innerHTML;\r\n if(html === currentHTML) {\r\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\r\n break;\r\n }\r\n } else {\r\n sameHTMLTimes = 0;\r\n }\r\n\r\n html = currentHTML;\r\n } while(html !== needHTML);\r\n\r\n this.lockRedo = false;\r\n }\r\n };\r\n\r\n public applyMarkdown(type: MarkdownType, href?: string) {\r\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\r\n bold: 'Bold',\r\n italic: 'Italic',\r\n underline: 'Underline',\r\n strikethrough: 'Strikethrough',\r\n monospace: () => document.execCommand('fontName', false, 'monospace'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, 'spoiler')\r\n };\r\n\r\n if(!commandsMap[type]) {\r\n return false;\r\n }\r\n\r\n const command = commandsMap[type];\r\n\r\n //type = 'monospace';\r\n\r\n const saveExecuted = this.prepareDocumentExecute();\r\n const executed: any[] = [];\r\n /**\r\n * * clear previous formatting, due to Telegram's inability to handle several entities\r\n */\r\n /* const checkForSingle = () => {\r\n const nodes = getSelectedNodes();\r\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\r\n\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //const differentParents = !!nodes.find(node => node.parentNode !== firstParent);\r\n const differentParents = parents.length > 1;\r\n\r\n let notSingle = false;\r\n if(differentParents) {\r\n notSingle = true;\r\n } else {\r\n const node = nodes[0];\r\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\r\n notSingle = true;\r\n }\r\n }\r\n\r\n if(notSingle) {\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n //}\r\n\r\n executed.push(document.execCommand('unlink', false, null));\r\n executed.push(document.execCommand('removeFormat', false, null));\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n\r\n //if(type === 'monospace') {\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n //}\r\n }\r\n }; */\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n \r\n if(type === 'monospace') {\r\n let haveThisType = false;\r\n //executed.push(document.execCommand('styleWithCSS', false, 'true'));\r\n\r\n const selection = window.getSelection();\r\n if(!selection.isCollapsed) {\r\n const range = selection.getRangeAt(0);\r\n const tag = markdownTags[type];\r\n\r\n const node = range.commonAncestorContainer;\r\n if((node.parentNode as HTMLElement).matches(tag.match) || (node instanceof HTMLElement && node.matches(tag.match))) {\r\n haveThisType = true;\r\n }\r\n }\r\n\r\n //executed.push(document.execCommand('removeFormat', false, null));\r\n\r\n if(haveThisType) {\r\n executed.push(document.execCommand('fontName', false, 'Roboto'));\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n } else {\r\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\r\n }\r\n\r\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\r\n\r\n //checkForSingle();\r\n saveExecuted();\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.setActiveMarkupButton();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\r\n // console.log('handleMarkdownShortcut', e);\r\n const formatKeys: {[key: string]: MarkdownType} = {\r\n 'KeyB': 'bold',\r\n 'KeyI': 'italic',\r\n 'KeyU': 'underline',\r\n 'KeyS': 'strikethrough',\r\n 'KeyM': 'monospace',\r\n 'KeyP': 'spoiler'\r\n };\r\n\r\n if(this.appImManager.markupTooltip) {\r\n formatKeys['KeyK'] = 'link';\r\n }\r\n\r\n const code = e.code;\r\n const applyMarkdown = formatKeys[code];\r\n\r\n const selection = document.getSelection();\r\n if(selection.toString().trim().length && applyMarkdown) {\r\n // * костыльчик\r\n if(code === 'KeyK') {\r\n this.appImManager.markupTooltip.showLinkEditor();\r\n } else {\r\n this.applyMarkdown(applyMarkdown);\r\n }\r\n \r\n cancelEvent(e); // cancel legacy event\r\n }\r\n\r\n //return;\r\n if(code === 'KeyZ') {\r\n let html = this.messageInput.innerHTML;\r\n\r\n if(e.shiftKey) {\r\n if(this.undoHistory.length) {\r\n this.executedHistory.push(html);\r\n html = this.undoHistory.pop();\r\n this.undoRedo(e, 'redo', html);\r\n html = this.messageInput.innerHTML;\r\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\r\n this.canUndoFromHTML = html;\r\n }\r\n } else {\r\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\r\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\r\n this.undoHistory.push(html);\r\n html = this.executedHistory.pop();\r\n this.undoRedo(e, 'undo', html);\r\n\r\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\r\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\r\n }\r\n }\r\n }\r\n };\r\n\r\n private onMessageInput = (e?: Event) => {\r\n // * validate due to manual formatting through browser's context menu\r\n /* const inputType = (e as InputEvent).inputType;\r\n console.log('message input event', e);\r\n if(inputType === 'formatBold') {\r\n console.log('message input format', this.messageInput.innerHTML);\r\n cancelEvent(e);\r\n }\r\n\r\n if(!isSelectionSingle()) {\r\n alert('not single');\r\n } */\r\n\r\n //console.log('messageInput input', this.messageInput.innerText);\r\n //const value = this.messageInput.innerText;\r\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\r\n \r\n //const entities = RichTextProcessor.parseEntities(value);\r\n const value = RichTextProcessor.parseMarkdown(richValue, markdownEntities, true);\r\n const entities = RichTextProcessor.mergeEntities(markdownEntities, RichTextProcessor.parseEntities(value));\r\n\r\n //this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\r\n\r\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n }\r\n\r\n const urlEntities: Array = !this.editMessage?.media && entities.filter(e => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\r\n if(urlEntities.length) {\r\n for(const entity of urlEntities) {\r\n let url: string;\r\n if(entity._ === 'messageEntityTextUrl') {\r\n url = entity.url;\r\n } else {\r\n url = richValue.slice(entity.offset, entity.offset + entity.length);\r\n\r\n if(!(url.includes('http://') || url.includes('https://'))) {\r\n continue;\r\n }\r\n }\r\n\r\n //console.log('messageInput url:', url);\r\n\r\n if(this.lastUrl !== url) {\r\n this.lastUrl = url;\r\n // this.willSendWebPage = null;\r\n const promise = this.getWebPagePromise = apiManager.invokeApiHashable({\r\n method: 'messages.getWebPage',\r\n processResult: (webPage) => {\r\n return this.appWebPagesManager.saveWebPage(webPage);\r\n },\r\n params: {\r\n url\r\n },\r\n }).then((webpage) => {\r\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\r\n if(this.lastUrl !== url) return;\r\n if(webpage._ === 'webPage') {\r\n //console.log('got webpage: ', webpage);\r\n\r\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\r\n delete this.noWebPage;\r\n this.willSendWebPage = webpage;\r\n } else if(this.willSendWebPage) {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n break;\r\n }\r\n } else if(this.lastUrl) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n \r\n if(this.helperType) {\r\n this.helperFunc();\r\n } else {\r\n this.clearHelper();\r\n }\r\n }\r\n\r\n if(!richValue.trim()) {\r\n if(this.lastTimeType) {\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'});\r\n }\r\n\r\n if(this.appImManager.markupTooltip) {\r\n this.appImManager.markupTooltip.hide();\r\n }\r\n } else {\r\n const time = Date.now();\r\n if(time - this.lastTimeType >= 6000) {\r\n this.lastTimeType = time;\r\n this.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'});\r\n }\r\n }\r\n\r\n if(!this.editMsgId) {\r\n this.saveDraftDebounced();\r\n }\r\n\r\n this.checkAutocomplete(richValue, caretPos, entities);\r\n\r\n this.updateSendBtn();\r\n };\r\n\r\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\r\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\r\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\r\n const prefix = fullValue.substr(0, pos);\r\n const suffix = fullValue.substr(pos);\r\n\r\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\r\n\r\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\r\n const newPrefix = prefix.slice(0, matchIndex);\r\n const newValue = newPrefix + insertText + suffix;\r\n\r\n // merge emojis\r\n const hadEntities = RichTextProcessor.parseEntities(fullValue);\r\n RichTextProcessor.mergeEntities(entities, hadEntities);\r\n\r\n // max for additional whitespace\r\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\r\n const addEntities: MessageEntity[] = [];\r\n if(insertEntity) {\r\n addEntities.push(insertEntity);\r\n insertEntity.offset = matchIndex;\r\n }\r\n\r\n // add offset to entities next to emoji\r\n const diff = matches ? insertLength - matches[2].length : insertLength;\r\n entities.forEach(entity => {\r\n if(entity.offset >= matchIndex) {\r\n entity.offset += diff;\r\n }\r\n });\r\n\r\n RichTextProcessor.mergeEntities(entities, addEntities);\r\n\r\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\r\n const caretEntity: MessageEntity.messageEntityCaret = {\r\n _: 'messageEntityCaret',\r\n offset: matchIndex + insertLength,\r\n length: 0\r\n };\r\n\r\n let insertCaretAtIndex = 0;\r\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\r\n const entity = entities[insertCaretAtIndex];\r\n if(entity.offset > caretEntity.offset) {\r\n break;\r\n }\r\n }\r\n\r\n entities.splice(insertCaretAtIndex, 0, caretEntity);\r\n }\r\n\r\n //const saveExecuted = this.prepareDocumentExecute();\r\n // can't exec .value here because it will instantly check for autocomplete\r\n const value = RichTextProcessor.wrapDraftText(newValue, {entities});\r\n this.messageInputField.setValueSilently(value, true);\r\n\r\n const caret = this.messageInput.querySelector('.composer-sel');\r\n if(caret) {\r\n setCaretAt(caret);\r\n caret.remove();\r\n }\r\n\r\n // but it's needed to be checked only here\r\n this.onMessageInput();\r\n\r\n //saveExecuted();\r\n\r\n //document.execCommand('insertHTML', true, RichTextProcessor.wrapEmojiText(emoji));\r\n }\r\n\r\n public onEmojiSelected = (emoji: string, autocomplete: boolean) => {\r\n this.insertAtCaret(emoji, RichTextProcessor.getEmojiEntityFromEmoji(emoji), autocomplete);\r\n };\r\n\r\n private checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\r\n //return;\r\n\r\n if(value === undefined) {\r\n const r = getRichValueWithCaret(this.messageInputField.input, true);\r\n value = r.value;\r\n caretPos = r.caretPos;\r\n entities = r.entities;\r\n }\r\n\r\n if(caretPos === -1) {\r\n caretPos = value.length;\r\n }\r\n\r\n if(entities === undefined) {\r\n const _value = RichTextProcessor.parseMarkdown(value, entities, true);\r\n entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(_value));\r\n }\r\n\r\n value = value.slice(0, caretPos);\r\n\r\n if(this.previousQuery === value) {\r\n return;\r\n }\r\n\r\n this.previousQuery = value;\r\n \r\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\r\n let foundHelper: AutocompleteHelper;\r\n if(matches) {\r\n const entity = entities[0];\r\n\r\n let query = matches[2];\r\n const firstChar = query[0];\r\n\r\n if(this.stickersHelper && \r\n rootScope.settings.stickers.suggest && \r\n this.chat.canSend('send_stickers') &&\r\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\r\n foundHelper = this.stickersHelper;\r\n this.stickersHelper.checkEmoticon(value);\r\n } else if(firstChar === '@') { // mentions\r\n const topMsgId = this.chat.threadId ? this.appMessagesIdsManager.getServerMessageId(this.chat.threadId) : undefined;\r\n if(this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\r\n foundHelper = this.mentionsHelper;\r\n }\r\n } else if(!matches[1] && firstChar === '/') { // commands\r\n if(this.commandsHelper.checkQuery(query, this.chat.peerId)) {\r\n foundHelper = this.commandsHelper;\r\n }\r\n } else if(rootScope.settings.emoji.suggest) { // emoji\r\n query = query.replace(/^\\s*/, '');\r\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\r\n foundHelper = this.emojiHelper;\r\n this.emojiHelper.checkQuery(query, firstChar);\r\n }\r\n }\r\n }\r\n \r\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\r\n\r\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\r\n }\r\n\r\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\r\n let needPlaceholder = false;\r\n\r\n if(!foundHelper) {\r\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\r\n if(inlineMatch) {\r\n const username = inlineMatch[1];\r\n const query = value.slice(inlineMatch[0].length);\r\n needPlaceholder = inlineMatch[0].length === value.length;\r\n \r\n foundHelper = this.inlineHelper;\r\n\r\n if(!this.btnPreloader) {\r\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\r\n putPreloader(this.btnPreloader, true);\r\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\r\n } else {\r\n SetTransition(this.btnPreloader, 'show', true, 400);\r\n }\r\n \r\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\r\n if(needPlaceholder && user.bot_inline_placeholder) {\r\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\r\n }\r\n\r\n renderPromise.then(() => {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n });\r\n }).catch(noop);\r\n }\r\n }\r\n \r\n if(!needPlaceholder) {\r\n delete this.messageInput.dataset.inlinePlaceholder;\r\n }\r\n\r\n if(foundHelper !== this.inlineHelper) {\r\n if(this.btnPreloader) {\r\n SetTransition(this.btnPreloader, 'show', false, 400);\r\n }\r\n }\r\n\r\n return foundHelper;\r\n }\r\n\r\n private setRecording(value: boolean) {\r\n if(this.recording === value) {\r\n return;\r\n }\r\n\r\n SetTransition(this.chatInput, 'is-recording', value, 200);\r\n this.recording = value;\r\n this.updateSendBtn();\r\n }\r\n\r\n private onBtnSendClick = (e: Event) => {\r\n cancelEvent(e);\r\n\r\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\r\n if(this.recording) {\r\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\r\n this.onCancelRecordClick();\r\n } else {\r\n this.recorder.stop();\r\n }\r\n } else {\r\n this.sendMessage();\r\n }\r\n } else {\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend('send_media')) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return;\r\n }\r\n\r\n this.chatInput.classList.add('is-locked');\r\n blurActiveElement();\r\n\r\n this.recorder.start().then(() => {\r\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\r\n this.recordCanceled = false;\r\n \r\n this.setRecording(true);\r\n opusDecodeController.setKeepAlive(true);\r\n \r\n const showDiscardPopup = () => {\r\n new PopupPeer('popup-cancel-record', {\r\n titleLangKey: 'DiscardVoiceMessageTitle',\r\n descriptionLangKey: 'DiscardVoiceMessageDescription',\r\n buttons: [{\r\n langKey: 'DiscardVoiceMessageAction',\r\n callback: () => {\r\n simulateClickEvent(this.btnCancelRecord);\r\n }\r\n }, {\r\n langKey: 'Continue',\r\n isCancel: true\r\n }]\r\n }).show();\r\n };\r\n\r\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\r\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\r\n cancelEvent(e);\r\n showDiscardPopup();\r\n }\r\n }, {capture: true, passive: false}) as any;\r\n\r\n appNavigationController.pushItem(this.recordingNavigationItem = {\r\n type: 'voice',\r\n onPop: () => {\r\n setTimeout(() => {\r\n showDiscardPopup();\r\n }, 0);\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.recordStartTime = Date.now();\r\n\r\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\r\n const context = sourceNode.context;\r\n\r\n const analyser = context.createAnalyser();\r\n sourceNode.connect(analyser);\r\n //analyser.connect(context.destination);\r\n analyser.fftSize = 32;\r\n\r\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\r\n const max = frequencyData.length * 255;\r\n const min = 54 / 150;\r\n let r = () => {\r\n if(!this.recording) return;\r\n\r\n analyser.getByteFrequencyData(frequencyData);\r\n\r\n let sum = 0;\r\n frequencyData.forEach(value => {\r\n sum += value;\r\n });\r\n \r\n let percents = Math.min(1, (sum / max) + min);\r\n //console.log('frequencyData', frequencyData, percents);\r\n\r\n this.recordRippleEl.style.transform = `scale(${percents})`;\r\n\r\n let diff = Date.now() - this.recordStartTime;\r\n let ms = diff % 1000;\r\n\r\n let formatted = ('' + (diff / 1000)).toHHMMSS() + ',' + ('00' + Math.round(ms / 10)).slice(-2);\r\n\r\n this.recordTimeEl.innerText = formatted;\r\n\r\n fastRaf(r);\r\n };\r\n\r\n r();\r\n }).catch((e: Error) => {\r\n switch(e.name as string) {\r\n case 'NotAllowedError': {\r\n toast('Please allow access to your microphone');\r\n break;\r\n }\r\n\r\n case 'NotReadableError': {\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n default:\r\n console.error('Recorder start error:', e, e.name, e.message);\r\n toast(e.message);\r\n break;\r\n }\r\n\r\n this.setRecording(false);\r\n this.chatInput.classList.remove('is-locked');\r\n });\r\n }\r\n };\r\n\r\n private onHelperCancel = (e?: Event, force?: boolean) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.willSendWebPage) {\r\n const lastUrl = this.lastUrl;\r\n let needReturn = false;\r\n if(this.helperType) {\r\n //if(this.helperFunc) {\r\n this.helperFunc();\r\n //}\r\n\r\n needReturn = true;\r\n }\r\n\r\n // * restore values\r\n this.lastUrl = lastUrl;\r\n this.noWebPage = true;\r\n this.willSendWebPage = null;\r\n\r\n if(needReturn) return;\r\n }\r\n\r\n if(this.helperType === 'edit' && !force) {\r\n const message = this.editMessage\r\n const value = RichTextProcessor.parseMarkdown(this.messageInputField.value, []);\r\n if(message.message !== value) {\r\n new PopupPeer('discard-editing', {\r\n buttons: [{\r\n langKey: 'Alert.Confirm.Discard',\r\n callback: () => {\r\n this.onHelperCancel(undefined, true);\r\n }\r\n }],\r\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\r\n }).show();\r\n\r\n return;\r\n }\r\n }\r\n\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n };\r\n\r\n private onHelperClick = (e: Event) => {\r\n cancelEvent(e);\r\n \r\n if(!findUpClassName(e.target, 'reply')) return;\r\n if(this.helperType === 'forward') {\r\n const {forwardElements} = this;\r\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\r\n openBtnMenu(forwardElements.container);\r\n }\r\n } else if(this.helperType === 'reply') {\r\n this.chat.setMessageId(this.replyToMsgId);\r\n } else if(this.helperType === 'edit') {\r\n this.chat.setMessageId(this.editMsgId);\r\n }\r\n };\r\n\r\n private changeForwardRecipient() {\r\n if(this.helperWaitingForward) return;\r\n this.helperWaitingForward = true;\r\n\r\n const helperFunc = this.helperFunc;\r\n this.clearHelper();\r\n this.updateSendBtn();\r\n let selected = false;\r\n const popup = new PopupForward(copy(this.forwarding), () => {\r\n selected = true;\r\n });\r\n\r\n popup.addEventListener('close', () => {\r\n this.helperWaitingForward = false;\r\n\r\n if(!selected) {\r\n helperFunc();\r\n }\r\n });\r\n }\r\n\r\n public clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\r\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\r\n const i = document.createElement('input');\r\n document.body.append(i);\r\n fixSafariStickyInput(i);\r\n this.messageInputField.setValueSilently(clearValue);\r\n fixSafariStickyInput(this.messageInput);\r\n i.remove();\r\n } else {\r\n this.messageInputField.setValueSilently(clearValue);\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n //this.messageInput.innerText = '';\r\n } else {\r\n //this.attachMessageInputField();\r\n //this.messageInput.innerText = '';\r\n\r\n // clear executions\r\n this.canRedoFromHTML = '';\r\n this.undoHistory.length = 0;\r\n this.executedHistory.length = 0;\r\n this.canUndoFromHTML = '';\r\n }\r\n\r\n let set = false;\r\n if(canSetDraft) {\r\n set = this.setDraft(undefined, false);\r\n }\r\n\r\n if(!set && fireEvent) {\r\n this.onMessageInput();\r\n }\r\n }\r\n\r\n public isInputEmpty() {\r\n return isInputEmpty(this.messageInput);\r\n }\r\n\r\n public updateSendBtn() {\r\n let icon: 'send' | 'record' | 'edit' | 'schedule';\r\n\r\n const isInputEmpty = this.isInputEmpty();\r\n\r\n if(this.editMsgId) icon = 'edit';\r\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\r\n else icon = 'record';\r\n\r\n ['send', 'record', 'edit', 'schedule'].forEach(i => {\r\n this.btnSend.classList.toggle(i, icon === i);\r\n });\r\n\r\n if(this.btnScheduled) {\r\n this.btnScheduled.classList.toggle('show', isInputEmpty);\r\n }\r\n\r\n if(this.btnToggleReplyMarkup) {\r\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty);\r\n }\r\n }\r\n\r\n public onMessageSent(clearInput = true, clearReply?: boolean) {\r\n if(this.chat.type !== 'scheduled') {\r\n this.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\r\n }\r\n\r\n this.scheduleDate = undefined;\r\n this.sendSilent = undefined;\r\n\r\n const value = this.messageInputField.value;\r\n const entities = RichTextProcessor.parseEntities(value);\r\n const emojiEntities: MessageEntity.messageEntityEmoji[] = entities.filter(entity => entity._ === 'messageEntityEmoji') as any;\r\n emojiEntities.forEach(entity => {\r\n const emoji = emojiFromCodePoints(entity.unicode);\r\n this.appEmojiManager.pushRecentEmoji(emoji);\r\n });\r\n\r\n if(clearInput) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n this.clearInput();\r\n }\r\n\r\n if(clearReply || clearInput) {\r\n this.clearHelper();\r\n }\r\n\r\n this.updateSendBtn();\r\n }\r\n\r\n public sendMessage(force = false) {\r\n const {editMsgId, chat} = this;\r\n if(chat.type === 'scheduled' && !force && !editMsgId) {\r\n this.scheduleSending();\r\n return;\r\n }\r\n\r\n const {threadId, peerId} = chat;\r\n const {replyToMsgId, noWebPage, sendSilent, scheduleDate} = this;\r\n\r\n const {value, entities} = getRichValue(this.messageInputField.input);\r\n\r\n //return;\r\n if(editMsgId) {\r\n const message = this.editMessage;\r\n if(value.trim() || message.media) {\r\n this.appMessagesManager.editMessage(message, value, {\r\n entities,\r\n noWebPage: noWebPage\r\n });\r\n\r\n this.onMessageSent();\r\n } else {\r\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\r\n\r\n return;\r\n }\r\n } else if(value.trim()) {\r\n this.appMessagesManager.sendText(peerId, value, {\r\n entities,\r\n replyToMsgId: replyToMsgId,\r\n threadId: threadId,\r\n noWebPage: noWebPage,\r\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\r\n scheduleDate: scheduleDate,\r\n silent: sendSilent,\r\n clearDraft: true\r\n });\r\n\r\n this.onMessageSent(false, false);\r\n // this.onMessageSent();\r\n }\r\n\r\n // * wait for sendText set messageId for invokeAfterMsg\r\n if(this.forwarding) {\r\n const forwarding = copy(this.forwarding);\r\n setTimeout(() => {\r\n for(const fromPeerId in forwarding) {\r\n this.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\r\n silent: sendSilent,\r\n scheduleDate: scheduleDate,\r\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\r\n dropCaptions: this.isDroppingCaptions()\r\n });\r\n }\r\n\r\n if(!value) {\r\n this.onMessageSent();\r\n }\r\n }, 0);\r\n }\r\n\r\n // this.onMessageSent();\r\n }\r\n\r\n public sendMessageWithDocument(document: MyDocument | string, force = false, clearDraft = false) {\r\n document = this.appDocsManager.getDoc(document);\r\n\r\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\r\n if(this.chat.peerId.isAnyChat() && !this.chat.canSend(flag)) {\r\n toast(POSTING_MEDIA_NOT_ALLOWED);\r\n return false;\r\n }\r\n\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft));\r\n return false;\r\n }\r\n\r\n if(document) {\r\n this.appMessagesManager.sendFile(this.chat.peerId, document, {\r\n isMedia: true, \r\n replyToMsgId: this.replyToMsgId, \r\n threadId: this.chat.threadId,\r\n silent: this.sendSilent, \r\n scheduleDate: this.scheduleDate,\r\n clearDraft: clearDraft || undefined\r\n });\r\n this.onMessageSent(clearDraft, true);\r\n\r\n if(document.type === 'sticker') {\r\n emoticonsDropdown.stickersTab?.pushRecentSticker(document);\r\n }\r\n\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n private canToggleHideAuthor() {\r\n const {forwardElements} = this;\r\n if(!forwardElements) return false;\r\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\r\n return !hideCaptionCheckboxField.checked ||\r\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\r\n }\r\n\r\n private isDroppingCaptions() {\r\n return !this.canToggleHideAuthor();\r\n }\r\n\r\n /* public sendSomething(callback: () => void, force = false) {\r\n if(this.chat.type === 'scheduled' && !force) {\r\n this.scheduleSending(() => this.sendSomething(callback, true));\r\n return false;\r\n }\r\n\r\n callback();\r\n this.onMessageSent(false, true);\r\n\r\n return true;\r\n } */\r\n\r\n public initMessageEditing(mid: number) {\r\n const message: Message.message = this.chat.getMessage(mid);\r\n\r\n let input = RichTextProcessor.wrapDraftText(message.message, {entities: message.totalEntities});\r\n const f = () => {\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(message, undefined, [message.mid]);\r\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\r\n\r\n this.editMsgId = mid;\r\n this.editMessage = message;\r\n input = undefined;\r\n };\r\n f();\r\n }\r\n\r\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\r\n const f = () => {\r\n //const peerTitles: string[]\r\n const fromPeerIds = Object.keys(fromPeerIdsMids).map(fromPeerId => fromPeerId.toPeerId());\r\n const smth: Set = new Set();\r\n let length = 0, messagesWithCaptionsLength = 0;\r\n\r\n fromPeerIds.forEach(fromPeerId => {\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n mids.forEach(mid => {\r\n const message: Message.message = this.appMessagesManager.getMessageByPeer(fromPeerId, mid);\r\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\r\n smth.add('N' + message.fwd_from.from_name);\r\n } else {\r\n smth.add('P' + message.fromId);\r\n }\r\n\r\n if(message.media && message.message) {\r\n ++messagesWithCaptionsLength;\r\n }\r\n });\r\n\r\n length += mids.length;\r\n });\r\n\r\n const onlyFirstName = smth.size > 2;\r\n const peerTitles = [...smth].map(smth => {\r\n const type = smth[0];\r\n smth = smth.slice(1);\r\n if(type === 'P') {\r\n const peerId = smth.toPeerId();\r\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\r\n } else {\r\n return onlyFirstName ? smth.split(' ')[0] : smth;\r\n }\r\n });\r\n\r\n const {forwardElements} = this;\r\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\r\n form.classList.toggle('hide', !messagesWithCaptionsLength);\r\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\r\n if(messagesWithCaptionsLength && hideCaption) {\r\n forwardElements.hideSender.checkboxField.setValueSilently(true);\r\n } else if(this.forwardWasDroppingAuthor !== undefined) {\r\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\r\n }\r\n\r\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\r\n const title = i18n(titleKey, [length]);\r\n\r\n const senderTitles = document.createDocumentFragment();\r\n if(peerTitles.length < 3) {\r\n senderTitles.append(...join(peerTitles, false));\r\n } else {\r\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\r\n }\r\n\r\n let firstMessage: Message.message, usingFullAlbum: boolean;\r\n if(fromPeerIds.length === 1) {\r\n const fromPeerId = fromPeerIds[0];\r\n const mids = fromPeerIdsMids[fromPeerId];\r\n firstMessage = this.appMessagesManager.getMessageByPeer(fromPeerId, mids[0]);\r\n \r\n usingFullAlbum = !!firstMessage.grouped_id;\r\n if(usingFullAlbum) {\r\n const albumMids = this.appMessagesManager.getMidsByMessage(firstMessage);\r\n if(albumMids.length !== length || albumMids.find(mid => !mids.includes(mid))) {\r\n usingFullAlbum = false;\r\n }\r\n }\r\n }\r\n\r\n const subtitleFragment = document.createDocumentFragment();\r\n const delimiter = ': ';\r\n if(usingFullAlbum || length === 1) {\r\n const mids = fromPeerIdsMids[fromPeerIds[0]];\r\n const replyFragment = this.appMessagesManager.wrapMessageForReply(firstMessage, undefined, mids);\r\n subtitleFragment.append(\r\n senderTitles, \r\n delimiter, \r\n replyFragment\r\n );\r\n } else {\r\n subtitleFragment.append(\r\n i18n('Chat.Accessory.Forward.From'), \r\n delimiter, \r\n senderTitles\r\n );\r\n }\r\n \r\n let newReply = this.setTopInfo('forward', f, title, subtitleFragment);\r\n\r\n forwardElements.modifyArgs.forEach((b, idx) => {\r\n const text = b.textElement;\r\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\r\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\r\n intl.update();\r\n });\r\n\r\n if(this.forwardHover) {\r\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\r\n }\r\n\r\n this.forwarding = fromPeerIdsMids;\r\n };\r\n \r\n f();\r\n }\r\n\r\n public initMessageReply(mid: number) {\r\n if(this.replyToMsgId === mid) {\r\n return;\r\n }\r\n \r\n let message: Message = this.chat.getMessage(mid);\r\n const f = () => {\r\n let peerTitleEl: HTMLElement;\r\n if(message._ === 'messageEmpty') { // load missing replying message\r\n peerTitleEl = i18n('Loading');\r\n\r\n this.chat.appMessagesManager.wrapSingleMessage(this.chat.peerId, mid).then((_message) => {\r\n if(this.replyToMsgId !== mid) {\r\n return;\r\n }\r\n\r\n message = _message;\r\n if(message._ === 'messageEmpty') {\r\n this.clearHelper('reply');\r\n } else {\r\n f();\r\n }\r\n });\r\n } else {\r\n peerTitleEl = new PeerTitle({\r\n peerId: message.fromId,\r\n dialog: false\r\n }).element;\r\n }\r\n\r\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\r\n this.replyToMsgId = mid;\r\n };\r\n f();\r\n }\r\n\r\n public clearHelper(type?: ChatInputHelperType) {\r\n if(this.helperType === 'edit' && type !== 'edit') {\r\n this.clearInput();\r\n }\r\n\r\n if(type) {\r\n this.lastUrl = '';\r\n delete this.noWebPage;\r\n this.willSendWebPage = null;\r\n }\r\n \r\n if(type !== 'reply') {\r\n this.replyToMsgId = undefined;\r\n this.forwarding = undefined;\r\n }\r\n\r\n this.editMsgId = this.editMessage = undefined;\r\n this.helperType = this.helperFunc = undefined;\r\n\r\n if(this.chat.container.classList.contains('is-helper-active')) {\r\n appNavigationController.removeByType('input-helper');\r\n this.chat.container.classList.remove('is-helper-active');\r\n this.t();\r\n }\r\n }\r\n\r\n private t() {\r\n const className = 'is-toggling-helper';\r\n SetTransition(this.chat.container, className, true, 150, () => {\r\n this.chat.container.classList.remove(className);\r\n });\r\n }\r\n\r\n public setInputValue(value: string, clear = true, focus = true) {\r\n if(!value) value = '';\r\n\r\n if(clear) this.clearInput(false, false, value);\r\n else this.messageInputField.setValueSilently(value);\r\n\r\n fastRaf(() => {\r\n focus && placeCaretAtEnd(this.messageInput);\r\n this.onMessageInput();\r\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\r\n });\r\n }\r\n\r\n public setTopInfo(\r\n type: ChatInputHelperType, \r\n callerFunc: () => void, \r\n title: Parameters[0] = '', \r\n subtitle: Parameters[1] = '', \r\n input?: string, \r\n message?: any\r\n ) {\r\n if(this.willSendWebPage && type === 'reply') {\r\n return;\r\n }\r\n\r\n if(type !== 'webpage') {\r\n this.clearHelper(type);\r\n this.helperType = type;\r\n this.helperFunc = callerFunc;\r\n }\r\n \r\n const replyParent = this.replyElements.container;\r\n const oldReply = replyParent.lastElementChild.previousElementSibling;\r\n const haveReply = oldReply.classList.contains('reply');\r\n\r\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\r\n const newReply = wrapReply(title, subtitle, message);\r\n if(haveReply) {\r\n oldReply.replaceWith(newReply);\r\n } else {\r\n replyParent.insertBefore(newReply, replyParent.lastElementChild);\r\n }\r\n\r\n if(type === 'webpage') {\r\n newReply.style.cursor = 'default';\r\n }\r\n\r\n if(!this.chat.container.classList.contains('is-helper-active')) {\r\n this.chat.container.classList.add('is-helper-active');\r\n this.t();\r\n }\r\n\r\n /* const scroll = appImManager.scrollable;\r\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\r\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\r\n } */\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'input-helper',\r\n onPop: () => {\r\n this.onHelperCancel();\r\n }\r\n });\r\n }\r\n\r\n if(input !== undefined) {\r\n this.setInputValue(input);\r\n }\r\n\r\n setTimeout(() => {\r\n this.updateSendBtn();\r\n }, 0);\r\n\r\n return newReply;\r\n }\r\n\r\n // public saveScroll() {\r\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\r\n // this.scrollOffsetTop = this.chatInput.offsetTop;\r\n // }\r\n\r\n // public restoreScroll() {\r\n // if(this.chatInput.style.display) return;\r\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\r\n // let newOffsetTop = this.chatInput.offsetTop;\r\n // let container = this.chat.bubbles.scrollable.container;\r\n // let scrollTop = container.scrollTop;\r\n // let clientHeight = container.clientHeight;\r\n // let maxScrollTop = container.scrollHeight;\r\n\r\n // if(newOffsetTop < this.scrollOffsetTop) {\r\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\r\n // container.scrollTop += this.scrollDiff;\r\n // } else if(scrollTop !== this.scrollTop) {\r\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\r\n // if(endDiff < this.scrollDiff/* && false */) {\r\n // //container.scrollTop -= endDiff;\r\n // } else {\r\n // container.scrollTop -= this.scrollDiff;\r\n // }\r\n // }\r\n // }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setCaretAt(node: Node) {\n // node.appendChild(document.createTextNode(''));\n\n const originalNode = node;\n node = node.previousSibling;\n\n if(node.nodeType === 1) {\n const newNode = document.createTextNode('');\n node.parentNode.insertBefore(newNode, !originalNode.nextSibling || originalNode.nextSibling.nodeType === node.nodeType ? originalNode : originalNode.nextSibling);\n node = newNode;\n }\n\n if(window.getSelection && document.createRange) {\n const range = document.createRange();\n if(node) {\n range.setStartAfter(node);\n range.insertNode(node);\n range.setStart(node, node.nodeValue.length);\n }\n\n range.collapse(true);\n\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type Chat from \"./chat\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport mediaSizes from \"../../helpers/mediaSizes\";\r\nimport DivAndCaption from \"../divAndCaption\";\r\nimport { ripple } from \"../ripple\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport { safeAssign } from \"../../helpers/object\";\r\nimport { Message } from \"../../layer\";\r\n\r\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\r\nconst CLASSNAME_BASE = 'pinned-container';\r\nconst HEIGHT = 52;\r\n\r\nexport default class PinnedContainer {\r\n public wrapperUtils: HTMLElement;\r\n public btnClose: HTMLElement;\r\n protected wrapper: HTMLElement;\r\n\r\n protected topbar: ChatTopbar;\r\n protected chat: Chat;\r\n protected listenerSetter: ListenerSetter;\r\n public className: string;\r\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\r\n \r\n protected floating = false;\r\n\r\n public onClose?: () => void | Promise;\r\n\r\n constructor(options: {\r\n topbar: PinnedContainer['topbar'],\r\n chat: PinnedContainer['chat'],\r\n listenerSetter: PinnedContainer['listenerSetter'],\r\n className: PinnedContainer['className'],\r\n divAndCaption: PinnedContainer['divAndCaption'],\r\n onClose?: PinnedContainer['onClose'],\r\n floating?: PinnedContainer['floating']\r\n }) {\r\n safeAssign(this, options);\r\n\r\n const {divAndCaption, className} = this;\r\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\r\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\r\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\r\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\r\n \r\n this.btnClose = document.createElement('button');\r\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\r\n \r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\r\n ripple(this.wrapper);\r\n\r\n this.wrapperUtils = document.createElement('div');\r\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\r\n this.wrapperUtils.append(this.btnClose);\r\n\r\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\r\n\r\n divAndCaption.container.append(this.wrapper/* , this.close */);\r\n\r\n this.attachOnCloseEvent(this.btnClose);\r\n }\r\n\r\n public attachOnCloseEvent(elem: HTMLElement) {\r\n attachClickEvent(elem, (e) => {\r\n cancelEvent(e);\r\n\r\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then(needClose => {\r\n if(needClose) {\r\n this.toggle(true);\r\n }\r\n });\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n public toggle(hide?: boolean) {\r\n const isHidden = this.divAndCaption.container.classList.contains('hide');\r\n if(hide === undefined) {\r\n hide = !isHidden;\r\n } else if(hide === isHidden) {\r\n return;\r\n }\r\n\r\n // const scrollable = this.chat.bubbles.scrollable;\r\n \r\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\r\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\r\n\r\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\r\n this.divAndCaption.container.classList.toggle('hide', hide);\r\n \r\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\r\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\r\n \r\n // const active = classNames.filter(className => this.topbar.container.classList.contains(className));\r\n // const maxActive = hide ? 0 : 1;\r\n \r\n // * not sure when it became unneeded\r\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\r\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\r\n // }\r\n \r\n this.topbar.setFloating();\r\n this.topbar.setUtilsWidth();\r\n }\r\n\r\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\r\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\r\n this.divAndCaption.container.dataset.mid = '' + message.mid;\r\n this.divAndCaption.fill(title, subtitle, message);\r\n this.topbar.setUtilsWidth();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type ChatTopbar from \"./topbar\";\nimport rootScope from \"../../lib/rootScope\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport DivAndCaption from \"../divAndCaption\";\nimport PinnedContainer from \"./pinnedContainer\";\nimport Chat from \"./chat\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport { formatFullSentTime } from \"../../helpers/date\";\nimport { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) {\n super({\n topbar, \n chat, \n listenerSetter: topbar.listenerSetter, \n className: 'audio', \n divAndCaption: new DivAndCaption(\n 'pinned-audio', \n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ), \n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('pprevious active', {noRipple: true});\n const nextEl = ButtonIcon('nnext active', {noRipple: true});\n\n prevEl.innerHTML = ``;\n nextEl.innerHTML = ``;\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n this.wrapperUtils.prepend(this.volumeSelector.btn);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(rootScope)('media_play', ({doc, message, media}) => {\n let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment;\n if(doc.type === 'voice' || doc.type === 'round') {\n title = new PeerTitle({peerId: message.fromId}).element;\n\n //subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n }\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n this.toggleEl.classList.add('flip-icon');\n this.toggle(false);\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_pause', () => {\n this.toggleEl.classList.remove('flip-icon');\n });\n\n this.topbar.listenerSetter.add(rootScope)('media_stop', () => {\n this.toggle(true);\n });\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n //return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n \n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n \n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n \n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n \n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\r\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\r\nimport type ChatTopbar from \"./topbar\";\r\nimport PopupPinMessage from \"../popups/unpinMessage\";\r\nimport PinnedContainer from \"./pinnedContainer\";\r\nimport PinnedMessageBorder from \"./pinnedMessageBorder\";\r\nimport ReplyContainer, { wrapReplyDivAndCaption } from \"./replyContainer\";\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport Chat from \"./chat\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport handleScrollSideEvent from \"../../helpers/dom/handleScrollSideEvent\";\r\nimport debounce from \"../../helpers/schedulers/debounce\";\r\n\r\nclass AnimatedSuper {\r\n static DURATION = 200;\r\n static BASE_CLASS = 'animated-super';\r\n container: HTMLDivElement;\r\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\r\n clearTimeout: number;\r\n\r\n constructor() {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedSuper.BASE_CLASS;\r\n }\r\n\r\n public getRow(index: number, animateFirst = false) {\r\n if(this.rows[index]) return this.rows[index].element;\r\n const row = document.createElement('div');\r\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\r\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\r\n this.rows[index] = {element: row, new: true};\r\n this.container.append(row);\r\n return row;\r\n }\r\n\r\n public clearRow(index: number) {\r\n if(!this.rows[index]) return;\r\n this.rows[index].element.remove();\r\n delete this.rows[index];\r\n }\r\n\r\n public clearRows(currentIndex?: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n this.clearTimeout = window.setTimeout(() => {\r\n for(const i in this.rows) {\r\n if(+i === currentIndex) continue;\r\n this.clearRow(+i);\r\n }\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n public setNewRow(index: number, reflow = false) {\r\n const row = this.rows[index];\r\n if(row.new) {\r\n if(reflow) {\r\n row.element.classList.remove('hide');\r\n void row.element.offsetLeft; // reflow\r\n } else {\r\n row.element.classList.remove('is-hiding', 'hide');\r\n }\r\n\r\n delete row.new;\r\n }\r\n\r\n this.clearRows(index);\r\n }\r\n\r\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\r\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\r\n return this.setNewRow(index);\r\n }\r\n\r\n const row = this.rows[index];\r\n const previousRow = this.rows[previousIndex];\r\n if(!previousRow && !ignorePrevious) {\r\n return this.setNewRow(index);\r\n }\r\n\r\n const sides = ['from-top', 'from-bottom'];\r\n if(!fromTop) sides.reverse();\r\n\r\n row.element.classList.add(sides[0]);\r\n row.element.classList.remove(sides[1]);\r\n if(previousRow) {\r\n previousRow.element.classList.add(sides[1]);\r\n previousRow.element.classList.remove(sides[0]);\r\n }\r\n\r\n if(row.new) {\r\n this.setNewRow(index, true);\r\n }\r\n\r\n row.element.classList.toggle('is-hiding', false);\r\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\r\n\r\n /* const height = row.element.getBoundingClientRect().height;\r\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\r\n if(previousRow) {\r\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\r\n } */\r\n\r\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\r\n if(previousRow) {\r\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\r\n } */\r\n \r\n this.clearRows(index);\r\n }\r\n}\r\n\r\nclass AnimatedCounter {\r\n static EMPTY_INDEX = -1;\r\n static BASE_CLASS = 'animated-counter';\r\n container: HTMLElement;\r\n decimals: {\r\n container: HTMLElement,\r\n placeholder: HTMLElement,\r\n animatedSuper: AnimatedSuper\r\n }[] = [];\r\n previousNumber = 0;\r\n clearTimeout: number;\r\n\r\n constructor(private reverse = false) {\r\n this.container = document.createElement('div');\r\n this.container.className = AnimatedCounter.BASE_CLASS;\r\n }\r\n\r\n getDecimal(index: number) {\r\n if(this.decimals[index]) return this.decimals[index];\r\n const item = document.createElement('div');\r\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\r\n\r\n const placeholder = document.createElement('div');\r\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\r\n\r\n const animatedSuper = new AnimatedSuper();\r\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\r\n\r\n item.append(placeholder, animatedSuper.container);\r\n\r\n this.container.append(item);\r\n\r\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\r\n }\r\n\r\n clear(number: number) {\r\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\r\n\r\n const decimals = ('' + number).length;\r\n if(decimals >= this.decimals.length) {\r\n return;\r\n }\r\n\r\n this.clearTimeout = window.setTimeout(() => {\r\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\r\n byDecimal.forEach((decimal) => {\r\n decimal.container.remove();\r\n });\r\n }, AnimatedSuper.DURATION);\r\n }\r\n\r\n /* prepareNumber(number: number) {\r\n const decimals = ('' + number).length;\r\n if(this.decimals.length < decimals) {\r\n for(let i = this.decimals.length; i < decimals; ++i) {\r\n this.getDecimal(i);\r\n }\r\n }\r\n } */\r\n\r\n hideLeft(number: number) {\r\n const decimals = ('' + number).length;\r\n const byDecimal = this.decimals.slice(decimals);//this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\r\n byDecimal.forEach((decimal) => {\r\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\r\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\r\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.clear(number);\r\n }\r\n\r\n setCount(number: number) {\r\n //this.prepareNumber(number);\r\n\r\n const previousByDecimal = Array.from('' + this.previousNumber).map(n => +n);\r\n const byDecimal = Array.from('' + number).map(n => +n);\r\n byDecimal.forEach((decimalNumber, idx) => {\r\n const decimal = this.getDecimal(idx);\r\n //const row = decimal.animatedSuper.getRow(number, true);\r\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\r\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\r\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\r\n //decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\r\n });\r\n\r\n this.hideLeft(number);\r\n //this.clear(number);\r\n this.previousNumber = number;\r\n }\r\n}\r\n\r\nexport default class ChatPinnedMessage {\r\n public static LOAD_COUNT = 50;\r\n public static LOAD_OFFSET = 5;\r\n\r\n public pinnedMessageContainer: PinnedContainer;\r\n public pinnedMessageBorder: PinnedMessageBorder;\r\n\r\n public pinnedMaxMid = 0;\r\n public pinnedMid = 0;\r\n public pinnedIndex = -1;\r\n public wasPinnedIndex = 0;\r\n public wasPinnedMediaIndex = 0;\r\n \r\n public locked = false;\r\n public waitForScrollBottom = false;\r\n\r\n public count = 0;\r\n public mids: number[] = [];\r\n public offsetIndex = 0;\r\n\r\n public loading = false;\r\n public loadedBottom = false;\r\n public loadedTop = false;\r\n\r\n public animatedSubtitle: AnimatedSuper;\r\n public animatedMedia: AnimatedSuper;\r\n public animatedCounter: AnimatedCounter;\r\n\r\n public listenerSetter: ListenerSetter;\r\n public scrollDownListenerSetter: ListenerSetter = null;\r\n\r\n public hidden = false;\r\n\r\n public getCurrentIndexPromise: Promise = null;\r\n public btnOpen: HTMLButtonElement;\r\n \r\n public setPinnedMessage: () => void;\r\n\r\n private isStatic = false;\r\n\r\n private debug = false;\r\n \r\n constructor(private topbar: ChatTopbar, private chat: Chat, private appMessagesManager: AppMessagesManager, private appPeersManager: AppPeersManager) {\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n const dAC = new ReplyContainer('pinned-message');\r\n this.pinnedMessageContainer = new PinnedContainer({\r\n topbar, \r\n chat, \r\n listenerSetter: this.listenerSetter, \r\n className: 'message', \r\n divAndCaption: dAC, \r\n onClose: async() => {\r\n if(appPeersManager.canPinMessage(this.topbar.peerId)) {\r\n new PopupPinMessage(this.topbar.peerId, this.pinnedMid, true);\r\n } else {\r\n new PopupPinMessage(this.topbar.peerId, 0, true);\r\n }\r\n\r\n return false;\r\n }\r\n });\r\n\r\n this.pinnedMessageBorder = new PinnedMessageBorder();\r\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\r\n\r\n this.animatedSubtitle = new AnimatedSuper();\r\n dAC.subtitle.append(this.animatedSubtitle.container);\r\n\r\n this.animatedMedia = new AnimatedSuper();\r\n this.animatedMedia.container.classList.add('pinned-message-media-container');\r\n dAC.content.prepend(this.animatedMedia.container);\r\n\r\n this.animatedCounter = new AnimatedCounter(true);\r\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\r\n\r\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\r\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\r\n dAC.container.prepend(btnClose);\r\n\r\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\r\n\r\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\r\n\r\n attachClickEvent(this.btnOpen, (e) => {\r\n cancelEvent(e);\r\n this.topbar.openPinned(true);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n //this.wasPinnedIndex = 0;\r\n //setTimeout(() => {\r\n if(this.hidden) {\r\n this.pinnedMessageContainer.toggle(this.hidden = false);\r\n }\r\n\r\n this.loadedTop = this.loadedBottom = false;\r\n this.pinnedIndex = -1;\r\n this.pinnedMid = 0;\r\n this.count = 0;\r\n this.mids = [];\r\n this.offsetIndex = 0;\r\n this.pinnedMaxMid = 0;\r\n this.setCorrectIndex(0);\r\n //}, 300);\r\n }\r\n });\r\n\r\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\r\n if(peerId === this.topbar.peerId) {\r\n this.pinnedMessageContainer.toggle(this.hidden = true);\r\n }\r\n });\r\n\r\n // * 200 - no lags\r\n // * 100 - need test\r\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\r\n\r\n this.isStatic = this.chat.type === 'discussion';\r\n }\r\n\r\n public destroy() {\r\n this.pinnedMessageContainer.divAndCaption.container.remove();\r\n this.pinnedMessageContainer.toggle(true);\r\n this.listenerSetter.removeAll();\r\n this.unsetScrollDownListener(false);\r\n }\r\n\r\n public setCorrectIndex(lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n //return;\r\n\r\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\r\n return;\r\n }\r\n\r\n if((this.loadedBottom || this.loadedTop) && !this.count) {\r\n return;\r\n }\r\n\r\n //const perf = performance.now();\r\n let el = this.chat.bubbles.getBubbleByPoint('bottom');\r\n //this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\r\n if(!el) return;\r\n\r\n //return;\r\n\r\n const mid = el.dataset.mid;\r\n if(el && mid !== undefined) {\r\n //this.chat.log('[PM]: setCorrectIndex will test mid:', mid);\r\n this.testMid(+mid, lastScrollDirection);\r\n }\r\n }\r\n\r\n public testMid(mid: number, lastScrollDirection?: number) {\r\n if(this.isStatic) return;\r\n \r\n //if(lastScrollDirection !== undefined) return;\r\n if(this.hidden) return;\r\n\r\n //this.chat.log('[PM]: testMid', mid);\r\n\r\n let currentIndex: number = this.mids.findIndex(_mid => _mid <= mid);\r\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\r\n currentIndex += this.offsetIndex;\r\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\r\n //currentIndex = 0;\r\n currentIndex = this.mids.length - 1 + this.offsetIndex;\r\n } else {\r\n if(!this.getCurrentIndexPromise) {\r\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\r\n }\r\n\r\n return;\r\n }\r\n\r\n //const idx = Math.max(0, this.mids.indexOf(mid));\r\n\r\n /* if(currentIndex === this.count) {\r\n currentIndex = 0;\r\n } */\r\n\r\n //this.chat.log('[PM]: testMid: pinned currentIndex', currentIndex, mid);\r\n\r\n const changed = this.pinnedIndex !== currentIndex;\r\n if(changed) {\r\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\r\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\r\n return;\r\n }\r\n }\r\n\r\n this.pinnedIndex = currentIndex;\r\n this.pinnedMid = this.mids.find(_mid => _mid <= mid) || this.mids[this.mids.length - 1];\r\n this.setPinnedMessage();\r\n }\r\n }\r\n\r\n private isNeededMore(currentIndex: number) {\r\n return (this.count > ChatPinnedMessage.LOAD_COUNT && \r\n (\r\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) || \r\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\r\n )\r\n );\r\n }\r\n\r\n private async getCurrentIndex(mid: number, correctAfter = true) {\r\n if(this.loading) return;\r\n this.loading = true;\r\n\r\n try {\r\n let gotRest = false;\r\n const promises = [\r\n this.appMessagesManager.getSearch({\r\n peerId: this.topbar.peerId, \r\n inputFilter: {_: 'inputMessagesFilterPinned'}, \r\n maxId: mid, \r\n limit: ChatPinnedMessage.LOAD_COUNT, \r\n backLimit: ChatPinnedMessage.LOAD_COUNT\r\n })\r\n .then(r => {\r\n gotRest = true;\r\n return r;\r\n })\r\n ];\r\n \r\n if(!this.pinnedMaxMid) {\r\n const promise = this.appMessagesManager.getPinnedMessage(this.topbar.peerId).then(p => {\r\n if(!p.maxId) return;\r\n this.pinnedMaxMid = p.maxId;\r\n\r\n if(!gotRest && correctAfter) {\r\n this.mids = [this.pinnedMaxMid];\r\n this.count = p.count;\r\n this.pinnedIndex = 0;\r\n this.pinnedMid = this.mids[0];\r\n this.setPinnedMessage();\r\n //this.pinnedMessageContainer.toggle(false);\r\n }\r\n });\r\n \r\n promises.push(promise as any);\r\n }\r\n \r\n const result = (await Promise.all(promises))[0];\r\n \r\n let backLimited = result.history.findIndex(message => message.mid <= mid);\r\n if(backLimited === -1) {\r\n backLimited = result.history.length;\r\n }/* else {\r\n backLimited -= 1;\r\n } */\r\n \r\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\r\n this.mids = result.history.map(message => message.mid).slice();\r\n this.count = result.count;\r\n\r\n if(!this.count) {\r\n this.pinnedMessageContainer.toggle(true);\r\n }\r\n \r\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\r\n this.loadedBottom = !this.offsetIndex;\r\n \r\n this.debug && this.chat.log('[PM]: getCurrentIndex result:', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\r\n } catch(err) {\r\n this.chat.log.error('[PM]: getCurrentIndex error', err);\r\n }\r\n \r\n this.loading = false;\r\n\r\n if(this.locked) {\r\n this.testMid(mid);\r\n } else if(correctAfter) {\r\n this.setCorrectIndex(0);\r\n }\r\n\r\n this.getCurrentIndexPromise = null;\r\n //return result.offset_id_offset || 0;\r\n }\r\n\r\n public setScrollDownListener() {\r\n this.waitForScrollBottom = true;\r\n\r\n if(!this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter = new ListenerSetter();\r\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\r\n this.unsetScrollDownListener();\r\n }, this.scrollDownListenerSetter);\r\n }\r\n }\r\n\r\n public unsetScrollDownListener(refreshPosition = true) {\r\n this.waitForScrollBottom = false;\r\n\r\n if(this.scrollDownListenerSetter) {\r\n this.scrollDownListenerSetter.removeAll();\r\n this.scrollDownListenerSetter = null;\r\n }\r\n\r\n if(refreshPosition) {\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async handleFollowingPinnedMessage() {\r\n this.locked = true;\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage');\r\n try {\r\n this.setScrollDownListener();\r\n\r\n const setPeerPromise = this.chat.setPeerPromise;\r\n if(setPeerPromise instanceof Promise) {\r\n await setPeerPromise;\r\n }\r\n \r\n //await this.chat.bubbles.scrollable.scrollLockedPromise;\r\n await getHeavyAnimationPromise();\r\n\r\n if(this.getCurrentIndexPromise) {\r\n await this.getCurrentIndexPromise;\r\n }\r\n\r\n this.debug && this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n\r\n /* // подождём, пока скролл остановится\r\n setTimeout(() => {\r\n this.chat.log('[PM]: handleFollowingPinnedMessage: unlock');\r\n this.locked = false;\r\n }, 50); */\r\n } catch(err) {\r\n this.chat.log.error('[PM]: handleFollowingPinnedMessage error:', err);\r\n\r\n this.locked = false;\r\n this.waitForScrollBottom = false;\r\n this.setCorrectIndex(0);\r\n }\r\n }\r\n\r\n public async followPinnedMessage(mid: number) {\r\n const message = this.chat.getMessage(mid);\r\n if(message && !message.deleted) {\r\n this.chat.setMessageId(mid);\r\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\r\n this.handleFollowingPinnedMessage();\r\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\r\n });\r\n }\r\n }\r\n\r\n public async _setPinnedMessage() {\r\n /////this.log('setting pinned message', message);\r\n //return;\r\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\r\n Promise.all([\r\n promise\r\n ]).then(() => { */\r\n //const mids = results[0];\r\n const count = this.count;\r\n if(count) {\r\n const pinnedIndex = this.pinnedIndex;\r\n const message = this.chat.getMessage(this.pinnedMid);\r\n\r\n //this.animatedCounter.prepareNumber(count);\r\n\r\n //setTimeout(() => {\r\n const isLast = pinnedIndex === 0;\r\n this.animatedCounter.container.classList.toggle('is-last', isLast);\r\n //SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\r\n if(!isLast) {\r\n this.animatedCounter.setCount(count - pinnedIndex);\r\n }\r\n //}, 100);\r\n\r\n //this.pinnedMessageContainer.fill(undefined, message.message, message);\r\n this.pinnedMessageContainer.toggle(false);\r\n\r\n const fromTop = pinnedIndex > this.wasPinnedIndex;\r\n\r\n this.debug && this.chat.log('[PM]: setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\r\n\r\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\r\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\r\n writeMediaTo.classList.add('pinned-message-media');\r\n //writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\r\n const loadPromises: Promise[] = [];\r\n const isMediaSet = wrapReplyDivAndCaption({\r\n title: undefined,\r\n titleEl: null,\r\n subtitle: message.message,\r\n subtitleEl: writeTo,\r\n message,\r\n mediaEl: writeMediaTo,\r\n loadPromises\r\n });\r\n\r\n await Promise.all(loadPromises);\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\r\n\r\n //if(this.wasPinnedIndex !== this.pinnedIndex) {\r\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\r\n if(isMediaSet) {\r\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\r\n this.wasPinnedMediaIndex = pinnedIndex;\r\n } else {\r\n this.animatedMedia.clearRows();\r\n }\r\n //}\r\n\r\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\r\n this.wasPinnedIndex = pinnedIndex;\r\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\r\n } else {\r\n this.pinnedMessageContainer.toggle(true);\r\n this.wasPinnedIndex = 0;\r\n }\r\n\r\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\r\n //});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\r\n if(IS_TOUCH_SUPPORTED) {\r\n let lastY: number;\r\n const options = {passive: true};\r\n listenerSetter.add(elem)('touchstart', (e) => {\r\n if(e.touches.length > 1) {\r\n onTouchEnd();\r\n return;\r\n }\r\n\r\n lastY = e.touches[0].clientY;\r\n\r\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\r\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\r\n }, options);\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n const clientY = e.touches[0].clientY;\r\n\r\n const isDown = clientY < lastY;\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n lastY = clientY;\r\n //alert('isDown: ' + !!isDown);\r\n };\r\n \r\n const onTouchEnd = () => {\r\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\r\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\r\n };\r\n } else {\r\n listenerSetter.add(elem)('wheel', (e) => {\r\n const isDown = e.deltaY > 0;\r\n //this.log('wheel', e, isDown);\r\n if(side === 'bottom' && isDown) callback();\r\n else if(side === 'top' && !isDown) callback();\r\n }, {passive: true});\r\n }\r\n}\r\n","import IS_WEBRTC_SUPPORTED from \"./webrtcSupport\";\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, Channel } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppSidebarRight } from \"../sidebarRight\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppGroupCallsManager, MyGroupCall } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type Chat from \"./chat\";\nimport { RIGHT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarRight\";\nimport mediaSizes, { ScreenSize } from \"../../helpers/mediaSizes\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport rootScope from \"../../lib/rootScope\";\nimport AvatarElement from \"../avatar\";\nimport Button from \"../button\";\nimport ButtonIcon from \"../buttonIcon\";\nimport ButtonMenuToggle from \"../buttonMenuToggle\";\nimport ChatAudio from \"./audio\";\nimport ChatPinnedMessage from \"./pinnedMessage\";\nimport { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport appStateManager from \"../../lib/appManagers/appStateManager\";\nimport PopupDeleteDialog from \"../popups/deleteDialog\";\nimport appNavigationController from \"../appNavigationController\";\nimport { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../sidebarLeft\";\nimport PeerTitle from \"../peerTitle\";\nimport { i18n } from \"../../lib/langPack\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport { toast, toastNew } from \"../toast\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { ChatFull, Chat as MTChat, GroupCall } from \"../../layer\";\nimport PopupPickUser from \"../popups/pickUser\";\nimport PopupPeer from \"../popups/peer\";\nimport generateVerifiedIcon from \"../generateVerifiedIcon\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppEditContactTab from \"../sidebarRight/tabs/editContact\";\nimport appMediaPlaybackController from \"../appMediaPlaybackController\";\nimport { NULL_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport IS_CALL_SUPPORTED from \"../../environment/callSupport\";\nimport { CallType } from \"../../lib/calls/types\";\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLButtonElement;\n \n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n public peerId: PeerId;\n private wasPeerId: PeerId;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat, \n private appSidebarRight: AppSidebarRight, \n private appMessagesManager: AppMessagesManager, \n private appPeersManager: AppPeersManager, \n private appChatsManager: AppChatsManager, \n private appNotificationsManager: AppNotificationsManager,\n private appProfileManager: AppProfileManager,\n private appUsersManager: AppUsersManager,\n private appGroupCallsManager: AppGroupCallsManager\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n //this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.appMessagesManager);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({listenerSetter: this.listenerSetter}, 'bottom-left', this.menuButtons, this.verifyButtons);\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null, \n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null, \n this.btnJoin, \n this.btnPinned, \n this.btnCall, \n this.btnGroupCall, \n this.btnMute, \n this.btnSearch, \n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n \n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n //if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n //}\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined), \n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n //const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: () => boolean) {\n if(!element) {\n return;\n }\n \n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const verifyButtons = (buttons: ButtonToVerify[]) => {\n buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify());\n });\n };\n\n if(isMenuOpen) {\n verifyButtons(this.menuButtons);\n\n // delete button\n this.menuButtons[this.menuButtons.length - 1].element.lastChild.replaceWith(i18n(this.appPeersManager.getDeleteButtonText(this.peerId)));\n }\n\n verifyButtons(this.buttonsToVerify);\n };\n\n private verifyVideoChatButton = (type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser()) return false;\n\n const currentGroupCall = this.appGroupCallsManager.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if((this.peerId.isBroadcast() && type === 'group') || \n (this.peerId.isAnyGroup() && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = this.appChatsManager.getChatTyped(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || this.appChatsManager.hasRights(chatId, 'manage_call');\n };\n\n private verifyCallButton = (type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = this.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.appMessagesManager.mutePeer(this.peerId);\n },\n verify: () => this.chat.type === 'chat' && rootScope.myId !== this.peerId && this.appNotificationsManager.isPeerLocalMuted(this.peerId, false)\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.appProfileManager.getChannelFull(this.peerId.toChatId()).then(channelFull => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: () => {\n const chatFull = this.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n appStateManager.getState().then(state => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = (bubble) => {\n appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = new AppEditContactTab(this.appSidebarRight);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: () => this.peerId.isUser() && !this.appPeersManager.isContact(this.peerId)\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true,\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: () => rootScope.myId !== this.peerId && this.peerId.isUser() && this.appPeersManager.isContact(this.peerId) && !!this.appUsersManager.getUser(this.peerId.toUserId()).phone\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.appUsersManager.toggleBlock(this.peerId, true).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: () => {\n if(!this.peerId.isUser()) return false;\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.appUsersManager.toggleBlock(this.peerId, false).then(value => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: () => {\n const userFull = this.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: () => this.chat.type === 'chat' && !!this.appMessagesManager.getDialogOnly(this.peerId)\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n public constructPeerHelpers() {\n this.avatarElement = new AvatarElement();\n this.avatarElement.setAttribute('dialog', '1');\n //this.avatarElement.setAttribute('clickable', '');\n this.avatarElement.classList.add('avatar-42', 'person-avatar');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, () => {\n this.appMessagesManager.mutePeer(this.peerId);\n });\n\n this.attachClickEvent(this.btnJoin, () => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = this.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n \n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n if(this.pinnedMessage) {\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n \n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n }\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public constructPinnedHelpers() {\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(peerId !== this.peerId) return;\n\n if(mids) {\n this.setTitle();\n }\n });\n }\n \n public constructDiscussionHelpers() {\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId, \n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0, \n type: 'pinned'\n });\n }\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n //this.chat.log.error('Topbar destroying');\n\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n \n if(this.pinnedMessage) {\n this.pinnedMessage.destroy(); // * возможно это можно не делать\n }\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public setPeer(peerId: PeerId) {\n this.wasPeerId = this.peerId;\n this.peerId = peerId;\n\n this.container.style.display = peerId ? '' : 'none';\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number) {\n const peerId = this.peerId;\n\n if(this.avatarElement) {\n this.avatarElement.setAttribute('peer', '' + peerId);\n this.avatarElement.update();\n }\n\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast);\n if(this.btnJoin) {\n if(this.appPeersManager.isAnyChat(peerId)) {\n const chatId = peerId.toChatId();\n replaceContent(this.btnJoin, i18n(this.appChatsManager.isBroadcast(chatId) ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !this.appChatsManager.getChat(chatId)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n const middleware = this.chat.bubbles.getMiddleware();\n if(this.pinnedMessage) { // * replace with new one\n if(this.chat.type === 'chat') {\n if(this.wasPeerId !== undefined) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.appMessagesManager, this.appPeersManager);\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n //this.pinnedMessage.pinnedMessageContainer.toggle(true);\n this.pinnedMessage = newPinnedMessage;\n }\n \n appStateManager.getState().then((state) => {\n if(!middleware()) return;\n \n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n \n if(!isTarget) {\n this.pinnedMessage.setCorrectIndex(0);\n }\n });\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n }\n\n fastRaf(() => {\n this.setTitle();\n this.setPeerStatus(true);\n this.setMutedState();\n });\n }\n\n public setTitle(count?: number) {\n let titleEl: HTMLElement;\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.appMessagesManager.getSearchCounters(this.peerId, [{_: 'inputMessagesFilterPinned'}], false).then(result => {\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n if(this.peerId === rootScope.myId) {\n //title = [count > 1 ? count : false, 'Reminders'].filter(Boolean).join(' ');\n titleEl = i18n('Reminders');\n } else {\n titleEl = i18n('ScheduledMessages');\n //title = [count > 1 ? count : false, 'Scheduled Messages'].filter(Boolean).join(' ');\n }\n \n if(count === undefined) {\n this.appMessagesManager.getScheduledMessages(this.peerId).then(mids => {\n this.setTitle(mids.length);\n });\n }\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n\n if(count === undefined) {\n Promise.all([\n this.appMessagesManager.getHistory(this.peerId, 0, 1, 0, this.chat.threadId),\n Promise.resolve()\n ]).then(() => {\n const count = this.appMessagesManager.getHistoryStorage(this.peerId, this.chat.threadId).count;\n if(count === null) {\n setTimeout(() => {\n this.setTitle();\n }, 30);\n } else {\n this.setTitle(count);\n }\n });\n }\n } else if(this.chat.type === 'chat') {\n titleEl = new PeerTitle({\n peerId: this.peerId,\n dialog: true,\n }).element;\n }\n \n replaceContent(this.title, titleEl);\n\n if(this.chat.type === 'chat') {\n const peer = this.appPeersManager.getPeer(this.peerId);\n if(peer?.pFlags?.verified) {\n this.title.append(generateVerifiedIcon());\n }\n }\n }\n\n public setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n let muted = this.appNotificationsManager.isPeerLocalMuted(peerId, false);\n if(this.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n //return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n //mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n \n //mutationRAF = window.requestAnimationFrame(() => {\n \n //setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n //this.chatInfo.classList.toggle('have-utils-width', !!width);\n //}, 0);\n \n this.setUtilsRAF = 0;\n\n //mutationObserver.observe(chatUtils, observeOptions);\n //});\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.divAndCaption.container.classList.contains('is-floating');\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatus = (needClear = false) => {\n if(!this.subtitle) return;\n\n const peerId = this.peerId;\n this.chat.appImManager.setPeerStatus(this.peerId, this.subtitle, needClear, false, () => peerId === this.peerId);\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appSidebarRight from \"..\";\r\nimport { attachClickEvent } from \"../../../helpers/dom/clickEvent\";\r\nimport AppSearch, { SearchGroup } from \"../../appSearch\";\r\nimport ButtonIcon from \"../../buttonIcon\";\r\nimport InputSearch from \"../../inputSearch\";\r\nimport PopupDatePicker from \"../../popups/datePicker\";\r\nimport { SliderSuperTab } from \"../../slider\";\r\n\r\nexport default class AppPrivateSearchTab extends SliderSuperTab {\r\n private inputSearch: InputSearch;\r\n private appSearch: AppSearch;\r\n private btnPickDate: HTMLElement;\r\n\r\n private peerId: PeerId;\r\n private threadId = 0;\r\n private query = '';\r\n private onDatePick: (timestamp: number) => void;\r\n\r\n onOpenAfterTimeout() {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\r\n }\r\n\r\n protected init() {\r\n this.container.id = 'search-private-container';\r\n this.container.classList.add('chatlist-container');\r\n this.inputSearch = new InputSearch('Search');\r\n this.title.replaceWith(this.inputSearch.container);\r\n\r\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\r\n this.header.append(this.btnPickDate);\r\n\r\n const c = document.createElement('div');\r\n c.classList.add('chatlist-container');\r\n this.scrollable.container.replaceWith(c);\r\n this.appSearch = new AppSearch(c, this.inputSearch, {\r\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\r\n });\r\n }\r\n\r\n open(peerId: PeerId, threadId?: number, onDatePick?: AppPrivateSearchTab['onDatePick'], query?: string) {\r\n const ret = super.open();\r\n\r\n if(!this.peerId) {\r\n this.query = query;\r\n this.peerId = peerId;\r\n this.threadId = threadId;\r\n this.onDatePick = onDatePick;\r\n \r\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\r\n if(this.onDatePick) {\r\n attachClickEvent(this.btnPickDate, () => {\r\n new PopupDatePicker(new Date(), this.onDatePick).show();\r\n });\r\n }\r\n\r\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\r\n \r\n appSidebarRight.toggleSidebar(true);\r\n } else {\r\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ChatTopbar from \"./topbar\";\r\nimport AppSearch, { SearchGroup } from \"../appSearch\";\r\nimport PopupDatePicker from \"../popups/datePicker\";\r\nimport { ripple } from \"../ripple\";\r\nimport InputSearch from \"../inputSearch\";\r\nimport type Chat from \"./chat\";\r\nimport findUpTag from \"../../helpers/dom/findUpTag\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport whichChild from \"../../helpers/dom/whichChild\";\r\nimport replaceContent from \"../../helpers/dom/replaceContent\";\r\nimport { i18n } from \"../../lib/langPack\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\r\n\r\nexport default class ChatSearch {\r\n private element: HTMLElement;\r\n private backBtn: HTMLElement;\r\n private inputSearch: InputSearch;\r\n\r\n private results: HTMLElement;\r\n\r\n private footer: HTMLElement;\r\n private dateBtn: HTMLElement;\r\n private foundCountEl: HTMLElement;\r\n private controls: HTMLElement;\r\n private downBtn: HTMLElement;\r\n private upBtn: HTMLElement;\r\n\r\n private appSearch: AppSearch;\r\n private searchGroup: SearchGroup;\r\n\r\n private foundCount = 0;\r\n private selectedIndex = 0;\r\n private setPeerPromise: Promise;\r\n private listenerSetter: ListenerSetter;\r\n private navigationItem: NavigationItem;\r\n\r\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\r\n this.element = document.createElement('div');\r\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\r\n\r\n this.backBtn = document.createElement('button');\r\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\r\n ripple(this.backBtn);\r\n\r\n const listenerSetter = this.listenerSetter = new ListenerSetter();\r\n\r\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\r\n attachClickEvent(element, callback, {listenerSetter});\r\n };\r\n \r\n attachClick(this.backBtn, () => {\r\n this.destroy();\r\n });\r\n\r\n this.inputSearch = new InputSearch('Search');\r\n \r\n // Results\r\n this.results = document.createElement('div');\r\n this.results.classList.add('chat-search-results', 'chatlist-container');\r\n\r\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\r\n attachClick(this.searchGroup.list, this.onResultsClick);\r\n\r\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\r\n messages: this.searchGroup\r\n }, (count) => {\r\n this.foundCount = count;\r\n\r\n if(!this.foundCount) {\r\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\r\n }\r\n });\r\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\r\n\r\n //appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\r\n this.chat.bubbles.bubblesContainer.append(this.results);\r\n\r\n // Footer\r\n this.footer = document.createElement('div');\r\n this.footer.classList.add('chat-search-footer');\r\n\r\n attachClick(this.footer, this.onFooterClick);\r\n ripple(this.footer);\r\n\r\n this.foundCountEl = document.createElement('span');\r\n this.foundCountEl.classList.add('chat-search-count');\r\n\r\n this.dateBtn = document.createElement('button');\r\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\r\n\r\n this.controls = document.createElement('div');\r\n this.controls.classList.add('chat-search-controls');\r\n\r\n this.upBtn = document.createElement('button');\r\n this.upBtn.classList.add('btn-icon', 'tgico-up');\r\n this.downBtn = document.createElement('button');\r\n this.downBtn.classList.add('btn-icon', 'tgico-down');\r\n\r\n this.upBtn.setAttribute('disabled', 'true');\r\n this.downBtn.setAttribute('disabled', 'true');\r\n\r\n attachClick(this.dateBtn, this.onDateClick);\r\n attachClick(this.upBtn, this.onUpClick);\r\n attachClick(this.downBtn, this.onDownClick);\r\n this.controls.append(this.upBtn, this.downBtn);\r\n\r\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\r\n \r\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\r\n\r\n // Append container\r\n this.element.append(this.backBtn, this.inputSearch.container);\r\n\r\n this.topbar.container.classList.add('hide-pinned');\r\n this.topbar.container.parentElement.append(this.element);\r\n\r\n this.inputSearch.input.focus();\r\n\r\n if(query) {\r\n this.setQuery(query);\r\n }\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n this.navigationItem = {\r\n type: 'mobile-search',\r\n onPop: () => {\r\n this.destroy();\r\n }\r\n };\r\n \r\n appNavigationController.pushItem(this.navigationItem);\r\n }\r\n }\r\n\r\n public destroy() {\r\n this.topbar.container.classList.remove('hide-pinned');\r\n this.element.remove();\r\n this.inputSearch.remove();\r\n this.results.remove();\r\n this.footer.remove();\r\n this.listenerSetter.removeAll();\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n this.chat.search = undefined;\r\n appNavigationController.removeItem(this.navigationItem);\r\n }\r\n\r\n public setQuery(query: string) {\r\n this.inputSearch.inputField.value = query;\r\n }\r\n\r\n private onDateClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n new PopupDatePicker(new Date(), this.chat.bubbles.onDatePick).show();\r\n };\r\n\r\n private selectResult(elem: HTMLElement) {\r\n if(this.setPeerPromise) return this.setPeerPromise;\r\n\r\n const peerId = elem.dataset.peerId.toPeerId();\r\n const lastMsgId = +elem.dataset.mid || undefined;\r\n\r\n const index = whichChild(elem);\r\n\r\n if(index === (this.foundCount - 1)) {\r\n this.upBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.upBtn.removeAttribute('disabled');\r\n }\r\n\r\n if(!index) {\r\n this.downBtn.setAttribute('disabled', 'true');\r\n } else {\r\n this.downBtn.removeAttribute('disabled');\r\n }\r\n\r\n this.results.classList.remove('active');\r\n this.chat.bubbles.bubblesContainer.classList.remove('search-results-active');\r\n\r\n const res = this.chat.setPeer(peerId, lastMsgId);\r\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\r\n this.selectedIndex = index;\r\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\r\n\r\n const renderedCount = this.searchGroup.list.childElementCount;\r\n if(this.selectedIndex >= (renderedCount - 6)) {\r\n this.appSearch.searchMore();\r\n }\r\n }).finally(() => {\r\n this.setPeerPromise = null;\r\n });\r\n }\r\n\r\n private onResultsClick = (e: MouseEvent) => {\r\n const target = findUpTag(e.target, 'LI');\r\n if(target) {\r\n this.selectResult(target);\r\n }\r\n };\r\n\r\n private onFooterClick = (e: MouseEvent) => {\r\n if(this.foundCount) {\r\n this.chat.bubbles.bubblesContainer.classList.toggle('search-results-active');\r\n this.results.classList.toggle('active');\r\n }\r\n };\r\n\r\n private onUpClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\r\n };\r\n\r\n private onDownClick = (e: MouseEvent) => {\r\n cancelEvent(e);\r\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\r\n };\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { AppNotificationsManager } from \"../../lib/appManagers/appNotificationsManager\";\nimport type { AppChatsManager, ChatRights } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppDocsManager } from \"../../lib/appManagers/appDocsManager\";\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\nimport type { AppInlineBotsManager } from \"../../lib/appManagers/appInlineBotsManager\";\nimport type { AppMessagesManager } from \"../../lib/appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport type { AppPhotosManager } from \"../../lib/appManagers/appPhotosManager\";\nimport type { AppPollsManager } from \"../../lib/appManagers/appPollsManager\";\nimport type { AppProfileManager } from \"../../lib/appManagers/appProfileManager\";\nimport type { AppStickersManager } from \"../../lib/appManagers/appStickersManager\";\nimport type { AppUsersManager } from \"../../lib/appManagers/appUsersManager\";\nimport type { AppWebPagesManager } from \"../../lib/appManagers/appWebPagesManager\";\nimport type { ApiManagerProxy } from \"../../lib/mtproto/mtprotoworker\";\nimport type { AppDraftsManager } from \"../../lib/appManagers/appDraftsManager\";\nimport type { AppEmojiManager } from \"../../lib/appManagers/appEmojiManager\";\nimport type { ServerTimeManager } from \"../../lib/mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../../lib/appManagers/appMessagesIdsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { State } from \"../../lib/appManagers/appStateManager\";\nimport type stateStorage from '../../lib/stateStorage';\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport { logger, LogTypes } from \"../../lib/logger\";\nimport rootScope from \"../../lib/rootScope\";\nimport appSidebarRight from \"../sidebarRight\";\nimport ChatBubbles from \"./bubbles\";\nimport ChatContextMenu from \"./contextMenu\";\nimport ChatInput from \"./input\";\nimport ChatSelection from \"./selection\";\nimport ChatTopbar from \"./topbar\";\nimport { BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID } from \"../../lib/mtproto/mtproto_config\";\nimport SetTransition from \"../singleTransition\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport AppPrivateSearchTab from \"../sidebarRight/tabs/search\";\nimport renderImageFromUrl from \"../../helpers/dom/renderImageFromUrl\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport ChatSearch from \"./search\";\n\nexport type ChatType = 'chat' | 'pinned' | 'replies' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n\n public noAutoDownloadMedia: boolean;\n public noForwards: boolean;\n\n public inited: boolean;\n \n constructor(public appImManager: AppImManager, \n public appChatsManager: AppChatsManager, \n public appDocsManager: AppDocsManager, \n public appInlineBotsManager: AppInlineBotsManager, \n public appMessagesManager: AppMessagesManager, \n public appPeersManager: AppPeersManager, \n public appPhotosManager: AppPhotosManager, \n public appProfileManager: AppProfileManager, \n public appStickersManager: AppStickersManager, \n public appUsersManager: AppUsersManager, \n public appWebPagesManager: AppWebPagesManager, \n public appPollsManager: AppPollsManager, \n public apiManager: ApiManagerProxy, \n public appDraftsManager: AppDraftsManager, \n public serverTimeManager: ServerTimeManager, \n public storage: typeof stateStorage, \n public appNotificationsManager: AppNotificationsManager,\n public appEmojiManager: AppEmojiManager,\n public appMessagesIdsManager: AppMessagesIdsManager,\n public appGroupCallsManager: AppGroupCallsManager\n ) {\n super();\n\n this.type = 'chat';\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n //this.log.error('Chat construction');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n }\n\n public setBackground(url: string): Promise {\n const theme = rootScope.getTheme();\n\n let item: HTMLElement;\n if(theme.background.type === 'color' && document.documentElement.style.cursor === 'grabbing') {\n const _item = this.backgroundEl.lastElementChild as HTMLElement;\n if(_item && _item.dataset.type === theme.background.type) {\n item = _item;\n }\n }\n \n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n item.dataset.type = theme.background.type;\n }\n\n if(theme.background.type === 'color') {\n item.style.backgroundColor = theme.background.color;\n item.style.backgroundImage = 'none';\n }\n\n return new Promise((resolve) => {\n const cb = () => {\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n this.backgroundEl.append(item);\n\n // * одного недостаточно, при обновлении страницы все равно фон появляется неплавно\n // ! с requestAnimationFrame лучше, но все равно иногда моргает, так что использую два фаста.\n fastRaf(() => {\n fastRaf(() => {\n SetTransition(item, 'is-visible', true, 200, prev ? () => {\n prev.remove();\n } : null);\n });\n });\n\n resolve();\n };\n\n if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n }\n\n public setType(type: ChatType) {\n this.type = type;\n\n if(this.type === 'scheduled') {\n this.getMessagesStorage = () => this.appMessagesManager.getScheduledMessagesStorage(this.peerId);\n //this.getMessage = (mid) => this.appMessagesManager.getMessageFromStorage(this.appMessagesManager.getScheduledMessagesStorage(this.peerId), mid);\n }\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.appMessagesManager, this.appPeersManager, this.appChatsManager, this.appNotificationsManager, this.appProfileManager, this.appUsersManager, this.appGroupCallsManager);\n this.bubbles = new ChatBubbles(this, this.appMessagesManager, this.appStickersManager, this.appUsersManager, this.appInlineBotsManager, this.appPhotosManager, this.appPeersManager, this.appProfileManager, this.appDraftsManager, this.appMessagesIdsManager, this.appChatsManager);\n this.input = new ChatInput(this, this.appMessagesManager, this.appMessagesIdsManager, this.appDocsManager, this.appChatsManager, this.appPeersManager, this.appWebPagesManager, this.appImManager, this.appDraftsManager, this.serverTimeManager, this.appNotificationsManager, this.appEmojiManager, this.appUsersManager, this.appInlineBotsManager);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.appMessagesManager);\n this.contextMenu = new ChatContextMenu(this.bubbles.bubblesContainer, this, this.appMessagesManager, this.appPeersManager, this.appPollsManager, this.appDocsManager, this.appMessagesIdsManager);\n\n if(this.type === 'chat') {\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.topbar.constructPinnedHelpers();\n } else if(this.type === 'discussion') {\n this.topbar.constructUtils();\n this.topbar.constructDiscussionHelpers();\n }\n\n this.topbar.construct();\n this.input.construct();\n\n if(this.type === 'chat') { // * гений в деле, разный порядок из-за разной последовательности действий\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'pinned') {\n this.bubbles.constructPinnedHelpers();\n this.input.constructPinnedHelpers();\n } else if(this.type === 'scheduled') {\n this.bubbles.constructScheduledHelpers();\n this.input.constructPeerHelpers();\n } else if(this.type === 'discussion') {\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n }\n\n this.container.classList.add('type-' + this.type);\n this.container.append(this.topbar.container, this.bubbles.bubblesContainer, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer(migrateTo);\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (e) => {\n if(e.peerId === this.peerId) {\n this.appImManager.setPeer();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n public destroy() {\n //const perf = performance.now();\n\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n //this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.selection.cleanup();\n }\n\n public setPeer(peerId: PeerId, lastMsgId?: number, startParam?: string) {\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n const samePeer = this.peerId === peerId;\n if(!samePeer) {\n rootScope.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n } else if(this.setPeerPromise) {\n return;\n }\n\n //console.time('appImManager setPeer');\n //console.time('appImManager setPeer pre promise');\n ////console.time('appImManager: pre render start');\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.topbar.setPeer(peerId);\n this.bubbles.setPeer(peerId);\n rootScope.dispatchEvent('peer_changed', peerId);\n\n return;\n }\n\n // set new\n if(!samePeer) {\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n\n this.noForwards = this.appPeersManager.noForwards(peerId);\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n appSidebarRight.sharedMediaTab.setPeer(peerId, this.threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n this.setAutoDownloadMedia();\n }\n\n this.peerChanged = samePeer;\n\n if(startParam === undefined && this.isStartButtonNeeded()) {\n startParam = BOT_START_PARAM;\n }\n\n const result = this.bubbles.setPeer(peerId, lastMsgId, startParam);\n if(!result) {\n return;\n }\n\n const {promise} = result;\n\n //console.timeEnd('appImManager setPeer pre promise');\n \n const setPeerPromise = this.setPeerPromise = promise.finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n if(!samePeer) {\n appSidebarRight.sharedMediaTab.setLoadMutex(this.setPeerPromise);\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n }\n /* this.setPeerPromise.then(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n\n return result;\n }\n\n public setAutoDownloadMedia() {\n const peerId = this.peerId;\n if(!peerId) {\n return;\n }\n\n let type: keyof State['settings']['autoDownload'];\n\n if(!peerId.isUser()) {\n if(peerId.isBroadcast()) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n } else {\n if(peerId.isContact()) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n }\n\n this.noAutoDownloadMedia = !rootScope.settings.autoDownload[type];\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer(this.peerId, messageId);\n }\n\n public finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n let peerId = this.peerId;\n this.peerChanged = true;\n\n this.cleanup(false);\n\n this.topbar.setPeer(peerId);\n this.topbar.finishPeerChange(isTarget, isJump, lastMsgId);\n this.bubbles.finishPeerChange();\n this.input.finishPeerChange(startParam);\n\n appSidebarRight.sharedMediaTab.fillProfileElements();\n\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n rootScope.dispatchEvent('peer_changed', peerId);\n this.wasAlreadyUsed = true;\n }\n\n public getMessagesStorage() {\n return this.appMessagesManager.getMessagesStorage(this.peerId);\n }\n\n public getMessage(mid: number) {\n return this.appMessagesManager.getMessageFromStorage(this.getMessagesStorage(), mid);\n //return this.appMessagesManager.getMessageByPeer(this.peerId, mid);\n }\n\n public getMidsByMid(mid: number) {\n return this.appMessagesManager.getMidsByMessage(this.getMessage(mid));\n }\n\n public isAnyGroup() {\n return this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || this.appPeersManager.isAnyGroup(this.peerId);\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = new AppPrivateSearchTab(appSidebarRight);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return this.appPeersManager.isBot(this.peerId) && \n !this.appMessagesManager.getDialogOnly(this.peerId) && \n !this.appMessagesManager.getHistoryStorage(this.peerId).history.length;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppImManager } from \"../../lib/appManagers/appImManager\";\r\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\r\nimport ButtonIcon from \"../buttonIcon\";\r\nimport { clamp } from \"../../helpers/number\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE } from \"../../environment/userAgent\";\r\nimport appNavigationController from \"../appNavigationController\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport getSelectedNodes from \"../../helpers/dom/getSelectedNodes\";\r\nimport isSelectionEmpty from \"../../helpers/dom/isSelectionEmpty\";\r\nimport { MarkdownType, markdownTags } from \"../../helpers/dom/getRichElementValue\";\r\n//import { logger } from \"../../lib/logger\";\r\n\r\nexport default class MarkupTooltip {\r\n public container: HTMLElement;\r\n private wrapper: HTMLElement;\r\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\r\n private linkBackButton: HTMLElement;\r\n private linkApplyButton: HTMLButtonElement;\r\n private hideTimeout: number;\r\n private addedListener = false;\r\n private waitingForMouseUp = false;\r\n private linkInput: HTMLInputElement;\r\n private savedRange: Range;\r\n private mouseUpCounter: number = 0;\r\n //private log: ReturnType;\r\n\r\n constructor(private appImManager: AppImManager) {\r\n //this.log = logger('MARKUP');\r\n }\r\n\r\n private init() {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\r\n\r\n this.wrapper = document.createElement('div');\r\n this.wrapper.classList.add('markup-tooltip-wrapper');\r\n \r\n const tools1 = document.createElement('div');\r\n const tools2 = document.createElement('div');\r\n tools1.classList.add('markup-tooltip-tools');\r\n tools2.classList.add('markup-tooltip-tools');\r\n\r\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'link'] as (keyof MarkupTooltip['buttons'])[];\r\n arr.forEach(c => {\r\n const button = ButtonIcon(c, {noRipple: true});\r\n tools1.append(this.buttons[c] = button);\r\n\r\n if(c !== 'link') {\r\n button.addEventListener('mousedown', (e) => {\r\n cancelEvent(e); \r\n this.appImManager.chat.input.applyMarkdown(c);\r\n this.cancelClosening();\r\n \r\n /* this.mouseUpCounter = 0;\r\n this.setMouseUpEvent(); */\r\n //this.hide();\r\n });\r\n } else {\r\n attachClickEvent(button, (e) => {\r\n cancelEvent(e);\r\n this.showLinkEditor();\r\n this.cancelClosening();\r\n });\r\n }\r\n });\r\n\r\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\r\n this.linkInput = document.createElement('input');\r\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\r\n this.linkInput.classList.add('input-clear');\r\n this.linkInput.addEventListener('keydown', (e) => {\r\n const valid = !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);///^(http)|(https):\\/\\//i.test(this.linkInput.value);\r\n\r\n if(e.key === 'Enter') {\r\n if(!valid) {\r\n if(this.linkInput.classList.contains('error')) {\r\n this.linkInput.classList.remove('error');\r\n void this.linkInput.offsetLeft; // reflow\r\n }\r\n\r\n this.linkInput.classList.add('error');\r\n } else {\r\n this.applyLink(e);\r\n }\r\n }\r\n });\r\n\r\n this.linkInput.addEventListener('input', (e) => {\r\n const valid = this.isLinkValid();\r\n\r\n this.linkInput.classList.toggle('is-valid', valid);\r\n this.linkInput.classList.remove('error');\r\n });\r\n\r\n this.linkBackButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkBackButton click');\r\n cancelEvent(e);\r\n this.container.classList.remove('is-link');\r\n //input.value = '';\r\n this.resetSelection();\r\n this.setTooltipPosition();\r\n this.cancelClosening();\r\n });\r\n\r\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\r\n this.linkApplyButton.addEventListener('mousedown', (e) => {\r\n //this.log('linkApplyButton click');\r\n this.applyLink(e);\r\n });\r\n\r\n const applyDiv = document.createElement('div');\r\n applyDiv.classList.add('markup-tooltip-link-apply-container');\r\n \r\n const delimiter1 = document.createElement('span');\r\n const delimiter2 = document.createElement('span');\r\n const delimiter3 = document.createElement('span');\r\n delimiter1.classList.add('markup-tooltip-delimiter');\r\n delimiter2.classList.add('markup-tooltip-delimiter');\r\n delimiter3.classList.add('markup-tooltip-delimiter');\r\n tools1.insertBefore(delimiter1, this.buttons.link);\r\n applyDiv.append(delimiter3, this.linkApplyButton);\r\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\r\n //tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\r\n\r\n this.wrapper.append(tools1, tools2);\r\n this.container.append(this.wrapper);\r\n document.body.append(this.container);\r\n \r\n window.addEventListener('resize', () => {\r\n this.hide();\r\n });\r\n }\r\n\r\n public showLinkEditor() {\r\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\r\n this.show();\r\n }\r\n\r\n const button = this.buttons.link;\r\n this.container.classList.add('is-link');\r\n\r\n const selection = document.getSelection();\r\n this.savedRange = selection.getRangeAt(0);\r\n \r\n if(button.classList.contains('active')) {\r\n const startContainer = this.savedRange.startContainer;\r\n const anchor = startContainer.parentElement as HTMLAnchorElement;\r\n this.linkInput.value = anchor.href;\r\n } else {\r\n this.linkInput.value = '';\r\n }\r\n\r\n this.setTooltipPosition(true);\r\n\r\n setTimeout(() => {\r\n this.linkInput.focus(); // !!! instant focus will break animation\r\n }, 200);\r\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\r\n }\r\n\r\n private applyLink(e: Event) {\r\n cancelEvent(e);\r\n this.resetSelection();\r\n let url = this.linkInput.value;\r\n if(url && !RichTextProcessor.matchUrlProtocol(url)) {\r\n url = 'https://' + url;\r\n }\r\n this.appImManager.chat.input.applyMarkdown('link', url);\r\n setTimeout(() => {\r\n this.hide();\r\n }, 0);\r\n }\r\n\r\n private isLinkValid() {\r\n return !this.linkInput.value.length || !!RichTextProcessor.matchUrl(this.linkInput.value);\r\n }\r\n\r\n private resetSelection(range: Range = this.savedRange) {\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n this.appImManager.chat.input.messageInput.focus();\r\n }\r\n\r\n public hide() {\r\n //return;\r\n\r\n if(this.init) return;\r\n\r\n this.container.classList.remove('is-visible');\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n this.waitingForMouseUp = false;\r\n\r\n appNavigationController.removeByType('markup');\r\n\r\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hideTimeout = undefined;\r\n this.container.classList.add('hide');\r\n this.container.classList.remove('is-link');\r\n }, 200);\r\n }\r\n\r\n public getActiveMarkupButton() {\r\n const nodes = getSelectedNodes();\r\n const parents = [...new Set(nodes.map(node => node.parentNode))];\r\n //if(parents.length > 1 && parents) return [];\r\n\r\n const currentMarkups: Set = new Set();\r\n (parents as HTMLElement[]).forEach(node => {\r\n for(const type in markdownTags) {\r\n const tag = markdownTags[type as MarkdownType];\r\n const closest = node.closest(tag.match + ', [contenteditable]');\r\n if(closest !== this.appImManager.chat.input.messageInput) {\r\n currentMarkups.add(this.buttons[type as MarkdownType]);\r\n }\r\n }\r\n });\r\n \r\n\r\n return [...currentMarkups];\r\n }\r\n\r\n public setActiveMarkupButton() {\r\n const activeButtons = this.getActiveMarkupButton();\r\n\r\n for(const i in this.buttons) {\r\n // @ts-ignore\r\n const button = this.buttons[i];\r\n button.classList.toggle('active', activeButtons.includes(button));\r\n }\r\n }\r\n\r\n private setTooltipPosition(isLinkToggle = false) {\r\n const selection = document.getSelection();\r\n const range = selection.getRangeAt(0);\r\n\r\n const bodyRect = document.body.getBoundingClientRect();\r\n const selectionRect = range.getBoundingClientRect();\r\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\r\n\r\n this.container.style.maxWidth = inputRect.width + 'px';\r\n\r\n const selectionTop = selectionRect.top + (bodyRect.top * -1);\r\n \r\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\r\n\r\n const sizesRect = currentTools.getBoundingClientRect();\r\n const top = selectionTop - sizesRect.height - 8;\r\n \r\n const minX = inputRect.left;\r\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\r\n let left: number;\r\n if(isLinkToggle) {\r\n const containerRect = this.container.getBoundingClientRect();\r\n left = clamp(containerRect.left, minX, maxX);\r\n } else {\r\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\r\n left = clamp(x, minX, maxX);\r\n }\r\n\r\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\r\n\r\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\r\n \r\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\r\n }\r\n\r\n public show() {\r\n if(this.init) {\r\n this.init();\r\n this.init = null;\r\n }\r\n\r\n if(isSelectionEmpty()) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(this.hideTimeout !== undefined) {\r\n clearTimeout(this.hideTimeout);\r\n }\r\n\r\n if(this.container.classList.contains('is-visible')) {\r\n return;\r\n }\r\n\r\n this.setActiveMarkupButton();\r\n \r\n this.container.classList.remove('is-link');\r\n const isFirstShow = this.container.classList.contains('hide');\r\n if(isFirstShow) {\r\n this.container.classList.remove('hide');\r\n this.container.classList.add('no-transition');\r\n }\r\n \r\n this.setTooltipPosition();\r\n \r\n if(isFirstShow) {\r\n void this.container.offsetLeft; // reflow\r\n this.container.classList.remove('no-transition');\r\n }\r\n \r\n this.container.classList.add('is-visible');\r\n\r\n if(!IS_MOBILE) {\r\n appNavigationController.pushItem({\r\n type: 'markup',\r\n onPop: () => {\r\n this.hide();\r\n }\r\n });\r\n }\r\n\r\n //this.log('selection', selectionRect, activeButton);\r\n }\r\n\r\n /* private onMouseUp = (e: Event) => {\r\n this.log('onMouseUp');\r\n if(findUpClassName(e.target, 'markup-tooltip')) return;\r\n\r\n this.hide();\r\n //document.removeEventListener('mouseup', this.onMouseUp);\r\n }; */\r\n\r\n private onMouseUpSingle = (e: Event) => {\r\n //this.log('onMouseUpSingle');\r\n this.waitingForMouseUp = false;\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n cancelEvent(e);\r\n if(this.mouseUpCounter++ === 0) {\r\n this.resetSelection(this.savedRange);\r\n } else {\r\n this.hide();\r\n return;\r\n }\r\n }\r\n\r\n this.show();\r\n\r\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\r\n };\r\n\r\n public setMouseUpEvent() {\r\n if(this.waitingForMouseUp) return;\r\n this.waitingForMouseUp = true;\r\n\r\n //this.log('setMouseUpEvent');\r\n\r\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\r\n }\r\n\r\n public cancelClosening() {\r\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\r\n document.removeEventListener('mouseup', this.onMouseUpSingle);\r\n document.addEventListener('mouseup', (e) => {\r\n cancelEvent(e);\r\n this.mouseUpCounter = 1;\r\n this.waitingForMouseUp = false;\r\n this.setMouseUpEvent();\r\n }, {once: true});\r\n }\r\n }\r\n\r\n public handleSelection() {\r\n if(this.addedListener) return;\r\n this.addedListener = true;\r\n document.addEventListener('selectionchange', (e) => {\r\n //this.log('selectionchange');\r\n\r\n if(document.activeElement === this.linkInput) {\r\n return;\r\n }\r\n\r\n if(document.activeElement !== this.appImManager.chat.input.messageInput) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n const selection = document.getSelection();\r\n if(isSelectionEmpty(selection)) {\r\n this.hide();\r\n return;\r\n }\r\n\r\n if(IS_TOUCH_SUPPORTED) {\r\n if(IS_APPLE) {\r\n this.show();\r\n this.setTooltipPosition(); // * because can skip this in .show();\r\n } else {\r\n if(this.mouseUpCounter === 2) {\r\n this.mouseUpCounter = 0;\r\n return;\r\n }\r\n\r\n this.savedRange = selection.getRangeAt(0);\r\n this.setMouseUpEvent();\r\n /* document.addEventListener('touchend', (e) => {\r\n cancelEvent(e);\r\n this.resetSelection(range);\r\n this.show();\r\n }, {once: true, passive: false}); */\r\n }\r\n } else {\r\n this.setMouseUpEvent();\r\n }\r\n });\r\n }\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function getSelectedNodes() {\r\n const nodes: Node[] = [];\r\n const selection = window.getSelection();\r\n for(let i = 0; i < selection.rangeCount; ++i) {\r\n const range = selection.getRangeAt(i);\r\n let {startContainer, endContainer} = range;\r\n if(endContainer.nodeType !== 3) endContainer = endContainer.firstChild;\r\n \r\n while(startContainer && startContainer !== endContainer) {\r\n nodes.push(startContainer.nodeType === 3 ? startContainer : startContainer.firstChild);\r\n startContainer = startContainer.nextSibling;\r\n }\r\n \r\n if(nodes[nodes.length - 1] !== endContainer) {\r\n nodes.push(endContainer);\r\n }\r\n }\r\n\r\n // * filter null's due to
\r\n return nodes.filter(node => !!node);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// generate a path's arc data parameter\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\r\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\r\n return [rx, ',', ry, ' ',\r\n xAxisRotation, ' ',\r\n largeArcFlag, ',',\r\n sweepFlag, ' ',\r\n x, ',', y ].join('');\r\n}\r\n\r\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\r\n const data: string[] = [];\r\n\r\n // start point in top-middle of the rectangle\r\n data.push('M' + (x + width / 2) + ',' + y);\r\n\r\n // next we go to the right\r\n data.push('H' + (x + width - tr));\r\n\r\n if(tr > 0) {\r\n // now we draw the arc in the top-right corner\r\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\r\n }\r\n\r\n // next we go down\r\n data.push('V' + (y + height - br));\r\n\r\n if(br > 0) {\r\n // now we draw the arc in the lower-right corner\r\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\r\n }\r\n\r\n // now we go to the left\r\n data.push('H' + (x + bl));\r\n\r\n if(bl > 0) {\r\n // now we draw the arc in the lower-left corner\r\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\r\n }\r\n\r\n // next we go up\r\n data.push('V' + (y + tl));\r\n\r\n if(tl > 0) {\r\n // now we draw the arc in the top-left corner\r\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\r\n }\r\n\r\n // and we close the path\r\n data.push('Z');\r\n\r\n return data.join(' ');\r\n}\r\n\r\nMOUNT_CLASS_TO.generatePathData = generatePathData;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport generatePathData from \"../../helpers/generatePathData\";\r\nimport { FormatterArguments, i18n, LangPackKey } from \"../../lib/langPack\";\r\n\r\nexport default class ChatDragAndDrop {\r\n container: HTMLDivElement;\r\n svg: SVGSVGElement;\r\n outlineWrapper: HTMLDivElement;\r\n path: SVGPathElement;\r\n\r\n constructor(appendTo: HTMLElement, private options: {\r\n icon?: string,\r\n header: LangPackKey,\r\n headerArgs?: FormatterArguments,\r\n subtitle?: LangPackKey,\r\n onDrop: (e: DragEvent) => void\r\n }) {\r\n this.container = document.createElement('div');\r\n this.container.classList.add('drop', 'z-depth-1');\r\n\r\n this.outlineWrapper = document.createElement('div');\r\n this.outlineWrapper.classList.add('drop-outline-wrapper');\r\n\r\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n this.svg.classList.add('drop-outline');\r\n\r\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\r\n this.path.classList.add('drop-outline-path');\r\n\r\n let dropIcon: HTMLElement;\r\n if(options.icon) {\r\n dropIcon = document.createElement('div');\r\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\r\n }\r\n\r\n const dropHeader = document.createElement('div');\r\n dropHeader.classList.add('drop-header');\r\n dropHeader.append(i18n(options.header, options.headerArgs));\r\n\r\n let dropSubtitle: HTMLElement;\r\n if(options.subtitle) {\r\n dropSubtitle = document.createElement('div');\r\n dropSubtitle.classList.add('drop-subtitle');\r\n dropSubtitle.append(i18n(options.subtitle));\r\n }\r\n\r\n this.svg.append(this.path);\r\n this.outlineWrapper.append(this.svg);\r\n\r\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\r\n appendTo.append(this.container);\r\n\r\n this.container.addEventListener('dragover', this.onDragOver);\r\n this.container.addEventListener('dragleave', this.onDragLeave);\r\n this.container.addEventListener('drop', this.onDrop);\r\n }\r\n\r\n onDragOver = (e: DragEvent) => {\r\n this.container.classList.add('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', true, 500);\r\n };\r\n\r\n onDragLeave = (e: DragEvent) => {\r\n this.container.classList.remove('is-dragover');\r\n //SetTransition(this.container, 'is-dragover', false, 500);\r\n };\r\n\r\n onDrop = (e: DragEvent) => {\r\n this.options.onDrop(e);\r\n };\r\n\r\n destroy() {\r\n delete this.options;\r\n this.container.remove();\r\n this.container.removeEventListener('dragover', this.onDragOver);\r\n this.container.removeEventListener('dragleave', this.onDragLeave);\r\n this.container.removeEventListener('drop', this.onDrop);\r\n }\r\n\r\n setPath() {\r\n const rect = this.outlineWrapper.getBoundingClientRect();\r\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\r\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\r\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\r\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\r\n\r\n const radius = 10;\r\n //const strokeWidth = 2;\r\n const sizeX = rect.width - radius;\r\n const sizeY = rect.height - radius;\r\n const pos = radius / 2;\r\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\r\n this.path.setAttributeNS(null, 'd', d);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { doubleRaf } from \"../schedulers\";\r\n\r\nexport default function disableTransition(elements: HTMLElement[]) {\r\n elements.forEach(el => el.classList.add('no-transition'));\r\n\r\n doubleRaf().then(() => {\r\n elements.forEach(el => el.classList.remove('no-transition'));\r\n });\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n \n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n \n this.N = n;\n this.radius = new Array(n + 1);\n \n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n \n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n \n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n \n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n \n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n \n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n \n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n \n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n \n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n \n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n \n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n \n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n \n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n \n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n \n return gradient;\n }\n \n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n \n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n \n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n \n private mounted: boolean;\n private media: MediaQueryList;\n \n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n \n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n \n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n \n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)],\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n \n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n \n this.setSize();\n this.forceUpdate();\n \n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n \n this.draw();\n }\n \n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n \n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n \n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n \n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n \n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n \n this.forceUpdate();\n this.invokeDraw();\n }\n \n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n \n public handleBlur = () => {\n this.focused = false;\n }\n \n private invokeDraw = () => {\n if(this.raf) return;\n \n this.draw();\n }\n \n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n \n // console.log('[top] draw', [focused, resizing, this.mounted]);\n \n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n \n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n \n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n \n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n \n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n \n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n \n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n \n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n \n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n \n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n \n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n \n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n \n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n \n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n \n if(currentState?.stateId === stateId) {\n return;\n }\n \n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n \n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n \n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from \"../../lib/rootScope\";\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(let i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\nimport rootScope from \"../rootScope\";\nimport lottieLoader, { LottieAssetName } from \"./lottieLoader\";\nimport type RLottiePlayer from \"./rlottiePlayer\";\nimport { RLottieColor } from \"./rlottiePlayer\";\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n \n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map(options => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then(player => {\n return lottieLoader.waitForFirstFrame(player);\n }).then(player => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find(part => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n \n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame, \n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n \n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from \"../helpers/noop\";\nimport { safeAssign } from \"../helpers/object\";\nimport { LottieAssetName } from \"../lib/rlottie/lottieLoader\";\nimport RLottieIcon, { RLottieIconItemPartOptions, RLottieIconItemPart } from \"../lib/rlottie/rlottieIcon\";\nimport { RLottieColor } from \"../lib/rlottie/rlottiePlayer\";\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map(item => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined && this.getColor) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state) {\n return false;\n }\n\n this.colorState = state;\n \n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n \n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach(item => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RLottieIconItemPartOptions } from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_MICROPHONE_BUTTON_STATE } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from \"../../lib/rlottie/rlottieIcon\";\nimport { GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier } from \".\";\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, \n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from \"../popups\";\nimport { hexToRgb } from \"../../helpers/color\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport customProperties from \"../../helpers/dom/customProperties\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { GroupCall, GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport { RLottieColor } from \"../../lib/rlottie/rlottiePlayer\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonIcon from \"../buttonIcon\";\nimport GroupCallMicrophoneIcon from \"./microphoneIcon\";\nimport GroupCallParticipantsElement from \"./participants\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\nimport PopupPeer from \"../popups/peer\";\nimport GroupCallDescriptionElement from \"./description\";\nimport GroupCallTitleElement from \"./title\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../../helpers/dom/fullScreen\";\nimport Scrollable from \"../scrollable\";\nimport { MovableState } from \"../movableElement\";\nimport animationIntersector from \"../animationIntersector\";\nimport { IS_APPLE_MOBILE } from \"../../environment/userAgent\";\nimport toggleDisability from \"../../helpers/dom/toggleDisability\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport IS_SCREEN_SHARING_SUPPORTED from \"../../environment/screenSharingSupport\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport makeButton from \"../call/button\";\nimport MovablePanel from \"../../helpers/movablePanel\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let color: RLottieColor, colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n color = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private appChatsManager: AppChatsManager;\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor(options: {\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n }) {\n super('popup-group-call', undefined, {\n body: true,\n withoutOverlay: true,\n closable: true\n });\n\n safeAssign(this, options);\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = this.appGroupCallsManager.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n \n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n \n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n \n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n ...options\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n ...options\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') || \n findUpClassName(target, 'group-call-button') || \n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private onVideoClick = () => {\n const toggle = toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n \n private onLeaveClick = () => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(this.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true,\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n rootScope.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach(element => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach(element => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { i18n } from \"../../lib/langPack\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport { GROUP_CALL_PARTICIPANT_MUTED_STATE } from \".\";\nimport { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter(type => !!participant[type]).map(type => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, RichTextProcessor.wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n \n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport { fastRaf } from \"../../helpers/schedulers\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport appDialogsManager, { DialogDom, AppDialogsManager } from \"../../lib/appManagers/appDialogsManager\";\nimport { LazyLoadQueueIntersector } from \"../lazyLoadQueue\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport type GroupCallInstance from \"../../lib/calls/groupCallInstance\";\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n participant: GroupCallParticipant,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n \n protected lazyLoadQueue: LazyLoadQueueIntersector;\n protected avatarSize = 54;\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: (element) => element.participant.date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: (element) => {\n const {participant} = element;\n\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n dialog: base.id,\n container: false,\n drawStatus: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const participant = instance.participants.get(base.id);\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n \n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n\n (base as SortedParticipant).dom = dom;\n (base as SortedParticipant).participant = participant;\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport { i18n } from \"../../lib/langPack\";\nimport PeerTitle from \"../peerTitle\";\nimport { getGroupCallParticipantMutedState } from \".\";\nimport GroupCallParticipantMutedIcon from \"./participantMutedIcon\";\nimport GroupCallParticipantStatusElement from \"./participantStatus\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport callVideoCanvasBlur from \"../call/videoCanvasBlur\";\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private appPeersManager: AppPeersManager, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n \n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n \n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n \n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n \n this.container.append(this.header);\n // }\n \n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: this.appPeersManager.getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n \n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../../helpers/animation\";\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ControlsHover from \"../../helpers/dom/controlsHover\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { safeAssign } from \"../../helpers/object\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport { AppGroupCallsManager, GroupCallOutputSource } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport GroupCallParticipantVideoElement, { GroupCallParticipantVideoType } from \"./participantVideo\";\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange']\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n \n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return; \n }\n \n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some(type => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach(type => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.appPeersManager, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n \n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n \n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public setInstance(instance: GroupCallInstance) {\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from \".\";\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\nimport { addFullScreenListener, isFullScreen } from \"../../helpers/dom/fullScreen\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport noop from \"../../helpers/noop\";\nimport { safeAssign } from \"../../helpers/object\";\nimport ScrollableLoader from \"../../helpers/scrollableLoader\";\nimport { GroupCallParticipant } from \"../../layer\";\nimport type { AppChatsManager } from \"../../lib/appManagers/appChatsManager\";\nimport type { AppGroupCallsManager } from \"../../lib/appManagers/appGroupCallsManager\";\nimport type { AppPeersManager } from \"../../lib/appManagers/appPeersManager\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport rootScope from \"../../lib/rootScope\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"../buttonMenu\";\nimport confirmationPopup from \"../confirmationPopup\";\nimport { attachContextMenuListener, closeBtnMenu, openBtnMenu, positionMenu } from \"../misc\";\nimport PeerTitle from \"../peerTitle\";\nimport PopupElement from \"../popups\";\nimport Scrollable from \"../scrollable\";\nimport GroupCallParticipantsList from \"./participantsList\";\nimport GroupCallParticipantsVideoElement from \"./participantVideos\";\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean})[];\n private element: HTMLDivElement;\n private appChatsManager: AppChatsManager;\n private appPeersManager: AppPeersManager;\n private appGroupCallsManager: AppGroupCallsManager;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n appChatsManager: AppChatsManager,\n appPeersManager: AppPeersManager,\n appGroupCallsManager: AppGroupCallsManager,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: () => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: this.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.appChatsManager = options.appChatsManager;\n this.appPeersManager = options.appPeersManager;\n this.appGroupCallsManager = options.appGroupCallsManager;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n \n this.element = ButtonMenu(this.buttons, listenerSetter);\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, (e: any) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = this.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n this.buttons.forEach(button => {\n button.element.classList.toggle('hide', !button.verify(peerId));\n });\n \n cancelEvent(e);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n closeBtnMenu();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? (PopupElement.getPopup(PopupGroupCall) as PopupGroupCall).getContainer(): document.body;\n\n if(!isFull) {\n closeBtnMenu();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopup(PopupGroupCall);\n if(popup) {\n popup.hide();\n }\n\n rootScope.dispatchEvent('history_focus', {\n peerId: this.targetPeerId\n });\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.appGroupCallsManager.editParticipant(this.instance.id, this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private appGroupCallsManager: AppGroupCallsManager;\n private appPeersManager: AppPeersManager;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private appChatsManager: AppChatsManager;\n\n constructor(options: {\n appendTo: HTMLElement,\n appGroupCallsManager: AppGroupCallsManager,\n appPeersManager: AppPeersManager,\n appChatsManager: AppChatsManager,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n \n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach(participant => {\n this.updateParticipant(participant);\n });\n \n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = this.appPeersManager.getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n instance.participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n \n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../../lib/calls/groupCallState\";\nimport I18n, { LangPackKey, FormatterArguments } from \"../../lib/langPack\";\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from \"../../helpers/dom/setInnerHTML\";\nimport { GroupCall } from \"../../layer\";\nimport GroupCallInstance from \"../../lib/calls/groupCallInstance\";\nimport RichTextProcessor from \"../../lib/richtextprocessor\";\nimport PeerTitle from \"../peerTitle\";\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, RichTextProcessor.wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.peerId !== peerId) {\n peerTitle.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n } \n }\n}\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../../helpers/listenerSetter\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\nimport { ripple } from \"../ripple\";\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { clamp } from \"../helpers/number\";\nimport { safeAssign } from \"../helpers/object\";\nimport windowSize from \"../helpers/windowSize\";\nimport SwipeHandler from \"./swipeHandler\";\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: (e: TouchEvent | MouseEvent) => boolean;\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n \n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n \n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach(handler => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map(side => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1; // to right will be positive\n yDiff *= -1; // to bottom will be positive\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, { MovableElementOptions, MovableState } from \"../components/movableElement\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport ListenerSetter from \"./listenerSetter\";\nimport mediaSizes, { ScreenSize } from \"./mediaSizes\";\nimport { safeAssign } from \"./object\";\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n \n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n \n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n \n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport CALL_STATE from \"../../lib/calls/callState\";\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = ('' + instance.duration).toHHMMSS(true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { SuperRLottieIcon } from \"../superIcon\";\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport type { AppGroupCallsManager } from \"../lib/appManagers/appGroupCallsManager\";\nimport GROUP_CALL_STATE from \"../lib/calls/groupCallState\";\nimport rootScope from \"../lib/rootScope\";\nimport ButtonIcon from \"./buttonIcon\";\nimport TopbarWeave from \"./topbarWeave\";\nimport SetTransition from \"./singleTransition\";\nimport PopupGroupCall from \"./groupCall\";\nimport type { AppPeersManager } from \"../lib/appManagers/appPeersManager\";\nimport type { AppChatsManager } from \"../lib/appManagers/appChatsManager\";\nimport GroupCallDescriptionElement from \"./groupCall/description\";\nimport GroupCallTitleElement from \"./groupCall/title\";\nimport PopupElement from \"./popups\";\nimport throttle from \"../helpers/schedulers/throttle\";\nimport GroupCallInstance from \"../lib/calls/groupCallInstance\";\nimport CALL_STATE from \"../lib/calls/callState\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport CallDescriptionElement from \"./call/description\";\n// import PopupCall from \"./call\";\nimport type { AppAvatarsManager } from \"../lib/appManagers/appAvatarsManager\";\nimport GroupCallMicrophoneIconMini from \"./groupCall/microphoneIconMini\";\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n \n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n \n constructor(\n private appGroupCallsManager: AppGroupCallsManager,\n private appPeersManager: AppPeersManager,\n private appChatsManager: AppChatsManager,\n private appAvatarsManager: AppAvatarsManager,\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(rootScope)('call_instance', ({instance, hasCurrent}) => {\n if(!hasCurrent) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_instance', (instance) => {\n this.updateInstance(instance);\n });\n \n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = this.appGroupCallsManager.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(rootScope)('group_call_amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n \n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n if(this.instance !== instance) {\n this.clearCurrentInstance();\n \n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n }\n\n const isMuted = this.instance.isMuted;\n let state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n \n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if(!document.body.classList.contains('is-calling') || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition(document.body, 'is-calling', !isClosed, 250, isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n }: undefined);\n }\n \n if(isClosed) {\n return;\n }\n \n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n \n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n \n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n \n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n \n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n \n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n \n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n \n const end = ButtonIcon('endcall_filled');\n right.append(end);\n \n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopup(PopupGroupCall)) {\n return;\n }\n \n new PopupGroupCall({\n appGroupCallsManager: this.appGroupCallsManager,\n appPeersManager: this.appPeersManager,\n appChatsManager: this.appChatsManager\n }).show();\n }/* else if(this.instance instanceof CallInstance) {\n new PopupCall({\n appAvatarsManager: this.appAvatarsManager,\n appPeersManager: this.appPeersManager,\n instance: this.instance\n }).show();\n } */\n }, {listenerSetter});\n \n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n \n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport animationIntersector from '../../components/animationIntersector';\nimport appSidebarLeft, { LEFT_COLUMN_ACTIVE_CLASSNAME } from \"../../components/sidebarLeft\";\nimport appSidebarRight, { RIGHT_COLUMN_ACTIVE_CLASSNAME } from '../../components/sidebarRight';\nimport mediaSizes, { ScreenSize } from '../../helpers/mediaSizes';\nimport { logger, LogTypes } from \"../logger\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport apiUpdatesManager from './apiUpdatesManager';\nimport appUsersManager from \"./appUsersManager\";\nimport Chat, { ChatType } from '../../components/chat/chat';\nimport appChatsManager from './appChatsManager';\nimport appDocsManager from './appDocsManager';\nimport appInlineBotsManager from './appInlineBotsManager';\nimport appMessagesManager from './appMessagesManager';\nimport appPeersManager from './appPeersManager';\nimport appPhotosManager from './appPhotosManager';\nimport appProfileManager from './appProfileManager';\nimport appStickersManager from './appStickersManager';\nimport appWebPagesManager from './appWebPagesManager';\nimport PopupNewMedia, { getCurrentNewMediaPopup } from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport { IS_TOUCH_SUPPORTED } from '../../environment/touchSupport';\nimport appPollsManager from './appPollsManager';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport { doubleRaf } from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, { dispatchHeavyAnimationEvent } from '../../hooks/useHeavyAnimationCheck';\nimport appDraftsManager from './appDraftsManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport stateStorage from '../stateStorage';\nimport appDownloadManager from './appDownloadManager';\nimport { AppStateManager } from './appStateManager';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport appNotificationsManager from './appNotificationsManager';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, { i18n, join, LangPackKey } from '../langPack';\nimport { ChatInvite, Dialog, Message, SendMessageAction } from '../../layer';\nimport { hslaStringToHex } from '../../helpers/color';\nimport { copy, getObjectKeysAndSort } from '../../helpers/object';\nimport { getFilesFromEvent } from '../../helpers/files';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer from '../../components/popups/peer';\nimport { SliceEnd } from '../../helpers/slicedArray';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport { cancelEvent } from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport appEmojiManager from './appEmojiManager';\nimport PopupElement from '../../components/popups';\nimport singleInstance from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport { toast, toastNew } from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport { pause } from '../../helpers/schedulers/pause';\nimport appMessagesIdsManager from './appMessagesIdsManager';\nimport { InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE } from './internalLink';\nimport RichTextProcessor from '../richtextprocessor';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport { NULL_PEER_ID } from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport { ONE_DAY } from '../../helpers/date';\nimport { numberThousandSplitter } from '../../helpers/number';\nimport appGroupCallsManager, { GroupCallId, MyGroupCall } from './appGroupCallsManager';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport appAvatarsManager from './appAvatarsManager';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport { CallType } from '../calls/types';\nimport { Modify, SendMessageEmojiInteractionData } from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport { simulateClickEvent } from '../../helpers/dom/clickEvent';\n\n//console.log('appImManager included33!');\n\nappSidebarLeft; // just to include\n\nexport const CHAT_ANIMATION_GROUP = 'chat';\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\n\nexport type ChatSavedPosition = {\n mids: number[], \n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId?: PeerId, \n lastMsgId?: number, \n threadId?: number,\n startParam?: string\n};\n\nexport type ChatSetInnerPeerOptions = Modify & {\n type?: ChatType\n};\n\nexport class AppImManager {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n \n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n \n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise} = {};\n \n private topbarCall: TopbarCall;\n emojiAnimationContainer: HTMLDivElement;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n constructor() {\n apiUpdatesManager.attach();\n appNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.selectTab(0);\n \n window.addEventListener('blur', () => {\n animationIntersector.checkAnimations(true);\n \n this.offline = rootScope.idle.isIDLE = true;\n this.updateStatus();\n clearInterval(this.updateStatusInterval);\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n \n window.addEventListener('focus', () => {\n this.offline = rootScope.idle.isIDLE = false;\n this.updateStatus();\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n \n // в обратном порядке\n animationIntersector.checkAnimations(false);\n\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n this.updateStatus();\n\n this.offline = rootScope.idle.isIDLE = false;\n rootScope.dispatchEvent('idle', rootScope.idle.isIDLE);\n }, {once: true, passive: true});\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n \n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n //window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup('');\n animationIntersector.checkAnimations(false);\n });\n\n this.applyCurrentTheme();\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) \n && document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n rootScope.addEventListener('history_focus', (e) => {\n let {peerId, threadId, mid, startParam} = e;\n if(threadId) threadId = appMessagesIdsManager.generateMessageId(threadId);\n if(mid) mid = appMessagesIdsManager.generateMessageId(mid); // because mid can come from notification, i.e. server message id\n \n this.setInnerPeer({\n peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId,\n startParam\n });\n });\n\n rootScope.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat || \n chat.peerId !== peerId || \n rootScope.overlaysActive || (\n mediaSizes.activeScreen === ScreenSize.mobile && \n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find(typing => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[appMessagesIdsManager.generateMessageId(typing.action.msg_id)];\n if(bubble && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach(a => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n \n appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n rootScope.addEventListener('instance_deactivated', () => {\n const popup = new PopupElement('popup-instance-deactivated', undefined, {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n('Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n('Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n (popup as any).onClose = () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.show();\n });\n\n stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', c || {});\n });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(appGroupCallsManager, appPeersManager, appChatsManager, appAvatarsManager);\n }\n\n /* if(IS_CALL_SUPPORTED) {\n rootScope.addEventListener('call_instance', ({instance, hasCurrent}) => {\n if(hasCurrent) {\n return;\n }\n \n new PopupCall({\n appAvatarsManager,\n appCallsManager,\n appPeersManager,\n instance\n }).show();\n });\n } */\n\n // ! do not remove this line \n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n this.addAnchorListener<{}>({\n name: 'showMaskedAlert', \n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n },\n }]\n }).show();\n }\n });\n\n this.addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand', \n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then(peerId => {\n appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n //console.log(command, bot);\n }\n });\n\n this.addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag', \n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n this.addAnchorListener<{pathnameParams: ['addstickers', string]}>({\n name: 'addstickers', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n this.addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat', \n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n this.addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n this.addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}) => {\n let link: InternalLink;\n if(pathnameParams[0] === 'c') {\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[1],\n post: pathnameParams[2],\n thread: 'thread' in uriParams && uriParams.thread,\n comment: uriParams.comment\n };\n } else {\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[1],\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}) => {\n let link: InternalLink;\n if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, uriParams);\n }\n\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n this.addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name: 'addstickers',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.STICKER_SET, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach(name => {\n this.addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange();\n this.attachKeydownListener();\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(rootScope.isOverlayActive || IGNORE_KEYS.has(key)) return;\n \n const target = e.target as HTMLElement;\n \n //if(target.tagName === 'INPUT') return;\n \n //this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n const folder = appMessagesManager.dialogsStorage.getFolderDialogs(rootScope.filterId, true);\n let nextDialog: Dialog.dialog;\n if(!rootScope.peerId) {\n if(key === 'ArrowDown') {\n nextDialog = folder[0];\n }\n } else {\n const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);\n if(idx !== -1) {\n const nextIndex = key === 'ArrowUp' ? idx - 1 : idx + 1;\n nextDialog = folder[nextIndex];\n }\n }\n \n if(nextDialog) {\n this.setPeer({peerId: nextDialog.peerId});\n }\n } else if(key === 'ArrowUp') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMid: number;\n for(const mid of slice) {\n const message = chat.getMessage(mid);\n const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;\n\n if(good) {\n if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {\n goodMid = mid;\n break;\n }\n\n // * this check will allow editing only last message\n //break;\n }\n }\n \n if(goodMid) {\n chat.input.initMessageEditing(goodMid);\n cancelEvent(e); // * prevent from scrolling\n }\n }\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n \n if(\n chat?.input?.messageInput && \n e.target !== chat.input.messageInput && \n target.tagName !== 'INPUT' && \n !target.hasAttribute('contenteditable') && \n !IS_TOUCH_SUPPORTED && \n (!mediaSizes.isMobile || this.tabId === 1) && \n !chat.selection.isSelecting && \n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n \n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? appMessagesIdsManager.generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? appMessagesIdsManager.generateMessageId(+link.comment) : undefined;\n\n this.openUsername({\n userName: link.domain, \n lastMsgId: postId, \n commentId,\n startParam: link.start\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = appChatsManager.getChat(chatId);\n if(chat.deleted) {\n try {\n await appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = appMessagesIdsManager.generateMessageId(+link.post);\n const threadId = link.thread ? appMessagesIdsManager.generateMessageId(+link.thread) : undefined;\n\n if(threadId) this.openThread(peerId, postId, threadId);\n else this.setInnerPeer({\n peerId,\n lastMsgId: postId,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n apiManager.invokeApi('messages.checkChatInvite', {\n hash: link.invite\n }).then(chatInvite => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite).show();\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n \n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n private addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join', \n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any, \n noPathnameParams?: boolean,\n noUriParams?: boolean\n }) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n cancelEvent(null);\n\n const href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n if(!options.noPathnameParams) pathnameParams = new URL(element.href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = this.parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n }\n\n private parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach(item => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n }\n\n private onHashChange = () => {\n const hash = location.hash;\n const splitted = hash.split('?');\n\n const params = this.parseUriParams(hash, splitted);\n\n this.log('hashchange', hash, splitted[0], params);\n\n if(params.tgaddr) {\n appNavigationController.replaceState();\n const {onclick} = RichTextProcessor.wrapUrl(params.tgaddr);\n if(onclick) {\n const a = document.createElement('a');\n a.href = params.tgaddr;\n (window as any)[onclick](a);\n }\n return;\n }\n\n switch(splitted[0]) {\n case '#/im': {\n const p: string = params.p;\n let postId = params.post !== undefined ? appMessagesIdsManager.generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p, \n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(), \n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n //appNavigationController.replaceState();\n //location.hash = '';\n };\n\n public openUsername(options: {\n userName: string, \n lastMsgId?: number, \n threadId?: number, \n commentId?: number,\n startParam?: string\n }) {\n const {userName, lastMsgId, threadId, commentId, startParam} = options;\n return appUsersManager.resolveUsername(userName).then(peer => {\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n if(threadId) {\n return this.openThread(peerId, lastMsgId, threadId);\n } else if(commentId) {\n return this.openComment(peerId, lastMsgId, commentId);\n }\n \n return this.setInnerPeer({\n peerId,\n lastMsgId,\n startParam: startParam\n });\n }, (err) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public openThread(peerId: PeerId, lastMsgId: number, threadId: number) {\n return appMessagesManager.wrapSingleMessage(peerId, threadId).then(() => {\n const message: Message = appMessagesManager.getMessageByPeer(peerId, threadId);\n if(message._ === 'messageEmpty') {\n lastMsgId = undefined;\n } else {\n appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n peerId,\n lastMsgId,\n threadId,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(peerId: PeerId, msgId: number, commentId: number) {\n return appMessagesManager.getDiscussionMessage(peerId, msgId).then(message => {\n return this.openThread(message.peerId, commentId, message.mid);\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n /* const call = appCallsManager.getCallByUserId(userId);\n if(call) {\n return;\n }\n \n const userFull = await appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [new PeerTitle({peerId: userId.toPeerId()}).element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n appCallsManager.startCallInternal(userId, type === 'video'); */\n }\n\n private discardCurrentCall(toPeerId: PeerId) {\n /* if(appCallsManager.currentCall) return this.discardCallConfirmation(toPeerId);\n else if(appGroupCallsManager.groupCall) return this.discardGroupCallConfirmation(toPeerId);\n else return Promise.resolve(); */\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n /* const currentCall = appCallsManager.currentCall;\n if(currentCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appCallsManager.currentCall === currentCall) {\n await currentCall.hangUp();\n }\n } */\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = appGroupCallsManager.groupCall;\n if(currentGroupCall) {\n await confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [\n new PeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}).element, \n new PeerTitle({peerId: toPeerId}).element\n ],\n button: {\n langKey: 'OK'\n }\n });\n\n if(appGroupCallsManager.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n \n call = await appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = appGroupCallsManager.saveGroupCall(chatFull.call, chatId);\n }\n \n appGroupCallsManager.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false) {\n const theme = rootScope.getTheme();\n\n if(theme.background.type === 'image' || (theme.background.type === 'default' && theme.background.slug)) {\n const defaultTheme = AppStateManager.STATE_INIT.settings.themes.find(t => t.name === theme.name);\n const isDefaultBackground = theme.background.blur === defaultTheme.background.blur && \n theme.background.slug === defaultTheme.background.slug;\n\n if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setBackground('', true);\n });\n }\n }\n \n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = appDownloadManager.cacheStorage.getFile('backgrounds/' + slug).then(blob => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n const promises = this.chats.map(chat => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n //const bubble = chat.bubbles.getBubbleByPoint('top');\n //if(bubble) {\n //const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const top = chatBubbles.scrollable.scrollTop;\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && Object.keys(chatBubbles.bubbles).length) {\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc'),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n //}\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n \n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = rootScope.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n rootScope.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n this.applyHighlightningColor();\n\n rootScope.setTheme();\n\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n \n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n document.documentElement.style.setProperty('--messages-text-size', rootScope.settings.messagesTextSize + 'px');\n \n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n if(topbar.pinnedMessage) { // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n topbar.pinnedMessage.setCorrectIndex(0);\n }\n\n apiManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations(false);\n \n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n \n I18n.setTimeFormat(rootScope.settings.timeFormat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом \n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) { \n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat', \n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n \n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n //if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n //}\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!isFiles || (!this.canDrag() && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const types: string[] = await getFilesFromEvent(e, true);\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n \n const foundMedia = types.filter(t => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n \n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'document');\n }\n }));\n }\n \n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n appImManager.log('drop', e);\n appImManager.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n //if(!mount) return;\n\n SetTransition(_dropsContainer, 'is-visible', mount, 200, () => {\n if(!mount) {\n _drops.forEach(drop => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n });\n\n if(mount) {\n _drops.forEach(drop => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n //this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n //this.log('dragleave', e, counter);\n //if((e.pageX <= 0 || e.pageX >= appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) { \n //if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || rootScope.isOverlayActive || !chat.canSend('send_media'));\n }\n\n private onDocumentPaste = (e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n if(!this.canDrag() && !newMediaPopup) return;\n\n //console.log('document paste');\n //console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n \n getFilesFromEvent(e).then((files: File[]) => {\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n \n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n new PopupNewMedia(this.chat, files, chatInput.willAttachType);\n }\n });\n };\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(prevTabId !== -1 && prevTabId !== id && rootScope.settings.animationsEnabled && animate !== false) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im', \n onPop: (canAnimate) => {\n //this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n rootScope.dispatchEvent('im_tab_change', id);\n\n //this._selectTab(id, mediaSizes.isMobile);\n //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n \n public updateStatus() {\n if(!this.myId) return Promise.resolve();\n \n appUsersManager.setUserStatus(this.myId, this.offline);\n return apiManager.invokeApiSingle('account.updateStatus', {offline: this.offline});\n }\n\n private createNewChat() {\n const chat = new Chat(this, \n appChatsManager, \n appDocsManager, \n appInlineBotsManager, \n appMessagesManager, \n appPeersManager, \n appPhotosManager, \n appProfileManager, \n appStickersManager, \n appUsersManager, \n appWebPagesManager, \n appPollsManager, \n apiManager, \n appDraftsManager, \n serverTimeManager, \n stateStorage, \n appNotificationsManager, \n appEmojiManager,\n appMessagesIdsManager,\n appGroupCallsManager\n );\n\n if(this.chats.length) {\n chat.backgroundEl.append(this.chat.backgroundEl.lastElementChild.cloneNode(true));\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n rootScope.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n rootScope.dispatchEvent('chat_changing', {from: chatFrom, to: this.chat});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach(chat => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(this.chat.container, animate);\n\n if(justReturn) {\n rootScope.dispatchEvent('peer_changed', this.chat.peerId);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(searchTab) {\n searchTab.close();\n }\n \n const isSet = appSidebarRight.sharedMediaTab.setPeer(this.chat.peerId, this.chat.threadId);\n if(isSet) {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(true);\n appSidebarRight.sharedMediaTab.fillProfileElements();\n }\n \n /* setTimeout(() => {\n appSidebarRight.sharedMediaTab.loadSidebarMedia(false);\n }); */\n }\n\n spliced.forEach(chat => {\n chat.beforeDestroy();\n });\n \n setTimeout(() => {\n //chat.setPeer(0);\n spliced.forEach(chat => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public setPeer(options: ChatSetPeerOptions = {}, animate?: boolean): boolean {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && chat.peerId !== peerId) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n //return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = chat.setPeer(peerId, lastMsgId, options.startParam);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n promise.then(() => {\n //window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n const type = options.type ??= 'chat';\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex(chat => chat.peerId === peerId && chat.type === type);\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n if(type) {\n chat.setType(type);\n\n if(options.threadId) {\n chat.threadId = options.threadId;\n }\n }\n\n rootScope.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n //this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId, \n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n //default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public getPeerTyping(peerId: PeerId, container?: HTMLElement) {\n if(!appUsersManager.isBot(peerId)) {\n const typings = appProfileManager.getPeerTypings(peerId);\n if(!typings || !typings.length) {\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = peerId.isUser() ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach(typing => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n return;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n let args: any[];\n if(peerId.isAnyChat()) {\n args = [\n new PeerTitle({peerId: typing.userId.toPeerId(false), onlyFirstName: true}).element,\n typings.length - 1\n ];\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(RichTextProcessor.wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n return container;\n }\n }\n\n public async getPeerStatus(peerId: PeerId) {\n let subtitle: HTMLElement;\n if(!peerId) return;\n\n if(peerId.isAnyChat()) { // not human\n let span = this.getPeerTyping(peerId);\n if(span) {\n return span;\n }\n\n const chatId = peerId.toChatId();\n const chatInfo = await appProfileManager.getChatFull(chatId) as any;\n this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = chatInfo.participants_count || (chatInfo.participants && chatInfo.participants.participants && chatInfo.participants.participants.length) || 1;\n //if(participants_count) {\n subtitle = appProfileManager.getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n \n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n \n return subtitle;\n //}\n } else { // user\n const user = appUsersManager.getUser(peerId);\n \n if(rootScope.myId === peerId) {\n return;\n } else if(user) {\n subtitle = appUsersManager.getUserStatusString(user.id);\n\n if(!appUsersManager.isBot(peerId)) {\n let span = this.getPeerTyping(peerId);\n if(!span && user.status?._ === 'userStatusOnline') {\n span = document.createElement('span');\n span.classList.add('online');\n span.append(subtitle);\n }\n\n if(span) {\n return span;\n }\n }\n \n return subtitle;\n }\n }\n }\n\n public setPeerStatus(peerId: PeerId, element: HTMLElement, needClear: boolean, useWhitespace: boolean, middleware: () => boolean) {\n if(needClear) {\n element.innerHTML = useWhitespace ? '‎' : ''; // ! HERE U CAN FIND WHITESPACE\n }\n\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && this.getPeerTyping(peerId, typingContainer)) {\n return;\n }\n\n this.getPeerStatus(peerId).then((subtitle) => {\n if(!middleware()) {\n return;\n }\n\n replaceContent(element, subtitle || (useWhitespace ? '‎' : ''));\n });\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'});\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { deferredPromise } from \"../helpers/cancellablePromise\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport { IS_MOBILE_SAFARI, IS_SAFARI } from \"../environment/userAgent\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport { logger } from \"../lib/logger\";\nimport VideoPlayer from \"../lib/mediaPlayer\";\nimport rootScope from \"../lib/rootScope\";\nimport animationIntersector from \"./animationIntersector\";\nimport appMediaPlaybackController from \"./appMediaPlaybackController\";\nimport AvatarElement from \"./avatar\";\nimport ButtonIcon from \"./buttonIcon\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport ButtonMenuToggle from \"./buttonMenuToggle\";\nimport { LazyLoadQueueBase } from \"./lazyLoadQueue\";\nimport ProgressivePreloader from \"./preloader\";\nimport SwipeHandler from \"./swipeHandler\";\nimport { formatFullSentTime } from \"../helpers/date\";\nimport appNavigationController from \"./appNavigationController\";\nimport { Message } from \"../layer\";\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport renderImageFromUrl, { renderImageFromUrlPromise } from \"../helpers/dom/renderImageFromUrl\";\nimport getVisibleRect from \"../helpers/dom/getVisibleRect\";\nimport appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport fillPropertyValue from \"../helpers/fillPropertyValue\";\nimport generatePathData from \"../helpers/generatePathData\";\nimport replaceContent from \"../helpers/dom/replaceContent\";\nimport PeerTitle from \"./peerTitle\";\nimport { doubleRaf, fastRaf } from \"../helpers/schedulers\";\nimport RangeSelector from \"./rangeSelector\";\nimport windowSize from \"../helpers/windowSize\";\nimport ListLoader from \"../helpers/listLoader\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\nimport { isFullScreen } from \"../helpers/dom/fullScreen\";\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string, \n ButtonsAdditionType extends string, \n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n \n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n //protected targetContainer: HTMLElement = null;\n //protected loadMore: () => void = null;\n\n protected log: ReturnType; \n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n \n protected ctrlKeyDown: boolean;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader, \n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n \n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n \n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n \n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n \n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n \n authorRight.append(this.author.nameEl, this.author.date);\n \n this.author.container.append(this.author.avatarEl, authorRight);\n \n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n \n topButtons.concat(['download', 'zoom', 'close']).forEach(name => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n this.zoomElements.btnOut.addEventListener('click', () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n this.zoomElements.btnIn.addEventListener('click', () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP, \n min: ZOOM_MIN_VALUE, \n max: ZOOM_MAX_VALUE, \n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n \n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n this.buttons.download.addEventListener('click', this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach(el => {\n el.addEventListener('click', this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n \n this.listLoader.go(moveLength);\n });\n });\n\n this.buttons.zoom.addEventListener('click', () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv, \n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n //console.log(xDiff, yDiff);\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n //console.log('will swipe', xDiff);\n\n if(xDiff < 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.buttons.close.click();\n return true;\n }\n\n return false;\n }, \n verifyTouchTarget: (evt) => {\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = -1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n \n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({onlyMobile: true}, 'bottom-left', buttons);\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n appNavigationController.removeByType('media');\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n \n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find(s => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.buttons.close.click();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n //this.log('onKeyDown', e);\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n \n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(rootScope.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(rootScope.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n //mover.append(this.buttons.prev, this.buttons.next);\n }\n \n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n //let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n \n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n \n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map(r => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n //let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n \n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement;\n let src: string;\n\n if(target instanceof HTMLVideoElement) {\n const elements = Array.from(target.parentElement.querySelectorAll('img')) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n }\n }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n \n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = document.createElement('video');\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n \n y = height;\n \n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n \n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map(v => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n \n mover.prepend(newSvg);\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n \n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n \n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n\n //return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n //await new Promise((resolve) => setTimeout(resolve, 0));\n //await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n //await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n //mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n //throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n \n //aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n //this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n //}\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map(v => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map(v => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n \n //window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n //const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n //mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n //const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n ////////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n //if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n \n return;\n }\n \n preloader.remove();\n }\n }\n\n renderImageFromUrl(el, url);\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n\n const isPeerId = fromId.isPeerId();\n let title: HTMLElement;\n if(isPeerId) {\n title = new PeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n } else {\n title = document.createElement('span');\n title.innerHTML = RichTextProcessor.wrapEmojiText(fromId);\n title.classList.add('peer-title');\n }\n\n replaceContent(this.author.nameEl, title);\n\n let oldAvatar = this.author.avatarEl;\n this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n if(!isPeerId) {\n this.author.avatarEl.setAttribute('peer-title', '' + fromId);\n } else {\n this.author.avatarEl.removeAttribute('peer-title');\n }\n\n this.author.avatarEl.setAttribute('peer', '' + (fromId || NULL_PEER_ID));\n\n oldAvatar.parentElement.replaceChild(this.author.avatarEl, oldAvatar);\n }\n \n protected async _openMedia(\n media: MyDocument | MyPhoto, \n timestamp: number, \n fromId: PeerId | string, \n fromRight: number, \n target?: HTMLElement, \n reverse = false, \n prevTargets: TargetType[] = [], \n nextTargets: TargetType[] = [], \n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n this.setAuthorInfo(fromId, timestamp);\n \n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n //this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n //this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n //if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n //if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n \n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n \n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n rootScope.isOverlayActive = true;\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\n }\n }\n\n ////////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n //const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = appPhotosManager.setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n let img: HTMLImageElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = appPhotosManager.getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n let setMoverPromise: Promise;\n if(isVideo) {\n ////////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ? \n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement : \n */document.createElement('video');\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n //const video = mover.querySelector('video') || document.createElement('video');\n \n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n \n //video.src = '';\n \n video.setAttribute('playsinline', 'true');\n \n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n video.addEventListener('error', () => {\n if(video.error.code !== 4) {\n this.log.error(\"Error \" + video.error.code + \"; details: \" + video.error.message);\n }\n\n if(preloader) {\n preloader.detach();\n }\n }, {once: true});\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n \n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n \n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n }\n \n // if(!video.parentElement) {\n div.append(video);\n // }\n \n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n \n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n \n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer(video, play, supportsStreaming);\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.removeListeners();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n \n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n preloader.attach(mover, true);\n }\n \n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n \n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n //this.log('video waited and progress loaded');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n \n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n \n //this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n \n preloader.attach(mover, true);\n \n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n \n attachCanPlay();\n }\n \n //if(!video.src || media.url !== video.src) {\n const load = () => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const cacheContext = appDownloadManager.getCacheContext(media);\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDocsManager.downloadDoc(media);\n \n if(!supportsStreaming) {\n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n preloader.attach(mover, true, promise);\n }\n });\n }\n \n Promise.all([promise, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n if(useController) {\n const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\n }, {once: true});\n }\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n //if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n //}\n } else {\n renderImageFromUrl(video, url);\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n \n return promise;\n };\n \n this.lazyLoadQueue.unshift({load});\n //} else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n //return; // set and don't move\n //if(wasActive) return;\n //return;\n \n const load = () => {\n const cacheContext = appDownloadManager.getCacheContext(media, size.type);\n const cancellablePromise = isDocument ? appDocsManager.downloadDoc(media) : appPhotosManager.preloadPhoto(media, size);\n \n onAnimationEnd.then(() => {\n if(!cacheContext.url) {\n this.preloader.attachPromise(cancellablePromise);\n //this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n \n Promise.all([onAnimationEnd, cancellablePromise]).then(() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n \n ///////this.log('indochina', blob);\n \n const url = cacheContext.url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n \n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach(img => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n let image = new Image();\n image.classList.add('thumbnail');\n \n //this.log('will renderImageFromUrl:', image, div, target);\n \n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n \n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n \n div.append(image);\n });\n }\n }\n \n //this.preloader.detach();\n }).catch(err => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n \n return cancellablePromise;\n };\n \n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fillPropertyValue(str: string) {\r\n let splitted = str.split(' ');\r\n if(splitted.length !== 4) {\r\n if(!splitted[0]) splitted[0] = '0px';\r\n for(let i = splitted.length; i < 4; ++i) {\r\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\r\n }\r\n }\r\n\r\n return splitted;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from \"../environment/mediaMimeTypesSupport\";\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport setInnerHTML from \"../helpers/dom/setInnerHTML\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport SearchListLoader from \"../helpers/searchListLoader\";\nimport { Message } from \"../layer\";\nimport appDocsManager, { MyDocument } from \"../lib/appManagers/appDocsManager\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appMessagesManager, { MyMessage } from \"../lib/appManagers/appMessagesManager\";\nimport appPhotosManager, { MyPhoto } from \"../lib/appManagers/appPhotosManager\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\nimport { MediaSearchContext } from \"./appMediaPlaybackController\";\nimport AppMediaViewerBase, { MEDIA_VIEWER_CLASSNAME } from \"./appMediaViewerBase\";\nimport { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteMessages from \"./popups/deleteMessages\";\nimport PopupForward from \"./popups/forward\";\nimport Scrollable from \"./scrollable\";\nimport appSidebarRight from \"./sidebarRight\";\nimport AppSharedMediaTab from \"./sidebarRight/tabs/sharedMedia\";\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptions;\n protected btnMenuDownload: ButtonMenuItemOptions;\n protected btnMenuDelete: ButtonMenuItemOptions;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = appMessagesManager.getMediaFromMessage(item);\n\n if(!media) return;\n \n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n \n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n \n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n //this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptions[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n this.buttons.forward.addEventListener('click', this.onForwardClick);\n this.author.container.addEventListener('click', this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n if(e.target instanceof HTMLAnchorElement) { // close viewer if it's t.me/ redirect\n const onclick = (e.target as HTMLElement).getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n (e.target as HTMLAnchorElement).click();\n });\n\n return false;\n }\n };\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? appMessagesManager.getScheduledMessageByPeer(peerId, mid) : appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerTargetType) => {\n this.openMedia(this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n //appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = (e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = this.getMessageByPeer(peerId, mid);\n this.close(e)\n //.then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId, \n lastMsgId: mid, \n type: threadId ? 'discussion' : undefined, \n threadId\n });\n });\n }\n };\n\n onDownloadClick = () => {\n const {peerId, mid} = this.target;\n const message = this.getMessageByPeer(peerId, mid);\n if(message.media.photo) {\n appPhotosManager.savePhotoFile(message.media.photo, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n } else {\n let document: MyDocument = null;\n\n if(message.media.webpage) document = message.media.webpage.document;\n else document = message.media.document;\n\n if(document) {\n //console.log('will save document:', document);\n appDocsManager.saveDocFile(document, appImManager.chat.bubbles.lazyLoadQueue.queueId);\n }\n }\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html = '';\n if(caption) {\n html = RichTextProcessor.wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n \n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false, \n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = appMessagesManager.getMediaFromMessage(message);\n\n const cantForwardMessage = message._ === 'messageService' || !appMessagesManager.canForward(message);\n [this.buttons.forward, this.btnMenuForward.element].forEach(button => {\n button.classList.toggle('hide', cantForwardMessage);\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantForwardMessage);\n \n const cantDownloadMessage = cantForwardMessage;\n [this.buttons.download, this.btnMenuDownload.element].forEach(button => {\n button.classList.toggle('hide', cantDownloadMessage);\n });\n\n const canDeleteMessage = appMessagesManager.canDeleteMessage(message);\n [this.buttons.delete, this.btnMenuDelete.element].forEach(button => {\n button.classList.toggle('hide', !canDeleteMessage);\n });\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Photo } from \"../layer\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport ListLoader, { ListLoaderOptions } from \"./listLoader\";\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId || this.current?.photoId;\n return appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then(value => {\n const items = value.photos.map(photoId => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from \"../helpers/avatarListLoader\";\nimport { Photo } from \"../layer\";\nimport appImManager from \"../lib/appManagers/appImManager\";\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\nimport AppMediaViewerBase from \"./appMediaViewerBase\";\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n \n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = () => {\n appPhotosManager.savePhotoFile(appPhotosManager.getPhoto(this.target.photoId), appImManager.chat.bubbles.lazyLoadQueue.queueId);\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appMessagesManager from \"../lib/appManagers/appMessagesManager\";\r\nimport appProfileManager from \"../lib/appManagers/appProfileManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { Message, Photo } from \"../layer\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport appPhotosManager from \"../lib/appManagers/appPhotosManager\";\r\nimport type { LazyLoadQueueIntersector } from \"./lazyLoadQueue\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport appAvatarsManager from \"../lib/appManagers/appAvatarsManager\";\r\nimport AppMediaViewer from \"./appMediaViewer\";\r\nimport AppMediaViewerAvatar from \"./appMediaViewerAvatar\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\nimport { isObject } from \"../helpers/object\";\r\n\r\nconst onAvatarUpdate = (peerId: PeerId) => {\r\n appAvatarsManager.removeFromAvatarsCache(peerId);\r\n (Array.from(document.querySelectorAll('avatar-element[peer=\"' + peerId + '\"]')) as AvatarElement[]).forEach(elem => {\r\n //console.log('updating avatar:', elem);\r\n elem.update();\r\n });\r\n};\r\n\r\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n if(!appAvatarsManager.isAvatarCached(peerId)) {\r\n onAvatarUpdate(peerId);\r\n }\r\n});\r\n\r\nexport async function openAvatarViewer(\r\n target: HTMLElement, \r\n peerId: PeerId, \r\n middleware: () => boolean, \r\n message?: any, \r\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[], \r\n nextTargets?: typeof prevTargets\r\n) {\r\n let photo = await appProfileManager.getFullPhoto(peerId);\r\n if(!middleware() || !photo) {\r\n return;\r\n }\r\n\r\n const getTarget = () => {\r\n const good = Array.from(target.querySelectorAll('img')).find(img => !img.classList.contains('emoji'));\r\n return good ? target : null;\r\n };\r\n\r\n if(peerId.isAnyChat()) {\r\n const hadMessage = !!message;\r\n const inputFilter = 'inputMessagesFilterChatPhotos';\r\n if(!message) {\r\n message = await appMessagesManager.getSearch({\r\n peerId, \r\n inputFilter: {_: inputFilter}, \r\n maxId: 0, \r\n limit: 1 \r\n }).then(value => {\r\n //console.log(lol);\r\n // ! by descend\r\n return value.history[0];\r\n });\r\n\r\n if(!middleware()) {\r\n return;\r\n }\r\n }\r\n\r\n if(message) {\r\n // ! гений в деле, костылируем (но это гениально)\r\n const messagePhoto = message.action.photo;\r\n if(messagePhoto.id !== photo.id) {\r\n if(!hadMessage) {\r\n message = appMessagesManager.generateFakeAvatarMessage(peerId, photo);\r\n } else {\r\n \r\n }\r\n }\r\n\r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n mid: (el.item as Message.messageService).mid,\r\n peerId: (el.item as Message.messageService).peerId\r\n }));\r\n\r\n new AppMediaViewer()\r\n .setSearchContext({\r\n peerId,\r\n inputFilter: {_: inputFilter},\r\n })\r\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n\r\n return;\r\n }\r\n }\r\n\r\n if(photo) {\r\n if(!isObject(message) && message) {\r\n photo = appPhotosManager.getPhoto(message);\r\n }\r\n \r\n const f = (arr: typeof prevTargets) => arr.map(el => ({\r\n element: el.element,\r\n photoId: el.item as string\r\n }));\r\n\r\n new AppMediaViewerAvatar(peerId).openMedia(photo.id, getTarget(), undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\r\n }\r\n}\r\n\r\nconst believeMe: Map> = new Map();\r\nconst seen: Set = new Set();\r\n\r\nexport default class AvatarElement extends HTMLElement {\r\n private peerId: PeerId;\r\n private isDialog = false;\r\n private peerTitle: string;\r\n public loadPromises: Promise[];\r\n public lazyLoadQueue: LazyLoadQueueIntersector;\r\n private addedToQueue = false;\r\n\r\n connectedCallback() {\r\n // браузер вызывает этот метод при добавлении элемента в документ\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n\r\n this.isDialog = this.getAttribute('dialog') === '1';\r\n if(this.getAttribute('clickable') === '') {\r\n this.setAttribute('clickable', 'set');\r\n let loading = false;\r\n attachClickEvent(this, async(e) => {\r\n cancelEvent(e);\r\n if(loading) return;\r\n //console.log('avatar clicked');\r\n const peerId = this.peerId;\r\n loading = true;\r\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\r\n loading = false;\r\n });\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n // браузер вызывает этот метод при удалении элемента из документа\r\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\r\n const set = believeMe.get(this.peerId);\r\n if(set && set.has(this)) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(this.peerId);\r\n }\r\n }\r\n\r\n if(this.lazyLoadQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n }\r\n\r\n static get observedAttributes(): string[] {\r\n return ['peer', 'dialog', 'peer-title'/* массив имён атрибутов для отслеживания их изменений */];\r\n }\r\n\r\n attributeChangedCallback(name: string, oldValue: string, newValue: string) {\r\n //console.log('avatar changed attribute:', name, oldValue, newValue);\r\n // вызывается при изменении одного из перечисленных выше атрибутов\r\n if(name === 'peer') {\r\n const newPeerId = (newValue || '').toPeerId() || NULL_PEER_ID;\r\n if(this.peerId === newPeerId) {\r\n return;\r\n }\r\n \r\n this.peerId = appPeersManager.getPeerMigratedTo(newPeerId) || newPeerId;\r\n\r\n const wasPeerId = (oldValue || '').toPeerId() || NULL_PEER_ID;\r\n if(wasPeerId) {\r\n const set = believeMe.get(wasPeerId);\r\n if(set) {\r\n set.delete(this);\r\n if(!set.size) {\r\n believeMe.delete(wasPeerId);\r\n }\r\n }\r\n }\r\n\r\n this.update();\r\n } else if(name === 'peer-title') {\r\n this.peerTitle = newValue;\r\n } else if(name === 'dialog') {\r\n this.isDialog = newValue === '1';\r\n }\r\n }\r\n\r\n private r(onlyThumb = false) {\r\n const res = appAvatarsManager.putPhoto(this, this.peerId, this.isDialog, this.peerTitle, onlyThumb);\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n if(this.loadPromises) {\r\n if(res && res.cached) {\r\n this.loadPromises.push(promise);\r\n }\r\n\r\n promise.finally(() => {\r\n this.loadPromises = undefined;\r\n });\r\n }\r\n\r\n return res;\r\n }\r\n\r\n public update() {\r\n if(this.lazyLoadQueue) {\r\n if(!seen.has(this.peerId)) {\r\n if(this.addedToQueue) return;\r\n this.addedToQueue = true;\r\n \r\n let set = believeMe.get(this.peerId);\r\n if(!set) {\r\n set = new Set();\r\n believeMe.set(this.peerId, set);\r\n }\r\n \r\n set.add(this);\r\n\r\n this.r(true);\r\n\r\n this.lazyLoadQueue.push({\r\n div: this, \r\n load: () => {\r\n seen.add(this.peerId);\r\n return this.update();\r\n }\r\n });\r\n\r\n return;\r\n } else if(this.addedToQueue) {\r\n this.lazyLoadQueue.unobserve(this);\r\n }\r\n } \r\n \r\n seen.add(this.peerId);\r\n \r\n const res = this.r();\r\n const promise = res ? res.loadPromise : Promise.resolve();\r\n\r\n if(this.addedToQueue) {\r\n promise.finally(() => {\r\n this.addedToQueue = false;\r\n });\r\n }\r\n\r\n const set = believeMe.get(this.peerId);\r\n if(set) {\r\n set.delete(this);\r\n const arr = Array.from(set);\r\n believeMe.delete(this.peerId);\r\n \r\n\r\n for(let i = 0, length = arr.length; i < length; ++i) {\r\n arr[i].update();\r\n }\r\n }\r\n\r\n return promise;\r\n }\r\n}\r\n\r\ncustomElements.define('avatar-element', AvatarElement);\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from \"../lib/appManagers/appDialogsManager\";\nimport appMessagesManager, {Dialog} from \"../lib/appManagers/appMessagesManager\";\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\nimport rootScope from \"../lib/rootScope\";\nimport { positionMenu, openBtnMenu } from \"./misc\";\nimport ButtonMenu, { ButtonMenuItemOptions } from \"./buttonMenu\";\nimport PopupDeleteDialog from \"./popups/deleteDialog\";\nimport { i18n } from \"../lib/langPack\";\nimport findUpTag from \"../helpers/dom/findUpTag\";\nimport appNotificationsManager from \"../lib/appManagers/appNotificationsManager\";\nimport PopupPeer from \"./popups/peer\";\nimport AppChatFoldersTab from \"./sidebarLeft/tabs/chatFolders\";\nimport appSidebarLeft from \"./sidebarLeft\";\nimport { toastNew } from \"./toast\";\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n\n private selectedId: PeerId;\n private filterId: number;\n private dialog: Dialog;\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: () => !appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: () => {\n const isPinned = this.filterId > 1 ? appMessagesManager.filtersStorage.getFilter(this.filterId).pinnedPeerIds.includes(this.dialog.peerId) : !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && !appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: () => {\n return this.selectedId !== rootScope.myId && appNotificationsManager.isPeerLocalMuted(this.dialog.peerId); \n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.selectedId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.selectedId !== rootScope.myId\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => true\n }];\n\n this.element = ButtonMenu(this.buttons);\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = () => {\n let dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(dialog) {\n appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onPinClick = () => {\n appMessagesManager.toggleDialogPin(this.selectedId, this.filterId).catch(err => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH') {\n if(this.filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n new PopupPeer('pinned-dialogs-too-much', {\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'FiltersSetupPinAlert',\n callback: () => {\n new AppChatFoldersTab(appSidebarLeft).open();\n }\n }],\n descriptionLangKey: 'PinToTopLimitReached2',\n descriptionLangArgs: [i18n('Chats', [rootScope.config.pinned_dialogs_count_max])]\n }).show();\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, false);\n };\n \n private onMuteClick = () => {\n appMessagesManager.mutePeer(this.selectedId, true);\n };\n\n private onUnreadClick = () => {\n const dialog = appMessagesManager.getDialogOnly(this.selectedId);\n if(!dialog) return;\n\n if(dialog.unread_count) {\n appMessagesManager.readHistory(this.selectedId, dialog.top_message);\n appMessagesManager.markDialogUnread(this.selectedId, true);\n } else {\n appMessagesManager.markDialogUnread(this.selectedId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.selectedId/* , 'delete' */);\n };\n\n onContextMenu = (e: MouseEvent | Touch) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n \n try {\n li = findUpTag(e.target, 'LI');\n } catch(e) {}\n \n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n this.filterId = appDialogsManager.filterId;\n\n this.selectedId = li.dataset.peerId.toPeerId();\n this.dialog = appMessagesManager.getDialogOnly(this.selectedId);\n\n this.buttons.forEach(button => {\n const good = button.verify();\n\n button.element.classList.toggle('hide', !good);\n });\n\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(appPeersManager.getDeleteButtonText(this.selectedId)));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.selectedId = this.dialog = this.filterId = undefined;\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Message } from \"../layer\";\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ? \n SENDING_STATUS.Pending : (\n message.pFlags.unread ? \n SENDING_STATUS.Sent : \n SENDING_STATUS.Read\n );\n}\n\nexport function setSendingStatus(\n container: HTMLElement, \n message?: Message.message | Message.messageService, \n disableAnimationIfRippleFound?: boolean\n) {\n let className: 'check' | 'checks' | 'sending';\n if(message?.pFlags.out) {\n if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n \n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n \n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport App from \"../config/app\";\r\nimport DEBUG from \"../config/debug\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport apiUpdatesManager from \"../lib/appManagers/apiUpdatesManager\";\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\nimport { logger } from \"../lib/logger\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport Button from \"./button\";\r\nimport ProgressivePreloader from \"./preloader\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport sessionStorage from '../lib/sessionStorage';\r\nimport { ConnectionStatus } from \"../lib/mtproto/connectionStatus\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\n\r\nexport default class ConnectionStatusComponent {\r\n public static CHANGE_STATE_DELAY = 1000;\r\n\r\n private statusContainer: HTMLElement;\r\n private statusEl: HTMLElement;\r\n private statusPreloader: ProgressivePreloader;\r\n\r\n private currentLangPackKey: LangPackKey;\r\n\r\n private hadConnect = false;\r\n private retryAt: number;\r\n private connecting = false;\r\n private timedOut = false;\r\n private updating = false;\r\n\r\n private log: ReturnType;\r\n\r\n private setFirstConnectionTimeout: number;\r\n private setStateTimeout: number;\r\n\r\n constructor(chatsContainer: HTMLElement) {\r\n this.log = logger('CS', undefined, undefined);\r\n \r\n this.statusContainer = document.createElement('div');\r\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\r\n\r\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\r\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\r\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\r\n this.statusContainer.append(this.statusEl);\r\n\r\n chatsContainer.prepend(this.statusContainer);\r\n\r\n rootScope.addEventListener('connection_status_change', (status) => {\r\n console.log(status);\r\n\r\n this.setConnectionStatus();\r\n });\r\n\r\n rootScope.addEventListener('state_synchronizing', (channelId) => {\r\n if(!channelId) {\r\n this.updating = true;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('state_synchronized', (channelId) => {\r\n DEBUG && this.log('state_synchronized', channelId);\r\n if(!channelId) {\r\n this.updating = false;\r\n DEBUG && this.log('updating', this.updating);\r\n this.setState();\r\n }\r\n });\r\n\r\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\r\n\r\n /* let bool = true;\r\n document.addEventListener('dblclick', () => {\r\n const dcId = 2;\r\n rootScope.dispatchEvent('connection_status_change', {\r\n dcId: dcId,\r\n isFileDownload: false,\r\n isFileNetworker: false,\r\n isFileUpload: false,\r\n name: \"NET-\" + dcId,\r\n status: bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected),\r\n _: \"networkerStatus\"\r\n });\r\n }); */\r\n }\r\n\r\n private setConnectionStatus = () => {\r\n sessionStorage.get('dc').then(baseDcId => {\r\n if(!baseDcId) {\r\n baseDcId = App.baseDcId;\r\n }\r\n \r\n if(this.setFirstConnectionTimeout) {\r\n clearTimeout(this.setFirstConnectionTimeout);\r\n this.setFirstConnectionTimeout = 0;\r\n }\r\n\r\n const status = rootScope.connectionStatus['NET-' + baseDcId];\r\n const online = status && status.status === ConnectionStatus.Connected;\r\n\r\n if(this.connecting && online) {\r\n apiUpdatesManager.forceGetDifference();\r\n }\r\n\r\n if(online && !this.hadConnect) {\r\n this.hadConnect = true;\r\n }\r\n \r\n this.timedOut = status && status.status === ConnectionStatus.TimedOut;\r\n this.connecting = !online;\r\n this.retryAt = status && status.retryAt;\r\n DEBUG && this.log('connecting', this.connecting);\r\n this.setState();\r\n });\r\n };\r\n\r\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\r\n if(this.currentLangPackKey === langPackKey) return;\r\n this.currentLangPackKey = langPackKey;\r\n replaceContent(this.statusEl, i18n(langPackKey, args));\r\n this.statusPreloader.attach(this.statusEl);\r\n };\r\n\r\n private getA(langPackKey: LangPackKey, callback: () => void) {\r\n const a = document.createElement('a');\r\n a.classList.add('force-reconnect');\r\n a.append(i18n(langPackKey));\r\n a.addEventListener('click', (e) => {\r\n cancelEvent(e);\r\n callback();\r\n });\r\n\r\n return a;\r\n }\r\n\r\n private setState = () => {\r\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\r\n if(this.connecting) {\r\n if(this.timedOut) {\r\n const a = this.getA('ConnectionStatus.ForceReconnect', () => apiManager.forceReconnect());\r\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\r\n } else if(this.hadConnect) {\r\n if(this.retryAt !== undefined) {\r\n const timerSpan = document.createElement('span');\r\n const retryAt = this.retryAt;\r\n const setTime = () => {\r\n const now = Date.now();\r\n timerSpan.innerText = '' + Math.round((retryAt - now) / 1000);\r\n if(now > retryAt) {\r\n clearInterval(interval);\r\n }\r\n };\r\n const interval = setInterval(setTime, 1e3);\r\n setTime();\r\n \r\n const a = this.getA('ConnectionStatus.Reconnect', () => apiManager.forceReconnectTimeout());\r\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\r\n } else {\r\n this.setStatusText('ConnectionStatus.Reconnecting');\r\n }\r\n } else {\r\n this.setStatusText('ConnectionStatus.Waiting');\r\n }\r\n } else if(this.updating) {\r\n this.setStatusText('Updating');\r\n }\r\n\r\n DEBUG && this.log('setState', this.connecting || this.updating);\r\n window.requestAnimationFrame(() => {\r\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\r\n\r\n const cb = () => {\r\n SetTransition(this.statusContainer, 'is-shown', this.connecting || this.updating, 200);\r\n this.setStateTimeout = 0;\r\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\r\n };\r\n\r\n this.setStateTimeout = window.setTimeout(cb, timeout);\r\n //cb();\r\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\r\n else cb(); */\r\n });\r\n };\r\n}\r\n","export default function roundRect(\n ctx: CanvasRenderingContext2D, \n x: number, \n y: number, \n width: number, \n height: number, \n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number, \n fill?: boolean, \n stroke?: boolean\n) {\n if(typeof(radius) === 'number') {\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] || defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { animate } from \"../helpers/animation\";\nimport customProperties from \"../helpers/dom/customProperties\";\nimport easeInOutSine from \"../helpers/easing/easeInOutSine\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport roundRect from \"../helpers/roundRect\";\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n \n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n \n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n \n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n \n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n \n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n \n height *= DPR;\n const y = (SIZE - height) / 2;\n \n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine (t: number, b: number, c: number, d: number) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type DialogsStorage from \"../storages/dialogs\";\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from \"../storages/filters\";\nimport type { LazyLoadQueueIntersector } from \"../../components/lazyLoadQueue\";\nimport AvatarElement from \"../../components/avatar\";\nimport DialogsContextMenu from \"../../components/dialogsContextMenu\";\nimport { horizontalMenu } from \"../../components/horizontalMenu\";\nimport { attachContextMenuListener, putPreloader } from \"../../components/misc\";\nimport { ripple } from \"../../components/ripple\";\n//import Scrollable from \"../../components/scrollable\";\nimport Scrollable, { ScrollableX, SliceSides } from \"../../components/scrollable\";\nimport { formatDateAccordingToTodayNew } from \"../../helpers/date\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { logger, LogTypes } from \"../logger\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appPeersManager from './appPeersManager';\nimport appImManager from \"./appImManager\";\nimport appMessagesManager, { Dialog, MyMessage } from \"./appMessagesManager\";\nimport appStateManager, { State } from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport Button from \"../../components/button\";\nimport SetTransition from \"../../components/singleTransition\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport I18n, { FormatterArguments, i18n, LangPackKey, _i18n } from \"../langPack\";\nimport findUpTag from \"../../helpers/dom/findUpTag\";\nimport lottieLoader from \"../rlottie/lottieLoader\";\nimport { wrapLocalSticker, wrapPhoto } from \"../../components/wrappers\";\nimport AppEditFolderTab from \"../../components/sidebarLeft/tabs/editFolder\";\nimport appSidebarLeft, { SettingSection } from \"../../components/sidebarLeft\";\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\nimport positionElementByIndex from \"../../helpers/dom/positionElementByIndex\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport ConnectionStatusComponent from \"../../components/connectionStatus\";\nimport appChatsManager from \"./appChatsManager\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport { fastRafConventional, fastRafPromise } from \"../../helpers/schedulers\";\nimport SortedUserList from \"../../components/sortedUserList\";\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport handleTabSwipe from \"../../helpers/dom/handleTabSwipe\";\nimport windowSize from \"../../helpers/windowSize\";\nimport isInDOM from \"../../helpers/dom/isInDOM\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport { MyDocument } from \"./appDocsManager\";\nimport { setSendingStatus } from \"../../components/sendingStatus\";\nimport SortedList, { SortedElementBase } from \"../../helpers/sortedList\";\nimport debounce from \"../../helpers/schedulers/debounce\";\nimport generateVerifiedIcon from \"../../components/generateVerifiedIcon\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport groupCallActiveIcon from \"../../components/groupCallActiveIcon\";\nimport { Chat } from \"../../layer\";\nimport IS_GROUP_CALL_SUPPORTED from \"../../environment/groupCallSupport\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLDivElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLLIElement,\n subtitleEl: HTMLElement\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n loadPromises?: Promise[]\n}\n\nclass SortedDialogList extends SortedList {\n constructor(\n public list: HTMLUListElement, \n public indexKey: ReturnType,\n public onListLengthChange?: () => void\n ) {\n super({\n getIndex: (element) => appMessagesManager.getDialogOnly(element.id)[this.indexKey],\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange && this.onListLengthChange();\n }\n },\n onElementCreate: (base, batch) => {\n const loadPromises: Promise[] = batch ? [] : undefined;\n\n const {dom} = appDialogsManager.addListDialog({dialog: base.id, loadPromises, isBatch: batch});\n (base as SortedDialog).dom = dom;\n\n if(loadPromises?.length) {\n (base as SortedDialog).loadPromises = loadPromises;\n Promise.all(loadPromises).finally(() => {\n delete (base as SortedDialog).loadPromises;\n });\n }\n\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional\n });\n }\n\n public clear() {\n this.list.innerHTML = '';\n super.clear();\n }\n}\n\n//const testScroll = false;\n//let testTopSlice = 1;\n\nexport class AppDialogsManager {\n private chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n private chatsPreloader: HTMLElement;\n\n private loadDialogsPromise: Promise;\n\n private scroll: Scrollable = null;\n \n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu = new DialogsContextMenu();\n\n public sortedList: SortedDialogList;\n public sortedLists: {[filterId: number]: SortedDialogList} = {};\n public scrollables: {[filterId: number]: Scrollable} = {};\n public filterId: number;\n private folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement, \n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n private allUnreadCount: HTMLElement;\n\n private sliceTimeout: number;\n\n private lastActiveElements: Set = new Set();\n\n private offsets: {top: number, bottom: number} = {top: 0, bottom: 0};\n \n private loadContacts: () => void;\n private processContact: (peerId: PeerId) => void;\n\n private indexKey: ReturnType;\n\n private initedListeners = false;\n\n private onListLengthChange: () => Promise;\n private loadedDialogsAtLeastOnce = false;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n constructor() {\n this.chatsPreloader = putPreloader(null, true);\n\n this.allUnreadCount = this.folders.menu.querySelector('.badge');\n \n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n \n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff > 0 ? prevId + 1 : prevId - 1);\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n this.setFilterId(0);\n this.addFilter({\n id: this.filterId,\n title: '',\n titleEl: this.allChatsIntlElement.element,\n orderIndex: 0\n });\n\n this.sortedList = this.sortedLists[this.filterId];\n this.scroll = this.scrollables[this.filterId];\n\n /* if(testScroll) {\n let i = 0;\n let add = () => {\n let li = document.createElement('li');\n li.dataset.id = '' + i;\n li.id = '' + i;\n li.innerHTML = `

${i}18:33

-_-_-_-: qweasd

`;\n i++;\n this.scroll.append(li);\n };\n for(let i = 0; i < 500; ++i) {\n add();\n }\n (window as any).addElement = add;\n } */\n\n rootScope.addEventListener('state_cleared', () => {\n //setTimeout(() => \n appStateManager.getState().then((state) => {\n this.loadedDialogsAtLeastOnce = false;\n\n appUsersManager.clear();\n appChatsManager.clear();\n \n const filtersStorage = appMessagesManager.filtersStorage;\n const filters = filtersStorage.filters;\n for(const filterId in filters) { // delete filters\n rootScope.dispatchEvent('updateDialogFilter', {\n _: 'updateDialogFilter',\n id: +filterId,\n });\n }\n\n appMessagesManager.clear();\n\n /* const clearPromises: Promise[] = [];\n for(const name in appStateManager.storagesResults) {\n const results = appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n this.sortedList.clear();\n this.onTabChange();\n this.onStateLoaded(state);\n })//, 5000);\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n id = +tabContent.dataset.filterId || 0;\n\n if(this.filterId === id) return;\n\n this.sortedLists[id].clear();\n this.setFilterId(id);\n this.onTabChange();\n }, () => {\n for(const folderId in this.sortedLists) {\n if(+folderId !== this.filterId) {\n this.sortedLists[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n //selectTab(0);\n (this.folders.menu.firstElementChild as HTMLElement).click();\n appMessagesManager.construct();\n appStateManager.getState().then((state) => {\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n }\n\n public get chatList() {\n return this.sortedList.list;\n }\n\n public setFilterId(filterId: number) {\n this.filterId = filterId;\n this.indexKey = appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId) : 'index';\n rootScope.filterId = filterId;\n }\n\n private setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition(element, 'is-visible', online, 250, online ? undefined : () => {\n element.classList.remove(className);\n }, online && !hasClassName ? 2 : 0);\n }\n\n private initListeners() {\n rootScope.addEventListener('user_update', (userId) => {\n //console.log('updating user:', user, dialog);\n \n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(dom && !appUsersManager.isBot(userId) && peerId !== rootScope.myId) {\n const user = appUsersManager.getUser(userId);\n const online = user.status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n }\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const peerId = chatId.toPeerId(true);\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForCallStatus(dialog);\n }\n });\n\n /* rootScope.$on('dialog_top', (e) => {\n const dialog = e;\n\n this.setLastMessage(dialog);\n this.setDialogPosition(dialog);\n\n this.setFiltersUnreadCount();\n }); */\n\n rootScope.addEventListener('folder_unread', (folder) => {\n this.setFilterUnreadCount(folder.id);\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact && this.processContact(userId.toPeerId());\n });\n\n rootScope.addEventListener('dialog_flush', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setLastMessage(dialog, undefined, undefined, undefined, undefined, undefined, true);\n this.validateDialogForFilter(dialog);\n this.setFiltersUnreadCount();\n }\n });\n\n rootScope.addEventListener('dialogs_multiupdate', (dialogs) => {\n for(const peerId in dialogs) {\n const dialog = dialogs[peerId];\n this.updateDialog(dialog);\n\n if(this.processContact) {\n this.processContact(peerId.toPeerId());\n }\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_drop', ({peerId}) => {\n this.deleteDialog(peerId);\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('dialog_unread', ({peerId}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(dialog) {\n this.setUnreadMessages(dialog);\n this.validateDialogForFilter(dialog);\n }\n });\n\n rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.setUnreadMessages(dialog); // возможно это не нужно, но нужно менять is-muted\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('dialog_draft', ({dialog, drop, peerId}) => {\n if(drop) {\n this.sortedList.delete(peerId);\n } else {\n this.updateDialog(dialog);\n }\n\n if(this.processContact) {\n this.processContact(peerId);\n }\n });\n\n rootScope.addEventListener('peer_changed', (peerId) => {\n //const perf = performance.now();\n for(const element of this.lastActiveElements) {\n if(element.dataset.peerId.toPeerId() !== peerId) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] li[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach(element => {\n this.setDialogActive(element, true);\n });\n //this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', (filter) => {\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n } else if(filter.id === this.filterId) { // это нет тут смысла вызывать, так как будет dialogs_multiupdate\n const dialogs = appMessagesManager.dialogsStorage.getCachedDialogs(true);\n this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n\n const elements = this.filtersRendered[filter.id];\n elements.title.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n (this.folders.menu.firstElementChild as HTMLElement).click();\n\n elements.container.remove();\n elements.menu.remove();\n \n delete this.sortedLists[filter.id];\n delete this.scrollables[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n });\n\n rootScope.addEventListener('filter_order', (order) => {\n const containerToAppend = this.folders.menu as HTMLElement;\n order.forEach((filterId) => {\n const filter = appMessagesManager.filtersStorage.getFilter(filterId);\n const renderedFilter = this.filtersRendered[filterId];\n\n const sortedList = this.sortedLists[filterId];\n sortedList.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(filterId);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.orderIndex);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.orderIndex);\n });\n\n this.indexKey = appMessagesManager.dialogsStorage.getDialogIndexKey(this.filterId);\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const dialog = appMessagesManager.getDialogOnly(peerId);\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n }\n\n private setDialogActive(listEl: HTMLElement, active: boolean) {\n // @ts-ignore\n const dom = listEl.dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n appNotificationsManager.getNotifyPeerTypeSettings();\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n \n const renderFiltersPromise = appMessagesManager.filtersStorage.getDialogFilters().then((filters) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n });\n\n if(state.filters && Object.keys(state.filters).length) {\n await renderFiltersPromise;\n if(this.showFiltersPromise) {\n await this.showFiltersPromise;\n }\n }\n\n if(appStateManager.storagesResults.dialogs.length) {\n appDraftsManager.addMissedDialogs();\n }\n\n return this.onChatsScroll().then(() => {\n appMessagesManager.fillConversations();\n });\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n private getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scroll.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n private isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n //return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n \n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n \n const index = dialog[this.indexKey];\n return (!topOffset.index || index <= topOffset.index) && (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n private deleteDialog(peerId: PeerId) {\n this.sortedList.delete(peerId);\n }\n\n private updateDialog(dialog: Dialog) {\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(dialog.peerId)) {\n this.sortedList.add(dialog.peerId);\n return;\n }\n } else {\n this.deleteDialog(dialog.peerId);\n return;\n }\n\n const dom = this.getDialogDom(dialog.peerId);\n if(dom) {\n this.setLastMessage(dialog, undefined, dom, undefined, undefined, undefined, true);\n this.sortedList.update(dialog.peerId);\n }\n }\n\n public onTabChange = () => {\n this.scroll = this.scrollables[this.filterId];\n this.scroll.loadedAll.top = true;\n this.scroll.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsPromise = undefined;\n this.sortedList = this.sortedLists[this.filterId];\n this.onChatsScroll();\n };\n\n private setFilterUnreadCount(filterId: number) {\n const unreadSpan = filterId === 0 ? this.allUnreadCount : this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const folder = appMessagesManager.dialogsStorage.getFolder(filterId);\n const foundUnmuted = filterId === 0 || !!folder.dialogs.find(dialog => {\n return (dialog.unread_count || dialog.pFlags.unread_mark) && !appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n });\n \n unreadSpan.classList.toggle('badge-gray', !foundUnmuted);\n \n const sum = folder.unreadDialogsCount;\n unreadSpan.innerText = sum ? '' + sum : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n\n this.setFilterUnreadCount(0);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n private validateListForFilter() {\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId) || null;\n this.sortedList.getAll().forEach((element) => {\n const dialog = appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(element.id);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n private validateDialogForFilter(dialog: Dialog, filter?: MyDialogFilter) {\n if(!this.getDialogDom(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog, filter)) {\n this.deleteDialog(dialog.peerId);\n }\n }\n\n public testDialogForFilter(dialog: Dialog, filter = appMessagesManager.filtersStorage.getFilter(this.filterId)) {\n if(!dialog || \n (filter && !appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) || \n (!filter && this.filterId !== dialog.folder_id)) {\n return false;\n }\n\n return true;\n }\n\n public generateScrollable(list: HTMLUListElement, filterId: number) {\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n scrollable.container.dataset.filterId = '' + filterId;\n scrollable.onScrolledTop = this.onChatsScrollTop;\n scrollable.onScrolledBottom = this.onChatsScroll;\n scrollable.setVirtualContainer(list);\n\n const sortedDialogList = new SortedDialogList(\n list, \n appMessagesManager.dialogsStorage ? appMessagesManager.dialogsStorage.getDialogIndexKey(filterId) : 'index',\n this.onListLengthChange\n );\n\n this.scrollables[filterId] = scrollable;\n this.sortedLists[filterId] = sortedDialogList;\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n private addFilter(filter: Pick & Partial<{titleEl: HTMLElement}>) {\n if(this.filtersRendered[filter.id]) return;\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.titleEl) titleSpan.append(filter.titleEl);\n else titleSpan.innerHTML = RichTextProcessor.wrapEmojiText(filter.title);\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n menuTab.append(span);\n ripple(menuTab);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n positionElementByIndex(menuTab, containerToAppend, filter.orderIndex);\n //containerToAppend.append(li);\n\n const ul = this.createChatList();\n const scrollable = this.generateScrollable(ul, filter.id);\n\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n \n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n \n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n \n const div = scrollable.container;\n //this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.orderIndex);\n\n this.setListClickListener(ul, null, true);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n if(!this.showFiltersPromise) {\n this.showFiltersPromise = new Promise((resolve) => {\n window.setTimeout(() => {\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n resolve();\n }, 0);\n });\n }\n\n return this.showFiltersPromise;\n }\n\n private loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n \n if(this.loadDialogsPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n\n const promise = new Promise(async(resolve) => {\n const {chatList, filterId, indexKey} = this;\n\n //return;\n \n // let loadCount = 30/*this.chatsLoadCount */;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n \n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = appMessagesManager.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex(dialog => dialog[indexKey] <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = storage[needIndex][indexKey] + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n \n //let offset = storage[storage.length - 1]?.index || 0;\n \n try {\n //console.time('getDialogs time');\n \n const getConversationsResult = appMessagesManager.getConversations('', offsetIndex, loadCount, filterId, true);\n if(!getConversationsResult.cached && !chatList.childElementCount) {\n const container = chatList.parentElement;\n container.append(this.chatsPreloader);\n }\n \n const result = await getConversationsResult.promise;\n \n if(this.loadDialogsPromise !== promise) {\n return;\n }\n \n //console.timeEnd('getDialogs time');\n \n // * loaded all\n //if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n //if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scroll.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scroll.loadedAll[side] = true;\n }\n\n this.loadedDialogsAtLeastOnce = true;\n \n if(result.dialogs.length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n \n const loadPromises: Promise[] = [];\n\n const callbacks: (() => void)[] = [];\n const cccc = (callback: () => void) => {\n callbacks.push(callback);\n };\n\n dialogs.forEach((dialog) => {\n // :(\n const isBuggedDialog = !appMessagesManager.getDialogOnly(dialog.peerId);\n if(isBuggedDialog) {\n return;\n }\n\n const element = this.sortedList.add(dialog.peerId, true, cccc, false);\n if(element.loadPromises) {\n loadPromises.push(...element.loadPromises);\n }\n });\n\n await Promise.all(loadPromises).finally();\n\n callbacks.forEach(callback => callback());\n } else {\n this.onListLengthChange();\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : result.dialogs.length - 1];\n if(offsetDialog) {\n this.offsets[side] = offsetDialog[indexKey];\n }\n\n this.log.debug('getDialogs ' + loadCount + ' dialogs by offset:', offsetIndex, result, chatList.childElementCount);\n \n setTimeout(() => {\n this.scroll.onScroll();\n }, 0);\n } catch(err) {\n this.log.error(err);\n }\n \n if(this.chatsPreloader.parentElement) {\n this.chatsPreloader.remove();\n }\n \n resolve();\n }).finally(() => {\n this.loadDialogsPromise = undefined;\n });\n\n return this.loadDialogsPromise = promise;\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n \n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === 1) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find(el => el.matches('.empty-placeholder'));\n const needPlaceholder = this.scroll.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n \n placeholderContainer = placeholder.container;\n \n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n \n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n placeholderContainer.prepend(wrapLocalSticker({\n emoji: '📂',\n width: 128,\n height: 128\n }).container)\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, () => {\n new AppEditFolderTab(appSidebarLeft).open(appMessagesManager.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n if(this.updateContactsLengthPromise) return this.updateContactsLengthPromise;\n return this.updateContactsLengthPromise = appUsersManager.getContacts().then(users => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n \n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n \n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.innerHTML = '';\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId > 0) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then(contacts => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 42, \n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false, \n onListLengthChange\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const arr = contacts.splice(0, pageCount).filter(this.verifyPeerIdForContacts);\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = (peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = (peerId: PeerId) => {\n return peerId.isContact() && !appMessagesManager.getDialogOnly(peerId);\n };\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.chatList.childElementCount || this.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const \n });\n\n Array.from(this.chatList.children).forEach(el => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n\n const perf = performance.now();\n\n const scrollTopWas = this.scroll.scrollTop;\n\n const firstElementChild = this.chatList.firstElementChild;\n const rectContainer = this.scroll.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scroll.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n \n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n //alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n //alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scroll.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scroll.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach(el => {\n const peerId = el.dataset.peerId.toPeerId();\n this.deleteDialog(peerId);\n });\n\n this.setOffsets();\n\n //this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n //this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n //alert('left length:' + children.length);\n\n this.scroll.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n //this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n private setOffsets() {\n const chatList = this.chatList;\n const firstDialog = this.getDialogFromElement(chatList.firstElementChild as HTMLElement);\n const lastDialog = this.getDialogFromElement(chatList.lastElementChild as HTMLElement);\n\n const indexKey = this.indexKey;\n this.offsets.top = firstDialog[indexKey];\n this.offsets.bottom = lastDialog[indexKey];\n }\n\n private getDialogFromElement(element: HTMLElement) {\n return appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n\n public onChatsScrollTop = () => {\n return this.onChatsScroll('top');\n };\n \n public onChatsScroll = (side: SliceSides = 'bottom') => {\n if(this.scroll.loadedAll[side]) {\n if(this.loadContacts) {\n this.loadContacts();\n }\n\n return Promise.resolve();\n } else if(this.loadDialogsPromise) return this.loadDialogsPromise;\n\n this.log('onChatsScroll', side);\n return this.loadDialogs(side);\n };\n\n public setListClickListener(list: HTMLUListElement, onFound?: () => void, withContext = false, autonomous = false, openInner = false) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n //cancelEvent(e);\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, 'LI');\n\n if(!elem) {\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(elem) {\n if(onFound) onFound();\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n setPeerFunc({\n peerId, lastMsgId\n });\n } else {\n setPeerFunc();\n }\n }, {capture: true});\n\n if(DEBUG) {\n list.addEventListener('dblclick', (e) => {\n const li = findUpTag(e.target, 'LI');\n if(li) {\n const peerId = li.dataset.peerId.toPeerId();\n this.log('debug dialog:', appMessagesManager.getDialogByPeerId(peerId));\n }\n });\n }\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* , \n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessage(\n dialog: Dialog, \n lastMessage?: any, \n dom?: DialogDom, \n highlightWord?: string, \n loadPromises?: Promise[],\n isBatch = false,\n setUnread = false\n ) {\n ///////console.log('setlastMessage:', lastMessage);\n if(!dom) {\n dom = this.getDialogDom(dialog.peerId);\n\n if(!dom) {\n //this.log.error('no dom for dialog:', dialog, lastMessage, dom, highlightWord);\n return;\n }\n }\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(dialog.draft && dialog.draft._ === 'draftMessage') {\n draftMessage = dialog.draft;\n }\n \n lastMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n\n if(lastMessage._ === 'messageEmpty'/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.innerHTML = '';\n dom.lastTimeSpan.innerHTML = '';\n delete dom.listEl.dataset.mid;\n\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n }\n\n return;\n }\n\n const peerId = dialog.peerId;\n //let peerId = appMessagesManager.getMessagePeer(lastMessage);\n\n //console.log('setting last message:', lastMessage);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n\n let mediaContainer: HTMLElement;\n if(!lastMessage.deleted && !draftMessage) {\n const media: MyDocument | MyPhoto = appMessagesManager.getMediaFromMessage(lastMessage);\n if(media && (media._ === 'photo' || (['video', 'gif'] as MyDocument['type'][]).includes(media.type))) {\n const size = appPhotosManager.choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n \n wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size,\n loadPromises\n });\n\n if((media as MyDocument).type === 'video') {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n const withoutMediaType = !!mediaContainer && !!lastMessage?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && lastMessage.message) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, highlightWord, withoutMediaType);\n } else if(draftMessage) {\n fragment = appMessagesManager.wrapMessageForReply(draftMessage);\n } else if(!lastMessage.deleted) {\n fragment = appMessagesManager.wrapMessageForReply(lastMessage, undefined, undefined, false, undefined, withoutMediaType);\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(mediaContainer) {\n fragment.prepend(mediaContainer);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n \n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const bold = document.createElement('b');\n bold.classList.add('danger');\n bold.append(i18n('Draft'), ': ');\n dom.lastMessageSpan.prepend(bold);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !lastMessage.action) {\n const sender = appPeersManager.getPeer(lastMessage.fromId);\n if(sender && sender.id) {\n const senderBold = document.createElement('b');\n\n if(sender.id === rootScope.myId) {\n senderBold.append(i18n('FromYou'));\n } else {\n //str = sender.first_name || sender.last_name || sender.username;\n senderBold.append(new PeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true,\n }).element);\n }\n\n senderBold.append(': ');\n //console.log(sender, senderBold.innerText);\n dom.lastMessageSpan.prepend(senderBold);\n } //////// else console.log('no sender', lastMessage, peerId);\n }\n }\n\n if(!lastMessage.deleted || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null) {\n if(setUnread) {\n this.setUnreadMessages(dialog, dom, isBatch);\n } else { // means search\n dom.listEl.dataset.mid = lastMessage.mid;\n }\n }\n }\n\n private setUnreadMessages(dialog: Dialog, dom = this.getDialogDom(dialog.peerId), isBatch = false) {\n if(!dom) {\n //this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n if(!isBatch) {\n const isMuted = appNotificationsManager.isPeerLocalMuted(dialog.peerId, true);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n if(isMuted !== wasMuted) {\n SetTransition(dom.listEl, 'is-muted', isMuted, 200);\n }\n }\n\n let setStatusMessage: MyMessage;\n if(dialog.draft?._ !== 'draftMessage') {\n const lastMessage: MyMessage = appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!lastMessage.deleted && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n }\n\n setSendingStatus(dom.statusSpan, setStatusMessage, true);\n\n const filter = appMessagesManager.filtersStorage.getFilter(this.filterId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(dialog.peerId) !== -1;\n } else {\n isPinned = !!dialog.pFlags.pinned;\n }\n\n const isDialogUnread = appMessagesManager.isDialogUnread(dialog);\n const hasUnreadBadge = isPinned || isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n const isUnreadBadgeMounted = isInDOM(dom.unreadBadge);\n if(hasUnreadBadge && !isUnreadBadgeMounted) {\n dom.subtitleEl.append(dom.unreadBadge);\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionBadgeMounted = dom.mentionsBadge && isInDOM(dom.mentionsBadge);\n if(hasMentionsBadge) {\n if(!dom.mentionsBadge) {\n dom.mentionsBadge = document.createElement('div');\n dom.mentionsBadge.className = 'dialog-subtitle-badge badge badge-24 mention mention-badge';\n dom.mentionsBadge.innerText = '@';\n dom.subtitleEl.insertBefore(dom.mentionsBadge, dom.lastMessageSpan.nextSibling);\n }\n }\n\n const transitionDuration = isBatch ? 0 : 200;\n\n SetTransition(dom.unreadBadge, 'is-visible', hasUnreadBadge, transitionDuration, hasUnreadBadge ? undefined : () => {\n dom.unreadBadge.remove();\n }, !isUnreadBadgeMounted ? 2 : 0);\n\n if(dom.mentionsBadge) {\n SetTransition(dom.mentionsBadge, 'is-visible', hasMentionsBadge, transitionDuration, hasMentionsBadge ? undefined : () => {\n dom.mentionsBadge.remove();\n delete dom.mentionsBadge;\n }, !isMentionBadgeMounted ? 2 : 0);\n }\n\n if(!hasUnreadBadge) {\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false;\n if(dialog.unread_mentions_count && dialog.unread_count === 1) {\n dom.unreadBadge.innerText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n //dom.unreadMessagesSpan.innerText = '' + (dialog.unread_count ? formatNumber(dialog.unread_count, 1) : ' ');\n dom.unreadBadge.innerText = '' + (dialog.unread_count || ' ');\n } else {\n dom.unreadBadge.innerText = '';\n isUnread = false;\n }\n\n dom.unreadBadge.classList.toggle('unread', isUnread);\n dom.unreadBadge.classList.toggle('mention', isMention);\n }\n\n private getDialogDom(peerId: PeerId) {\n // return this.doms[peerId];\n const element = this.sortedList.get(peerId);\n return element?.dom;\n }\n\n private getDialog(dialog: Dialog | PeerId): Dialog {\n if(typeof(dialog) !== 'object') {\n const originalDialog = appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any;\n }\n\n return originalDialog;\n }\n \n return dialog as Dialog;\n }\n\n private setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition(dom.callIcon.canvas, 'is-visible', visible, 200, visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n }, visible ? 2 : 0);\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n const dialog = this.getDialog(options.dialog);\n\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = dialog;\n const isMuted = appNotificationsManager.isPeerLocalMuted(peerId, true);\n if(isMuted) {\n ret.dom.listEl.classList.add('is-muted');\n }\n\n if(!peerId.isUser()) {\n this.processDialogForCallStatus(dialog, ret.dom);\n }\n\n this.setLastMessage(dialog, undefined, ret.dom, undefined, options.loadPromises, options.isBatch, true);\n }\n\n return ret;\n }\n\n private processDialogForCallStatus(dialog: Dialog, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(dialog.peerId);\n if(!dom) return;\n \n const chat: Chat.chat | Chat.channel = appChatsManager.getChat(dialog.peerId.toChatId());\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage, \n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = appDialogsManager.addDialogNew({\n ...options,\n ...appMessagesManager.getMessageSenderPeerIdOrName(message),\n dialog: this.getDialog(peerId),\n });\n\n this.setLastMessage(ret.dialog, message, ret.dom, query);\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: {\n dialog: Parameters[0],\n container?: Parameters[1],\n drawStatus?: boolean,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n append?: boolean,\n avatarSize?: number,\n autonomous?: boolean,\n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n }) {\n return this.addDialog(options.dialog, options.container, options.drawStatus, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName);\n }\n\n public addDialog(\n _dialog: Parameters[0], \n container?: HTMLElement | Scrollable | DocumentFragment | false, \n drawStatus = true, \n rippleEnabled = true, \n onlyFirstName = false, \n meAsSaved = true, \n append = true, \n avatarSize = 54, \n autonomous = !!container, \n lazyLoadQueue?: LazyLoadQueueIntersector,\n loadPromises?: Promise[],\n fromName?: string\n ) {\n const dialog = this.getDialog(_dialog);\n const peerId = dialog.peerId;\n\n const avatarEl = new AvatarElement();\n avatarEl.loadPromises = loadPromises;\n avatarEl.lazyLoadQueue = lazyLoadQueue;\n avatarEl.setAttribute('dialog', meAsSaved ? '1' : '0');\n if(fromName !== undefined) avatarEl.setAttribute('peer-title', fromName);\n avatarEl.setAttribute('peer', '' + peerId);\n avatarEl.classList.add('dialog-avatar', 'avatar-' + avatarSize);\n\n if(drawStatus && peerId !== rootScope.myId && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user.status?._ === 'userStatusOnline') {\n this.setOnlineStatus(avatarEl, true);\n }\n }\n\n const captionDiv = document.createElement('div');\n captionDiv.classList.add('user-caption');\n\n const titleSpanContainer = document.createElement('span');\n titleSpanContainer.classList.add('user-title');\n\n const peerTitle = new PeerTitle({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n plainText: false\n });\n\n titleSpanContainer.append(peerTitle.element);\n //p.classList.add('')\n\n // в других случаях иконка верификации не нужна (а первый - это главные чатлисты)\n //if(!container) {\n \n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n \n const peer = appPeersManager.getPeer(peerId);\n if(peer?.pFlags?.verified) {\n titleSpanContainer.append(generateVerifiedIcon());\n }\n //}\n \n const span = document.createElement('span');\n span.classList.add('user-last-message');\n span.setAttribute('dir', 'auto');\n\n //captionDiv.append(titleSpan);\n //captionDiv.append(span);\n\n const li = document.createElement('li');\n li.classList.add('chatlist-chat');\n if(rippleEnabled) {\n ripple(li);\n }\n\n li.append(avatarEl, captionDiv);\n li.dataset.peerId = '' + peerId;\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const unreadBadge = document.createElement('div');\n unreadBadge.className = 'dialog-subtitle-badge badge badge-24';\n\n const titleP = document.createElement('p');\n titleP.classList.add('dialog-title');\n\n const rightSpan = document.createElement('span');\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n titleP.append(titleSpanContainer, rightSpan);\n\n const subtitleEl = document.createElement('p');\n subtitleEl.classList.add('dialog-subtitle');\n subtitleEl.append(span);\n\n captionDiv.append(titleP, subtitleEl);\n\n const dom: DialogDom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n unreadBadge,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl\n };\n\n /* let good = false;\n for(const folderId in this.chatLists) {\n if(this.chatLists[folderId] === container) {\n good = true;\n }\n } */\n if(container) {\n const method = append ? 'append' : 'prepend';\n container[method](li);\n }\n\n if(!autonomous) {\n // @ts-ignore\n li.dialogDom = dom;\n\n if(appImManager.chat?.peerId === peerId) {\n this.setDialogActive(li, true);\n }\n } \n \n return {dom, dialog};\n }\n\n public setTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = appImManager.getPeerTyping(dialog.peerId, oldTypingElement);\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: Dialog) {\n const dom = this.getDialogDom(dialog.peerId);\n if(!dom) {\n return;\n }\n\n dom.lastMessageSpan.classList.remove('user-typing');\n this.setLastMessage(dialog, null, dom, undefined, undefined, undefined, null);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class PasswordManager {\r\n public getState(): Promise {\r\n return apiManager.invokeApi('account.getPassword').then((result) => {\r\n return result;\r\n });\r\n }\r\n\r\n public updateSettings(settings: {\r\n hint?: string,\r\n email?: string,\r\n newPassword?: string,\r\n currentPassword?: string\r\n } = {}) {\r\n //state = Object.assign({}, state);\r\n //state.new_algo = Object.assign({}, state.new_algo);\r\n\r\n return this.getState().then(state => {\r\n let currentHashPromise: Promise;\r\n let newHashPromise: Promise;\r\n const params: AccountUpdatePasswordSettings = {\r\n password: null,\r\n new_settings: {\r\n _: 'account.passwordInputSettings',\r\n hint: settings.hint,\r\n email: settings.email\r\n }\r\n };\r\n \r\n if(settings.currentPassword) {\r\n currentHashPromise = apiManager.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\r\n } else {\r\n currentHashPromise = Promise.resolve({\r\n _: 'inputCheckPasswordEmpty'\r\n });\r\n }\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\r\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\r\n salt1.randomize();\r\n salt1.set(newAlgo.salt1, 0);\r\n newAlgo.salt1 = salt1;\r\n \r\n if(settings.newPassword) {\r\n newHashPromise = apiManager.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\r\n } else {\r\n newHashPromise = Promise.resolve(new Uint8Array());\r\n }\r\n \r\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\r\n params.password = hashes[0];\r\n params.new_settings.new_algo = newAlgo;\r\n params.new_settings.new_password_hash = hashes[1];\r\n \r\n return apiManager.invokeApi('account.updatePasswordSettings', params);\r\n });\r\n });\r\n }\r\n\r\n public check(password: string, state: AccountPassword, options: any = {}) {\r\n return apiManager.invokeCrypto('computeSRP', password, state, false).then((inputCheckPassword) => {\r\n //console.log('SRP', inputCheckPassword);\r\n return apiManager.invokeApi('auth.checkPassword', {\r\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\r\n }, options).then(auth => {\r\n if(auth._ === 'auth.authorization') {\r\n apiManager.setUser(auth.user);\r\n }\r\n\r\n return auth;\r\n });\r\n });\r\n }\r\n\r\n public confirmPasswordEmail(code: string) {\r\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\r\n }\r\n\r\n public resendPasswordEmail() {\r\n return apiManager.invokeApi('account.resendPasswordEmail');\r\n }\r\n\r\n public cancelPasswordEmail() {\r\n return apiManager.invokeApi('account.cancelPasswordEmail');\r\n }\r\n\r\n /* public requestRecovery(options: any = {}) {\r\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\r\n }\r\n\r\n public recover(code: any, options: any = {}) {\r\n return apiManager.invokeApi('auth.recoverPassword', {\r\n code\r\n }, options);\r\n } */\r\n}\r\n\r\nconst passwordManager = new PasswordManager();\r\nMOUNT_CLASS_TO.passwordManager = passwordManager;\r\nexport default passwordManager;\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/15.e99c07b61f679564532a.chunk.js b/public/15.b14001265d6da1e62429.chunk.js similarity index 99% rename from public/15.e99c07b61f679564532a.chunk.js rename to public/15.b14001265d6da1e62429.chunk.js index 0d3e84e83..af452cad7 100644 --- a/public/15.e99c07b61f679564532a.chunk.js +++ b/public/15.b14001265d6da1e62429.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[15,18,20],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),o=n(9),a=n(16),r=n(33),c=n(15),l=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==a.default.lastRequestedLangCode?Promise.all([e,a.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),a.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=a.default.strings.get(e.key);t&&(r.push(t),a.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{a.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),a.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},109:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(79),s=n(85),o=n(0),a=n(40);class r extends a.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let n;o.IS_APPLE?n=-.16*e:o.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let a,r,c,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(s.a)(this.value),a=i.formatted,r=i.country,l=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=a?"+"+a:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),o=n(1),a=n(15),r=n(71);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const a=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let f=!1;if(o.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!a.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),s=n(46),o=n(17),a=n(33),r=n(32),c=n(69),l=n(40),d=n(50),u=n(34),h=n(83),p=n(1),m=n(7),f=n(16),g=n(54),v=n(18),b=n(60),y=n(6),w=n(61),E=n(92),L=n(127),S=n(22),O=n(102),_=n(5),T=n(30),k=n(36),x=n(53),j=n(62),A=n(79),P=n(99),I=n(57),C=n(87),R=n(15),D=n(109),M=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let U,B=null;const N=new c.a("page-sign",!0,()=>{const e=()=>{t=f.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),R.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,V;const q=document.createElement("div");q.classList.add("input-wrapper");const F=new l.b({label:"Login.CountrySelectorLabel",name:Object(w.b)()});F.container.classList.add("input-select");const X=F.input,Q=document.createElement("div");Q.classList.add("select-wrapper","z-depth-3","hide");const K=document.createElement("span");K.classList.add("arrow","arrow-down"),F.container.append(K);const W=document.createElement("ul");Q.appendChild(W);new s.b(Q);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(P.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const s=document.createElement("li");let o=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=o,s.append(e)}else s.innerHTML=o;const a=Object(f.i18n)(e.default_name);a.dataset.defaultName=e.default_name,s.append(a);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,s.appendChild(c),n.push(s),W.append(s)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");$(t)}),F.container.appendChild(Q)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,s=i.replace(/\D/g,"");Object(k.a)(X,Object(f.i18n)(n)),Object(I.a)(X,"input"),v=t.find(e=>e.default_name===n),V=v.country_codes.find(e=>e.country_code===s),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(A.a)(te,!0)},0)};let z;Y(),X.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(z),z=void 0,Q.classList.remove("hide"),Q.offsetWidth,Q.classList.add("active"),F.select(),Object(h.b)({container:N.pageEl.parentElement.parentElement,element:X,position:"start",margin:4}),setTimeout(()=>{J||(document.addEventListener("mousedown",G,{capture:!0}),J=!0)},0)}));let J=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==X&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),J=!1)},Z=()=>{void 0===z&&(Q.classList.remove("active"),z=window.setTimeout(()=>{Q.classList.add("hide"),z=void 0},200))};X.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=F.value.toLowerCase(),s=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&s.push(e)}),0===s.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===s.length&&"Enter"===n&&$(c.get(s[0].iso2)[0])}),K.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),X.matches(":focus")?X.blur():X.focus()}));const ee=new D.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===F.value||v&&t&&n&&(v===t||V.country_code===n.country_code)||(Object(k.a)(X,t?Object(f.i18n)(t.default_name):i),v=t,V=n),t||ee.value.length-1>1?B.style.visibility="":B.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!B.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;o.default.pushToState("keepSigned",e),E.a.toggleStorage(e),L.a.toggleStorage(e),a.a.toggleStorage(e),j.a.toggleStorage(e)}),o.default.getState().then(e=>{o.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),B=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),B.style.visibility="hidden";const ie=e=>{e&&Object(_.a)(e);const t=Object(x.a)([B,U],!0);Object(k.a)(B,Object(f.i18n)("PleaseWait")),Object(i.f)(B);let s=ee.value;a.a.invokeApi("auth.sendCode",{phone_number:s,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:s})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(k.a)(ee.label,Object(f.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(k.a)(B,Object(f.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),B.innerText=e.type}})};Object(T.b)(B,ie),U=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});U.addEventListener("click",()=>{S.default.mount()}),q.append(F.container,ee.container,ne.label,B,U);const se=document.createElement("h4");se.classList.add("text-center"),Object(f._i18n)(se,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(f._i18n)(oe,"Login.StartText"),N.pageEl.querySelector(".container").append(se,oe,q);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(q),a.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=C.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&f.default.getLangPack(n.lang_code).then(()=>{Object(I.a)(te,"input")});const i=new Set([1,2,3,4,5]),s=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=a.a.getNetworker(e.nearest_dc).then(()=>{s.push(e.nearest_dc)})),(o||Promise.resolve()).then(()=>{s.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield j.a.get(i))return t();setTimeout(()=>{a.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{F.value.length||ee.value.length||$(c.get(e.country)[0])})},()=>{B&&(Object(k.a)(B,Object(f.i18n)("Login.Next")),Object(v.ripple)(B,void 0,void 0,!0),B.removeAttribute("disabled")),U&&U.removeAttribute("disabled"),o.default.pushToState("authState",{_:"authStateSignIn"})});t.default=N},22:function(e,t,n){"use strict";n.r(t);var i=n(33),s=n(69),o=n(78),a=n(56),r=n(7),c=n(34),l=n(16),d=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let v;const b=new s.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=b.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(d),Object(p.a)(s);const y=e.parentElement,w=document.createElement("h4");Object(l._i18n)(w,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),E.append(t)}),y.append(w,E,s),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),S=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let S=!1;u.default.addEventListener("user_auth",()=>{S=!0,v=null},{once:!0});let O,_={ignoreErrors:!0};const T=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(a.b)(O,c.token)){O=c.token;let n=Object(a.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const s=window.getComputedStyle(document.documentElement),o=s.getPropertyValue("--surface-color").trim(),r=s.getPropertyValue("--primary-text-color").trim(),l=s.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:d,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(s){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),S=!0,v=null;break;default:console.error("pageSignQR: default error:",e),S=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(S=!1;!S&&!(yield T(!0)););}))}))),v.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return w})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return O}));var i=n(29),s=n(5),o=n(30),a=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,b=null;function y(e,t){f(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,e=>{Object(s.a)(e),m()})),g.parentElement.insertBefore(b,g),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=a.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),g&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},46:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var i=n(1),s=n(37),o=n(83),a=n(77),r=n(5);class c{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(t?"-"+t:""),s.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(a.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(o.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class l extends c{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollTop;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends c{constructor(e,t="",n=300,s=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=n,this.splitCount=s,this.container=o,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(37),a=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),s=n(31),o=n(18),a=n(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const o=Object(s.d)(t,e.stateKey);let a;a=e.stateValues?1===e.stateValues.indexOf(o):o,this.setValueSilently(a),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(a._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const s=document.createElement("div");s.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,s,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(o.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(a(s>>>18&63),a(s>>>12&63),a(s>>>6&63),a(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function a(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=l(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),s=n(45),o=n(29),a=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},78:function(e,t,n){"use strict";var i=n(29),s=n(62),o=n(33);const a=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=a),t.a=a},79:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(1);function s(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(n)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},85:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const s=new Map;let o=0;const a=(e,t,n="")=>{n=t.country_code+n,o=Math.max(o,n.length),s.set(n,{country:e,code:t})};function r(e){e=e||"",s.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{a(e,t,n)}):a(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,o);for(let e=r.length-1;e>=0&&(t=s.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const c=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=l.length-1;e>=0;--e){u=l[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=u&&u.length>n.length?u.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:c,code:t.code,leftPattern:m}}}}]); -//# sourceMappingURL=15.e99c07b61f679564532a.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[15,18,20],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),s=n(30),o=n(9),a=n(16),r=n(33),c=n(15),l=n(34),d=n(35);let u,h=!1;function p(e){h||(u||(u=r.a.getConfig().then(e=>e.suggested_lang_code!==a.default.lastRequestedLangCode?Promise.all([e,a.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),a.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const r=[];n.forEach(e=>{const t=a.default.strings.get(e.key);t&&(r.push(t),a.default.strings.set(e.key,e))});const u=Object(l.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(o.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),r.forEach(e=>{a.default.strings.set(e.key,e)}),Object(s.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(d.f)(u),a.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},109:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(79),s=n(85),o=n(0),a=n(40);class r extends a.b{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");let t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let n;o.IS_APPLE?n=-.16*e:o.IS_ANDROID&&(n=0),t.style.setProperty("--letter-spacing",n+"px")}const n=this.setValueSilently.bind(this);this.setValueSilently=e=>{n(e),Object(i.a)(this.input,!0)}}t.addEventListener("input",()=>{t.classList.remove("error");const n=this.value;let i;Math.abs(n.length-this.lastValue.length)>1&&!this.pasted&&o.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+n),this.pasted=!1,this.setLabel();let a,r,c,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(i=Object(s.a)(this.value),a=i.formatted,r=i.country,l=i.leftPattern,c=i.code,this.setValueSilently(this.lastValue=a?"+"+a:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(i)}),t.addEventListener("paste",()=>{this.pasted=!0}),t.addEventListener("keypress",e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1})}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),o=n(1),a=n(15),r=n(72);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const a=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let f=!1;if(o.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!a.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},20:function(e,t,n){"use strict";n.r(t);var i=n(35),s=n(46),o=n(17),a=n(33),r=n(32),c=n(69),l=n(40),d=n(50),u=n(34),h=n(83),p=n(1),m=n(7),f=n(16),g=n(54),v=n(18),b=n(60),y=n(6),w=n(61),E=n(92),L=n(127),S=n(22),O=n(102),_=n(5),T=n(30),k=n(36),x=n(53),j=n(62),A=n(79),P=n(99),I=n(57),C=n(87),R=n(15),D=n(109),M=n(10),H=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let U,B=null;const N=new c.a("page-sign",!0,()=>{const e=()=>{t=f.default.countriesList.filter(e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)}).sort((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name))};let t;e(),R.default.addEventListener("language_change",()=>{e()});const c=new Map;let v,V;const q=document.createElement("div");q.classList.add("input-wrapper");const F=new l.b({label:"Login.CountrySelectorLabel",name:Object(w.b)()});F.container.classList.add("input-select");const X=F.input,Q=document.createElement("div");Q.classList.add("select-wrapper","z-depth-3","hide");const K=document.createElement("span");K.classList.add("arrow","arrow-down"),F.container.append(K);const W=document.createElement("ul");Q.appendChild(W);new s.b(Q);let Y=()=>{Y=null,t.forEach(e=>{const t=Object(P.c)(e.iso2),n=[];e.country_codes.forEach(i=>{const s=document.createElement("li");let o=r.a.wrapEmojiText(t);if(M.a){const e=document.createElement("span");e.innerHTML=o,s.append(e)}else s.innerHTML=o;const a=Object(f.i18n)(e.default_name);a.dataset.defaultName=e.default_name,s.append(a);const c=document.createElement("span");c.classList.add("phone-code"),c.innerText="+"+i.country_code,s.appendChild(c),n.push(s),W.append(s)}),c.set(e.iso2,n)}),W.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(b.a)(e.target,"LI");$(t)}),F.container.appendChild(Q)};const $=e=>{const n=e.childNodes[1].dataset.defaultName,i=e.querySelector(".phone-code").innerText,s=i.replace(/\D/g,"");Object(k.a)(X,Object(f.i18n)(n)),Object(I.a)(X,"input"),v=t.find(e=>e.default_name===n),V=v.country_codes.find(e=>e.country_code===s),ee.value=ee.lastValue=i,Z(),setTimeout(()=>{te.focus(),Object(A.a)(te,!0)},0)};let z;Y(),X.addEventListener("focus",(function(e){Y?Y():t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(z),z=void 0,Q.classList.remove("hide"),Q.offsetWidth,Q.classList.add("active"),F.select(),Object(h.b)({container:N.pageEl.parentElement.parentElement,element:X,position:"start",margin:4}),setTimeout(()=>{J||(document.addEventListener("mousedown",G,{capture:!0}),J=!0)},0)}));let J=!1;const G=e=>{Object(y.a)(e.target,"input-select")||e.target!==X&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),J=!1)},Z=()=>{void 0===z&&(Q.classList.remove("active"),z=window.setTimeout(()=>{Q.classList.add("hide"),z=void 0},200))};X.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let i=F.value.toLowerCase(),s=[];t.forEach(e=>{let t=!![e.name,e.default_name].filter(Boolean).find(e=>-1!==e.toLowerCase().indexOf(i));c.get(e.iso2).forEach(e=>e.style.display=t?"":"none"),t&&s.push(e)}),0===s.length?t.forEach(e=>{c.get(e.iso2).forEach(e=>e.style.display="")}):1===s.length&&"Enter"===n&&$(c.get(s[0].iso2)[0])}),K.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),X.matches(":focus")?X.blur():X.focus()}));const ee=new D.a({onInput:e=>{g.a.loadLottieWorkers();const{country:t,code:n}=e||{};let i=t?t.name||t.default_name:"";i===F.value||v&&t&&n&&(v===t||V.country_code===n.country_code)||(Object(k.a)(X,t?Object(f.i18n)(t.default_name):i),v=t,V=n),t||ee.value.length-1>1?B.style.visibility="":B.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!B.style.visibility&&"Enter"===e.key)return ie()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.checked;o.default.pushToState("keepSigned",e),E.a.toggleStorage(e),L.a.toggleStorage(e),a.a.toggleStorage(e),j.a.toggleStorage(e)}),o.default.getState().then(e=>{o.default.storage.isAvailable()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),B=Object(u.a)("btn-primary btn-color-primary",{text:"Login.Next"}),B.style.visibility="hidden";const ie=e=>{e&&Object(_.a)(e);const t=Object(x.a)([B,U],!0);Object(k.a)(B,Object(f.i18n)("PleaseWait")),Object(i.f)(B);let s=ee.value;a.a.invokeApi("auth.sendCode",{phone_number:s,api_id:m.a.id,api_hash:m.a.hash,settings:{_:"codeSettings"}}).then(e=>{n.e(23).then(n.bind(null,23)).then(t=>t.default.mount(Object.assign(e,{phone_number:s})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(k.a)(ee.label,Object(f.i18n)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(k.a)(B,Object(f.i18n)("Login.Next"));break;default:console.error("auth.sendCode error:",e),B.innerText=e.type}})};Object(T.b)(B,ie),U=Object(u.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});U.addEventListener("click",()=>{S.default.mount()}),q.append(F.container,ee.container,ne.label,B,U);const se=document.createElement("h4");se.classList.add("text-center"),Object(f._i18n)(se,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(f._i18n)(oe,"Login.StartText"),N.pageEl.querySelector(".container").append(se,oe,q);p.IS_TOUCH_SUPPORTED||setTimeout(()=>{te.focus()},0),Object(O.a)(q),a.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=C.a.getFromCache("langPack");n&&!(null===(t=n.countries)||void 0===t?void 0:t.hash)&&f.default.getLangPack(n.lang_code).then(()=>{Object(I.a)(te,"input")});const i=new Set([1,2,3,4,5]),s=[e.this_dc];let o;return e.nearest_dc!==e.this_dc&&(o=a.a.getNetworker(e.nearest_dc).then(()=>{s.push(e.nearest_dc)})),(o||Promise.resolve()).then(()=>{s.forEach(e=>{i.delete(e)});const e=[...i],t=()=>H(void 0,void 0,void 0,(function*(){const n=e.shift();if(!n)return;const i=`dc${n}_auth_key`;if(yield j.a.get(i))return t();setTimeout(()=>{a.a.getNetworker(n).finally(t)},3e3)}));t()}),e}).then(e=>{F.value.length||ee.value.length||$(c.get(e.country)[0])})},()=>{B&&(Object(k.a)(B,Object(f.i18n)("Login.Next")),Object(v.ripple)(B,void 0,void 0,!0),B.removeAttribute("disabled")),U&&U.removeAttribute("disabled"),o.default.pushToState("authState",{_:"authStateSignIn"})});t.default=N},22:function(e,t,n){"use strict";n.r(t);var i=n(33),s=n(69),o=n(78),a=n(56),r=n(7),c=n(34),l=n(16),d=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(s,o){function a(e){try{c(i.next(e))}catch(e){o(e)}}function r(e){try{c(i.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((i=i.apply(e,t||[])).next())}))};let v;const b=new s.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=b.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const s=document.createElement("div");s.classList.add("input-wrapper");const d=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});s.append(d),Object(p.a)(s);const y=e.parentElement,w=document.createElement("h4");Object(l._i18n)(w,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(l.i18n)(e)),E.append(t)}),y.append(w,E,s),d.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),S=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let S=!1;u.default.addEventListener("user_auth",()=>{S=!0,v=null},{once:!0});let O,_={ignoreErrors:!0};const T=s=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:r.a.id,api_hash:r.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!O||!Object(a.b)(O,c.token)){O=c.token;let n=Object(a.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const s=window.getComputedStyle(document.documentElement),o=s.getPropertyValue("--surface-color").trim(),r=s.getPropertyValue("--primary-text-color").trim(),l=s.getPropertyValue("--primary-color").trim(),d=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${l}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:d,dotsOptions:{color:r,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:o},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(s){let e=Date.now()/1e3,t=c.expires-e-o.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),S=!0,v=null;break;default:console.error("pageSignQR: default error:",e),S=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(S=!1;!S&&!(yield T(!0)););}))}))),v.then(e=>{e()}),d.default.pushToState("authState",{_:"authStateSignQr"})});t.default=b},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return y})),n.d(t,"e",(function(){return w})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return O}));var i=n(29),s=n(5),o=n(30),a=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),b&&b.remove(),g=null,l.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,b=null;function y(e,t){f(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),b||(b=document.createElement("div"),b.classList.add("btn-menu-overlay"),b.addEventListener(o.a,e=>{Object(s.a)(e),m()})),g.parentElement.insertBefore(b,g),v=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function w({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=a.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function S(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function O(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{E?r():(t(o.touches[0]),r(),g&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},46:function(e,t,n){"use strict";n.d(t,"b",(function(){return l})),n.d(t,"a",(function(){return d}));var i=n(1),s=n(37),o=n(83),a=n(77),r=n(5);class c{constructor(e,t="",n=document.createElement("div")){this.el=e,this.container=n,this.onScrollMeasure=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.container.classList.add("scrollable"),this.log=Object(s.b)("SCROLL"+(t?"-"+t:""),s.a.Error),e&&(Array.from(e.children).forEach(e=>this.container.append(e)),e.append(this.container))}setListeners(){window.addEventListener("resize",this.onScroll,{passive:!0}),this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}),Object(a.a)(()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.needCheckAfterAnimation=!0,window.cancelAnimationFrame(this.onScrollMeasure))},()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})}append(e){this.container.append(e)}scrollIntoViewNew(e){return Object(o.b)(Object.assign(Object.assign({},e),{container:this.container}))}}class l extends c{constructor(e,t="",n=300,i){super(e,t),this.onScrollOffset=n,this.lastScrollTop=0,this.lastScrollDirection=0,this.loadedAll={top:!0,bottom:!1},this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure&&window.cancelAnimationFrame(this.onScrollMeasure),this.onScrollMeasure=window.requestAnimationFrame(()=>{this.onScrollMeasure=0;const e=this.container.scrollTop;this.lastScrollDirection=this.lastScrollTop===e?0:this.lastScrollTop{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,n=this.lastScrollTop;this.onScrolledTop&&n<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-n<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners()}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}get scrollHeight(){return this.container.scrollHeight}}class d extends c{constructor(e,t="",n=300,s=15,o=document.createElement("div")){if(super(e,t,o),this.onScrollOffset=n,this.splitCount=s,this.container=o,this.container.classList.add("scrollable-x"),!i.IS_TOUCH_SUPPORTED){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,Object(r.a)(e))};this.container.addEventListener("wheel",e,{passive:!1})}}}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(37),a=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},50:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(17),s=n(31),o=n(18),a=n(16);class r{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0);const n=this.input=document.createElement("input");let r;if(n.classList.add("checkbox-field-input"),n.type="checkbox",e.name&&(n.id="input-"+e.name),e.checked&&(n.checked=!0),e.stateKey&&i.default.getState().then(t=>{const o=Object(s.d)(t,e.stateKey);let a;a=e.stateValues?1===e.stateValues.indexOf(o):o,this.setValueSilently(a),n.addEventListener("change",()=>{let t;t=e.stateValues?e.stateValues[n.checked?1:0]:n.checked,i.default.setByKey(e.stateKey,t)})}),e.text?(r=this.span=document.createElement("span"),r.classList.add("checkbox-caption"),Object(a._i18n)(r,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(n),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.classList.add("checkbox-box-check"),n.setAttributeNS(null,"viewBox","0 0 24 24");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#check"),i.setAttributeNS(null,"x","-1"),n.append(i);const s=document.createElement("div");s.classList.add("checkbox-box-background");const o=document.createElement("div");o.classList.add("checkbox-box-border"),e.append(o,s,n),t.append(e)}r&&t.append(r),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),Object(o.ripple)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},53:function(e,t,n){"use strict";function i(e,t){return t?e.forEach(e=>e.setAttribute("disabled","true")):e.forEach(e=>e.removeAttribute("disabled")),()=>i(e,!t)}n.d(t,"a",(function(){return i}))},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-o!=1||(n+=String.fromCharCode(a(s>>>18&63),a(s>>>12&63),a(s>>>6&63),a(63&s)),s=0);return n.replace(/A(?=A$|$)/g,"=")}function a(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function r(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=l(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return s})),n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return r})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return l})),n.d(t,"a",(function(){return d})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},60:function(e,t,n){"use strict";function i(e,t){return e.closest(t)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),s=n(45),o=n(29),a=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},78:function(e,t,n){"use strict";var i=n(29),s=n(62),o=n(33);const a=new class{constructor(){this.serverTimeOffset=0,s.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),o.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=a),t.a=a},79:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(1);function s(e,t=!1){if(!i.IS_TOUCH_SUPPORTED||t&&document.activeElement===e)if(e.focus(),void 0!==window.getSelection&&void 0!==document.createRange){var n=document.createRange();n.selectNodeContents(e),n.collapse(!1);var s=window.getSelection();s.removeAllRanges(),s.addRange(n)}else if(void 0!==document.body.createTextRange){var o=document.body.createTextRange();o.moveToElementText(e),o.collapse(!1),o.select()}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},85:function(e,t,n){"use strict";n.d(t,"a",(function(){return r}));var i=n(16);const s=new Map;let o=0;const a=(e,t,n="")=>{n=t.country_code+n,o=Math.max(o,n.length),s.set(n,{country:e,code:t})};function r(e){e=e||"",s.size||i.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(n=>{a(e,t,n)}):a(e,t)})});let t,n=e.replace(/\D/g,""),r=n.slice(0,o);for(let e=r.length-1;e>=0&&(t=s.get(r.slice(0,e+1)),!t);--e);if(!t)return{formatted:n,country:void 0,code:void 0,leftPattern:""};const c=t.country,l=t.code.patterns||[],d=n.slice(t.code.country_code.length);let u="",h=0,p="";for(let e=l.length-1;e>=0;--e){u=l[e];const t=u.replace(/ /g,"");let n=0;for(let e=0,i=Math.min(d.length,t.length);eh&&(h=n,p=u)}u=p||u,u=u.replace(/\d/g,"X"),u=t.code.country_code+" "+u,u.split("").forEach((e,t)=>{" "===e&&" "!==n[t]&&n.length>t&&(n=n.slice(0,t)+" "+n.slice(t))});let m=u&&u.length>n.length?u.slice(n.length):"";return m&&(m=m.replace(/X/g,"‒")),{formatted:n,country:c,code:t.code,leftPattern:m}}}}]); +//# sourceMappingURL=15.b14001265d6da1e62429.chunk.js.map \ No newline at end of file diff --git a/public/15.e99c07b61f679564532a.chunk.js.map b/public/15.b14001265d6da1e62429.chunk.js.map similarity index 99% rename from public/15.e99c07b61f679564532a.chunk.js.map rename to public/15.b14001265d6da1e62429.chunk.js.map index aa455da08..cd2013541 100644 --- a/public/15.e99c07b61f679564532a.chunk.js.map +++ b/public/15.b14001265d6da1e62429.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","TelInputField","options","super","label","name","pasted","lastValue","this","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","test","metaKey","ctrlKey","shiftKey","preventDefault","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","height","width","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","cancelBubble","stopPropagation","passive","button","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","display","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","_value","toLowerCase","matches","good","Boolean","indexOf","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","imageDiv","preloader","btnBack","helpList","stop","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","animation","children","Array","from","slice","timestamp","diff","expires","serverTimeOffset","warn","handled","func","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","putPreloader","returnDiv","html","div","insertAdjacentHTML","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","timeout","onCancel","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","log","Error","onScroll","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","lastScrollTop","lastScrollDirection","loadedAll","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","round","offsetHeight","getDistanceToEnd","ScrollableX","splitCount","scrollHorizontally","deltaX","clientWidth","scrollLeft","deltaY","appNavigationController","navigations","manual","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","disable","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","bytesFromWordss","o","bytesToWordss","words","Uint32Array","simulateEvent","findUpTag","tag","closest","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","createTextRange","textRange","moveToElementText","isSwipingBackSafari","TouchEvent","prefixes","maxPrefixLength","setPrefix","prefix","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx"],"mappings":"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","file":"15.e99c07b61f679564532a.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/telInputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignIn.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/scrollable.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/components/checkboxField.ts","webpack:///./src/helpers/dom/toggleDisability.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/dom/findUpTag.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/placeCaretAtEnd.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/helpers/formatPhoneNumber.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","TelInputField","options","super","label","name","pasted","lastValue","this","container","add","telEl","input","HTMLInputElement","type","autocomplete","inputMode","pixelRatio","devicePixelRatio","letterSpacing","style","setProperty","originalFunc","setValueSilently","bind","value","formattedPhoneNumber","Math","abs","length","setLabel","formatted","country","countryCode","leftPattern","code","dataset","onInput","test","metaKey","ctrlKey","shiftKey","preventDefault","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","height","width","x","y","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","cancelBubble","stopPropagation","passive","button","btnQr","btnNext","page","setCountries","countries","countriesList","filter","pFlags","hidden","sort","a","b","default_name","localeCompare","liMap","Map","lastCountrySelected","lastCountryCodeSelected","inputWrapper","countryInputField","countryInput","selectWrapper","arrowDown","selectList","appendChild","initSelect","c","emoji","iso2","liArr","country_codes","li","wrapped","wrapEmojiText","spanEmoji","innerHTML","el","defaultName","span","innerText","country_code","selectCountryByTarget","childNodes","phoneCode","find","_countryCode","telInputField","hidePicker","focus","hideTimeout","display","clearTimeout","undefined","offsetWidth","select","pageEl","parentElement","element","position","margin","mouseDownHandlerAttached","onMouseDown","capture","_value","toLowerCase","matches","good","Boolean","indexOf","blur","loadLottieWorkers","countryName","visibility","onSubmit","signedCheckboxField","withRipple","checked","keepSigned","pushToState","toggleStorage","getState","state","storage","isAvailable","toggle","phone_number","invokeApi","api_id","id","api_hash","hash","_","m","default","mount","Object","assign","catch","err","setError","console","error","h4","subtitle","nearestDcResult","langPack","getFromCache","lang_code","dcs","Set","done","this_dc","promise","nearest_dc","getNetworker","dcId","delete","_dcs","g","shift","dbKey","finally","removeAttribute","imageDiv","preloader","btnBack","helpList","stop","QRCodeStyling","prevToken","ignoreErrors","iterate","isLoop","loginToken","except_ids","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","reader","FileReader","onload","result","readAsDataURL","qrCode","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","backgroundOptions","qrOptions","errorCorrectionLevel","lastChild","_drawingPromise","race","_canvas","_image","animation","children","Array","from","slice","timestamp","diff","expires","serverTimeOffset","warn","handled","func","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","putPreloader","returnDiv","html","div","insertAdjacentHTML","setButtonLoader","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","attachContextMenuListener","removeManual","timeout","onCancel","ScrollableBase","logPrefix","onScrollMeasure","isHeavyAnimationInProgress","needCheckAfterAnimation","log","Error","onScroll","cancelAnimationFrame","Scrollable","onScrollOffset","withPaddingContainer","lastScrollTop","lastScrollDirection","loadedAll","onScrolledTop","onScrolledBottom","splitUp","onAdditionalScroll","scrollTop","checkForTriggers","maxScrollTop","clientHeight","setListeners","elements","padding","round","offsetHeight","getDistanceToEnd","ScrollableX","splitCount","scrollHorizontally","deltaX","clientWidth","scrollLeft","deltaY","appNavigationController","navigations","manual","debug","currentHash","location","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","noBlurOnPop","i","index","ret","findItemByType","backByItem","splice","noHistory","origin","pathname","single","CheckboxField","restriction","toggleDisability","stateKey","stateValue","stateValues","setByKey","textArgs","box","checkSvg","createElementNS","setAttributeNS","use","bg","border","withHover","event","Event","bubbles","cancelable","disable","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","bytesFromWordss","o","bytesToWordss","words","Uint32Array","simulateEvent","findUpTag","tag","closest","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","placeCaretAtEnd","ignoreTouchCheck","activeElement","getSelection","createRange","range","selectNodeContents","collapse","sel","removeAllRanges","addRange","createTextRange","textRange","moveToElementText","isSwipingBackSafari","TouchEvent","prefixes","maxPrefixLength","setPrefix","prefix","formatPhoneNumber","originalStr","prefixCountry","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","k","min","split","symbol","idx"],"mappings":"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","file":"15.b14001265d6da1e62429.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\nimport { formatPhoneNumber } from \"../helpers/formatPhoneNumber\";\nimport { IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n \n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n //plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n let telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n //console.log('input', this.value);\n telEl.classList.remove('error');\n \n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n \n this.pasted = false;\n \n this.setLabel();\n \n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n \n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n \n //console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n \n telEl.addEventListener('paste', () => {\n this.pasted = true;\n //console.log('paste', telEl.value);\n });\n \n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n \n telEl.addEventListener('keypress', (e) => {\n //console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n \n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { putPreloader } from \"../components/misc\";\r\nimport Scrollable from '../components/scrollable';\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from '../lib/richtextprocessor';\r\nimport Page from \"./page\";\r\nimport InputField from \"../components/inputField\";\r\nimport CheckboxField from \"../components/checkboxField\";\r\nimport Button from \"../components/button\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport App from \"../config/app\";\r\nimport I18n, { _i18n, i18n } from \"../lib/langPack\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { ripple } from \"../components/ripple\";\r\nimport findUpTag from \"../helpers/dom/findUpTag\";\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport { randomLong } from \"../helpers/random\";\r\nimport AppStorage from \"../lib/storage\";\r\nimport CacheStorageController from \"../lib/cacheStorage\";\r\nimport pageSignQR from \"./pageSignQR\";\r\nimport getLanguageChangeButton from \"../components/languageChangeButton\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport toggleDisability from \"../helpers/dom/toggleDisability\";\r\nimport sessionStorage from \"../lib/sessionStorage\";\r\nimport { DcAuthKey } from \"../types\";\r\nimport placeCaretAtEnd from \"../helpers/dom/placeCaretAtEnd\";\r\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\r\nimport { getCountryEmoji } from \"../vendor/emoji\";\r\nimport simulateEvent from \"../helpers/dom/dispatchEvent\";\r\nimport stateStorage from \"../lib/stateStorage\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport TelInputField from \"../components/telInputField\";\r\nimport IS_EMOJI_SUPPORTED from \"../environment/emojiSupport\";\r\n\r\n//import _countries from '../countries_pretty.json';\r\nlet btnNext: HTMLButtonElement = null, btnQr: HTMLButtonElement;\r\n\r\nlet onFirstMount = () => {\r\n /* if(Modes.test) {\r\n Countries.push({\r\n _: 'help.country',\r\n default_name: 'Test Country',\r\n country_codes: [{\r\n _: 'help.countryCode',\r\n country_code: '999 66',\r\n patterns: ['999 66 XXX XX']\r\n }],\r\n iso2: 'KK'\r\n });\r\n \r\n console.log('Added test country to list!');\r\n } */\r\n\r\n //const countries: Country[] = _countries.default.filter(c => c.emoji);\r\n // const countries: Country[] = Countries.filter(c => c.emoji).sort((a, b) => a.name.localeCompare(b.name));\r\n // const countries = I18n.countriesList.filter(country => !country.pFlags?.hidden);\r\n const setCountries = () => {\r\n countries = I18n.countriesList\r\n .filter(country => !country.pFlags?.hidden)\r\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\r\n };\r\n let countries: HelpCountry.helpCountry[]; \r\n\r\n setCountries();\r\n\r\n rootScope.addEventListener('language_change', () => {\r\n setCountries();\r\n });\r\n\r\n const liMap: Map = new Map();\r\n\r\n let lastCountrySelected: HelpCountry, lastCountryCodeSelected: HelpCountryCode;\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const countryInputField = new InputField({\r\n label: 'Login.CountrySelectorLabel',\r\n name: randomLong()\r\n });\r\n\r\n countryInputField.container.classList.add('input-select');\r\n\r\n const countryInput = countryInputField.input;\r\n // countryInput.autocomplete = randomLong();\r\n\r\n const selectWrapper = document.createElement('div');\r\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\r\n\r\n const arrowDown = document.createElement('span');\r\n arrowDown.classList.add('arrow', 'arrow-down');\r\n countryInputField.container.append(arrowDown);\r\n\r\n const selectList = document.createElement('ul');\r\n selectWrapper.appendChild(selectList);\r\n\r\n const scroll = new Scrollable(selectWrapper);\r\n\r\n let initSelect = () => {\r\n initSelect = null;\r\n\r\n countries.forEach((c) => {\r\n const emoji = getCountryEmoji(c.iso2);\r\n\r\n const liArr: Array = [];\r\n c.country_codes.forEach((countryCode) => {\r\n const li = document.createElement('li');\r\n\r\n let wrapped = RichTextProcessor.wrapEmojiText(emoji);\r\n if(IS_EMOJI_SUPPORTED) {\r\n const spanEmoji = document.createElement('span');\r\n spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = wrapped;\r\n }\r\n \r\n const el = i18n(c.default_name as any);\r\n el.dataset.defaultName = c.default_name;\r\n li.append(el);\r\n\r\n const span = document.createElement('span');\r\n span.classList.add('phone-code');\r\n span.innerText = '+' + countryCode.country_code;\r\n li.appendChild(span);\r\n\r\n liArr.push(li);\r\n selectList.append(li);\r\n });\r\n\r\n liMap.set(c.iso2, liArr);\r\n });\r\n \r\n selectList.addEventListener('mousedown', (e) => {\r\n if(e.button !== 0) { // other buttons but left shall not pass\r\n return;\r\n }\r\n \r\n const target = findUpTag(e.target, 'LI')\r\n selectCountryByTarget(target);\r\n //console.log('clicked', e, countryName, phoneCode);\r\n });\r\n\r\n countryInputField.container.appendChild(selectWrapper);\r\n };\r\n\r\n const selectCountryByTarget = (target: HTMLElement) => {\r\n const defaultName = (target.childNodes[1] as HTMLElement).dataset.defaultName;\r\n const phoneCode = target.querySelector('.phone-code').innerText;\r\n const countryCode = phoneCode.replace(/\\D/g, '');\r\n\r\n replaceContent(countryInput, i18n(defaultName as any));\r\n simulateEvent(countryInput, 'input');\r\n lastCountrySelected = countries.find(c => c.default_name === defaultName);\r\n lastCountryCodeSelected = lastCountrySelected.country_codes.find(_countryCode => _countryCode.country_code === countryCode);\r\n \r\n telInputField.value = telInputField.lastValue = phoneCode;\r\n hidePicker();\r\n setTimeout(() => {\r\n telEl.focus();\r\n placeCaretAtEnd(telEl, true);\r\n }, 0);\r\n };\r\n \r\n initSelect();\r\n\r\n let hideTimeout: number;\r\n\r\n countryInput.addEventListener('focus', function(this: typeof countryInput, e) {\r\n if(initSelect) {\r\n initSelect();\r\n } else {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n }\r\n\r\n clearTimeout(hideTimeout);\r\n hideTimeout = undefined;\r\n\r\n selectWrapper.classList.remove('hide');\r\n void selectWrapper.offsetWidth; // reflow\r\n selectWrapper.classList.add('active');\r\n\r\n countryInputField.select();\r\n\r\n fastSmoothScroll({\r\n container: page.pageEl.parentElement.parentElement, \r\n element: countryInput, \r\n position: 'start', \r\n margin: 4\r\n });\r\n\r\n setTimeout(() => {\r\n if(!mouseDownHandlerAttached) {\r\n document.addEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = true;\r\n }\r\n }, 0);\r\n });\r\n\r\n let mouseDownHandlerAttached = false;\r\n const onMouseDown = (e: MouseEvent) => {\r\n if(findUpClassName(e.target, 'input-select')) {\r\n return;\r\n }\r\n if(e.target === countryInput) {\r\n return;\r\n }\r\n\r\n hidePicker();\r\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\r\n mouseDownHandlerAttached = false;\r\n };\r\n\r\n const hidePicker = () => {\r\n if(hideTimeout !== undefined) return;\r\n selectWrapper.classList.remove('active');\r\n hideTimeout = window.setTimeout(() => {\r\n selectWrapper.classList.add('hide');\r\n hideTimeout = undefined;\r\n }, 200);\r\n };\r\n /* false && countryInput.addEventListener('blur', function(this: typeof countryInput, e) {\r\n hidePicker();\r\n \r\n e.cancelBubble = true;\r\n }, {capture: true}); */\r\n\r\n countryInput.addEventListener('keyup', (e) => {\r\n const key = e.key;\r\n if(e.ctrlKey || key === 'Control') return false;\r\n\r\n //let i = new RegExp('^' + this.value, 'i');\r\n let _value = countryInputField.value.toLowerCase();\r\n let matches: HelpCountry[] = [];\r\n countries.forEach((c) => {\r\n let good = !![c.name, c.default_name].filter(Boolean).find(str => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;//i.test(c.name);\r\n\r\n liMap.get(c.iso2).forEach(li => li.style.display = good ? '' : 'none');\r\n if(good) matches.push(c);\r\n });\r\n\r\n // Код ниже автоматически выберет страну если она осталась одна при поиске\r\n /* if(matches.length === 1 && matches[0].li.length === 1) {\r\n if(matches[0].name === lastCountrySelected) return false;\r\n //console.log('clicking', matches[0]);\r\n\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initEvent('mousedown', true, true);\r\n matches[0].li[0].dispatchEvent(clickEvent);\r\n return false;\r\n } else */if(matches.length === 0) {\r\n countries.forEach((c) => {\r\n liMap.get(c.iso2).forEach(li => li.style.display = '');\r\n });\r\n } else if(matches.length === 1 && key === 'Enter') {\r\n selectCountryByTarget(liMap.get(matches[0].iso2)[0]);\r\n }\r\n });\r\n\r\n arrowDown.addEventListener('mousedown', function(this: typeof arrowDown, e) {\r\n e.cancelBubble = true;\r\n e.preventDefault();\r\n if(countryInput.matches(':focus')) countryInput.blur();\r\n else countryInput.focus();\r\n });\r\n\r\n const telInputField = new TelInputField({\r\n onInput: (formatted) => {\r\n lottieLoader.loadLottieWorkers();\r\n\r\n const {country, code} = formatted || {};\r\n let countryName = country ? country.name || country.default_name : ''/* 'Unknown' */;\r\n if(countryName !== countryInputField.value && (\r\n !lastCountrySelected || \r\n !country ||\r\n !code || (\r\n lastCountrySelected !== country && \r\n lastCountryCodeSelected.country_code !== code.country_code\r\n )\r\n )\r\n ) {\r\n replaceContent(countryInput, country ? i18n(country.default_name as any) : countryName);\r\n lastCountrySelected = country;\r\n lastCountryCodeSelected = code;\r\n }\r\n \r\n //if(country && (telInputField.value.length - 1) >= (country.pattern ? country.pattern.length : 9)) {\r\n if(country || (telInputField.value.length - 1) > 1) {\r\n btnNext.style.visibility = '';\r\n } else {\r\n btnNext.style.visibility = 'hidden';\r\n }\r\n }\r\n });\r\n\r\n const telEl = telInputField.input;\r\n\r\n telEl.addEventListener('keypress', (e) => {\r\n //console.log('keypress', this.value);\r\n if(!btnNext.style.visibility &&/* this.value.length >= 9 && */ e.key === 'Enter') {\r\n return onSubmit();\r\n }\r\n });\r\n\r\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\r\n this.removeAttribute('readonly'); // fix autocomplete\r\n });*/\r\n\r\n const signedCheckboxField = new CheckboxField({\r\n text: 'Login.KeepSigned', \r\n name: 'keepSession',\r\n withRipple: true,\r\n checked: true\r\n });\r\n\r\n signedCheckboxField.input.addEventListener('change', () => {\r\n const keepSigned = signedCheckboxField.checked;\r\n appStateManager.pushToState('keepSigned', keepSigned);\r\n \r\n AppStorage.toggleStorage(keepSigned);\r\n CacheStorageController.toggleStorage(keepSigned);\r\n apiManager.toggleStorage(keepSigned);\r\n sessionStorage.toggleStorage(keepSigned);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n if(!appStateManager.storage.isAvailable()) {\r\n signedCheckboxField.checked = false;\r\n signedCheckboxField.label.classList.add('checkbox-disabled');\r\n } else {\r\n signedCheckboxField.checked = state.keepSigned;\r\n }\r\n });\r\n\r\n btnNext = Button('btn-primary btn-color-primary', {text: 'Login.Next'});\r\n btnNext.style.visibility = 'hidden';\r\n\r\n const onSubmit = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n const toggle = toggleDisability([/* telEl, countryInput, */btnNext, btnQr], true);\r\n\r\n replaceContent(btnNext, i18n('PleaseWait'));\r\n putPreloader(btnNext);\r\n\r\n //return;\r\n\r\n let phone_number = telInputField.value;\r\n apiManager.invokeApi('auth.sendCode', {\r\n phone_number: phone_number,\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n settings: {\r\n _: 'codeSettings' // that's how we sending Type\r\n }\r\n //lang_code: navigator.language || 'en'\r\n }).then((code) => {\r\n //console.log('got code', code);\r\n\r\n import('./pageAuthCode').then(m => m.default.mount(Object.assign(code, {phone_number: phone_number})));\r\n }).catch(err => {\r\n toggle();\r\n\r\n switch(err.type) {\r\n case 'PHONE_NUMBER_INVALID':\r\n telInputField.setError();\r\n replaceContent(telInputField.label, i18n('Login.PhoneLabelInvalid'));\r\n telEl.classList.add('error');\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n break;\r\n default:\r\n console.error('auth.sendCode error:', err);\r\n btnNext.innerText = err.type;\r\n break;\r\n }\r\n });\r\n };\r\n\r\n attachClickEvent(btnNext, onSubmit);\r\n\r\n btnQr = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Login'});\r\n\r\n let qrMounted = false;\r\n btnQr.addEventListener('click', () => {\r\n pageSignQR.mount();\r\n /* const promise = import('./pageSignQR');\r\n btnQr.disabled = true;\r\n\r\n let preloaderDiv: HTMLElement;\r\n if(!qrMounted) {\r\n preloaderDiv = putPreloader(btnQr);\r\n qrMounted = true;\r\n }\r\n\r\n promise.then(module => {\r\n module.default.mount();\r\n\r\n setTimeout(() => {\r\n btnQr.removeAttribute('disabled');\r\n if(preloaderDiv) {\r\n preloaderDiv.remove();\r\n }\r\n }, 200);\r\n }); */\r\n });\r\n\r\n inputWrapper.append(countryInputField.container, telInputField.container, signedCheckboxField.label, btnNext, btnQr);\r\n\r\n const h4 = document.createElement('h4');\r\n h4.classList.add('text-center');\r\n _i18n(h4, 'Login.Title');\r\n\r\n const subtitle = document.createElement('div');\r\n subtitle.classList.add('subtitle', 'text-center');\r\n _i18n(subtitle, 'Login.StartText');\r\n\r\n page.pageEl.querySelector('.container').append(h4, subtitle, inputWrapper);\r\n\r\n let tryAgain = () => {\r\n apiManager.invokeApi('help.getNearestDc').then((nearestDcResult) => {\r\n const langPack = stateStorage.getFromCache('langPack');\r\n if(langPack && !langPack.countries?.hash) {\r\n I18n.getLangPack(langPack.lang_code).then(() => {\r\n simulateEvent(telEl, 'input');\r\n });\r\n }\r\n\r\n const dcs = new Set([1, 2, 3, 4, 5]);\r\n const done: number[] = [nearestDcResult.this_dc];\r\n\r\n let promise: Promise;\r\n if(nearestDcResult.nearest_dc !== nearestDcResult.this_dc) {\r\n promise = apiManager.getNetworker(nearestDcResult.nearest_dc).then(() => {\r\n done.push(nearestDcResult.nearest_dc);\r\n });\r\n }\r\n\r\n (promise || Promise.resolve()).then(() => {\r\n done.forEach(dcId => {\r\n dcs.delete(dcId);\r\n });\r\n\r\n const _dcs = [...dcs];\r\n const g = async(): Promise => {\r\n const dcId = _dcs.shift();\r\n if(!dcId) return;\r\n\r\n const dbKey: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const key = await sessionStorage.get(dbKey);\r\n if(key) {\r\n return g();\r\n }\r\n\r\n setTimeout(() => { // * если одновременно запросить все нетворкеры, не будет проходить запрос на код\r\n apiManager.getNetworker(dcId/* , {fileDownload: true} */).finally(g);\r\n }, /* done.includes(dcId) ? 0 : */3000);\r\n };\r\n \r\n g();\r\n });\r\n \r\n return nearestDcResult;\r\n }).then((nearestDcResult) => {\r\n if(!countryInputField.value.length && !telInputField.value.length) {\r\n selectCountryByTarget(liMap.get(nearestDcResult.country)[0]);\r\n }\r\n \r\n //console.log('woohoo', nearestDcResult, country);\r\n })//.catch(tryAgain);\r\n };\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n setTimeout(() => {\r\n telEl.focus();\r\n }, 0);\r\n }\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n tryAgain();\r\n};\r\n\r\nconst page = new Page('page-sign', true, onFirstMount, () => {\r\n if(btnNext) {\r\n replaceContent(btnNext, i18n('Login.Next'));\r\n ripple(btnNext, undefined, undefined, true);\r\n btnNext.removeAttribute('disabled');\r\n }\r\n\r\n if(btnQr) {\r\n btnQr.removeAttribute('disabled');\r\n }\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignIn'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport fastSmoothScroll, { ScrollOptions } from \"../helpers/fastSmoothScroll\";\r\nimport useHeavyAnimationCheck from \"../hooks/useHeavyAnimationCheck\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n/*\r\nvar el = $0;\r\nvar height = 0;\r\nvar checkUp = false;\r\n\r\ndo {\r\n height += el.scrollHeight;\r\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\r\nconsole.log(height);\r\n*/\r\n\r\n/*\r\nArray.from($0.querySelectorAll('.bubble-content')).forEach(_el => {\r\n\t//_el.style.display = '';\t\r\n\t//return;\r\n\r\n\tlet el = _el.parentElement;\r\n\tlet height = el.scrollHeight;\r\n\tlet width = el.scrollWidth;\r\n\tel.style.width = width + 'px';\r\n\tel.style.height = height + 'px';\r\n\t_el.style.display = 'none';\r\n});\r\n*/\r\n\r\n/* const scrollables: Map = new Map();\r\nconst scrollsIntersector = new IntersectionObserver(entries => {\r\n for(let entry of entries) {\r\n const scrollable = scrollables.get(entry.target as HTMLElement);\r\n\r\n if(entry.isIntersecting) {\r\n scrollable.isVisible = true;\r\n } else {\r\n scrollable.isVisible = false;\r\n\r\n if(!isInDOM(entry.target)) {\r\n scrollsIntersector.unobserve(scrollable.container);\r\n scrollables.delete(scrollable.container);\r\n }\r\n }\r\n }\r\n}); */\r\n\r\nexport class ScrollableBase {\r\n protected log: ReturnType;\r\n\r\n public onScrollMeasure: number = 0;\r\n protected onScroll: () => void;\r\n\r\n public isHeavyAnimationInProgress = false;\r\n protected needCheckAfterAnimation = false;\r\n\r\n constructor(public el: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\r\n this.container.classList.add('scrollable');\r\n\r\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\r\n\r\n if(el) {\r\n Array.from(el.children).forEach(c => this.container.append(c));\r\n\r\n el.append(this.container);\r\n }\r\n //this.onScroll();\r\n }\r\n\r\n protected setListeners() {\r\n window.addEventListener('resize', this.onScroll, {passive: true});\r\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\r\n\r\n useHeavyAnimationCheck(() => {\r\n this.isHeavyAnimationInProgress = true;\r\n\r\n if(this.onScrollMeasure) {\r\n this.needCheckAfterAnimation = true;\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n }, () => {\r\n this.isHeavyAnimationInProgress = false;\r\n\r\n if(this.needCheckAfterAnimation) {\r\n this.onScroll();\r\n this.needCheckAfterAnimation = false;\r\n }\r\n });\r\n }\r\n\r\n public append(element: HTMLElement) {\r\n this.container.append(element);\r\n }\r\n\r\n public scrollIntoViewNew(options: Omit) {\r\n //return Promise.resolve();\r\n return fastSmoothScroll({\r\n ...options,\r\n container: this.container\r\n });\r\n }\r\n}\r\n\r\nexport type SliceSides = 'top' | 'bottom';\r\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\r\n\r\nexport default class Scrollable extends ScrollableBase {\r\n public splitUp: HTMLElement;\r\n public padding: HTMLElement;\r\n \r\n public onAdditionalScroll: () => void;\r\n public onScrolledTop: () => void;\r\n public onScrolledBottom: () => void;\r\n \r\n public lastScrollTop: number = 0;\r\n public lastScrollDirection: number = 0;\r\n\r\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\r\n\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\r\n super(el, logPrefix);\r\n\r\n /* if(withPaddingContainer) {\r\n this.padding = document.createElement('div');\r\n this.padding.classList.add('scrollable-padding');\r\n Array.from(this.container.children).forEach(c => this.padding.append(c));\r\n this.container.append(this.padding);\r\n } */\r\n\r\n this.container.classList.add('scrollable-y');\r\n this.setListeners();\r\n }\r\n\r\n public setVirtualContainer(el?: HTMLElement) {\r\n this.splitUp = el;\r\n this.log('setVirtualContainer:', el, this);\r\n }\r\n\r\n public onScroll = () => {\r\n //if(this.debug) {\r\n //this.log('onScroll call', this.onScrollMeasure);\r\n //}\r\n\r\n //return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n if(this.onScrollMeasure) {\r\n window.cancelAnimationFrame(this.onScrollMeasure);\r\n }\r\n\r\n this.needCheckAfterAnimation = true;\r\n return;\r\n }\r\n\r\n //if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\r\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\r\n if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\r\n this.onScrollMeasure = window.requestAnimationFrame(() => {\r\n this.onScrollMeasure = 0;\r\n\r\n const scrollTop = this.container.scrollTop;\r\n this.lastScrollDirection = this.lastScrollTop === scrollTop ? 0 : (this.lastScrollTop < scrollTop ? 1 : -1); // * 1 - bottom, -1 - top\r\n this.lastScrollTop = scrollTop;\r\n\r\n if(this.onAdditionalScroll && this.lastScrollDirection !== 0) {\r\n this.onAdditionalScroll();\r\n }\r\n \r\n if(this.checkForTriggers) {\r\n this.checkForTriggers();\r\n }\r\n });\r\n };\r\n\r\n public checkForTriggers = () => {\r\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\r\n\r\n if(this.isHeavyAnimationInProgress) {\r\n this.onScroll();\r\n return;\r\n }\r\n\r\n const scrollHeight = this.container.scrollHeight;\r\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\r\n return;\r\n }\r\n\r\n const clientHeight = this.container.clientHeight;\r\n const maxScrollTop = scrollHeight - clientHeight;\r\n const scrollTop = this.lastScrollTop;\r\n\r\n //this.log('checkForTriggers:', scrollTop, maxScrollTop);\r\n\r\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\r\n this.onScrolledTop();\r\n }\r\n\r\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\r\n this.onScrolledBottom();\r\n }\r\n };\r\n\r\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).prepend(...elements);\r\n }\r\n\r\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\r\n (this.splitUp || this.padding || this.container).append(...elements);\r\n }\r\n\r\n public getDistanceToEnd() {\r\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\r\n }\r\n\r\n get isScrolledDown() {\r\n return this.getDistanceToEnd() <= 1;\r\n }\r\n\r\n set scrollTop(y: number) {\r\n this.container.scrollTop = y;\r\n }\r\n \r\n get scrollTop() {\r\n //this.log.trace('get scrollTop');\r\n return this.container.scrollTop;\r\n }\r\n \r\n get scrollHeight() {\r\n return this.container.scrollHeight;\r\n }\r\n}\r\n\r\nexport class ScrollableX extends ScrollableBase {\r\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\r\n super(el, logPrefix, container);\r\n\r\n this.container.classList.add('scrollable-x');\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n const scrollHorizontally = (e: any) => {\r\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\r\n this.container.scrollLeft += e.deltaY / 4;\r\n cancelEvent(e);\r\n }\r\n };\r\n \r\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\r\n }\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appStateManager from \"../lib/appManagers/appStateManager\";\r\nimport { getDeepProperty } from \"../helpers/object\";\r\nimport { ripple } from \"./ripple\";\r\nimport { LangPackKey, _i18n } from \"../lib/langPack\";\r\n\r\nexport type CheckboxFieldOptions = {\r\n text?: LangPackKey,\r\n textArgs?: any[],\r\n name?: string, \r\n round?: boolean, \r\n toggle?: boolean,\r\n stateKey?: string,\r\n stateValues?: any[],\r\n disabled?: boolean,\r\n checked?: boolean,\r\n restriction?: boolean,\r\n withRipple?: boolean,\r\n withHover?: boolean,\r\n};\r\nexport default class CheckboxField {\r\n public input: HTMLInputElement;\r\n public label: HTMLLabelElement;\r\n public span: HTMLSpanElement;\r\n\r\n constructor(options: CheckboxFieldOptions = {}) {\r\n const label = this.label = document.createElement('label');\r\n label.classList.add('checkbox-field');\r\n\r\n if(options.restriction) {\r\n label.classList.add('checkbox-field-restriction');\r\n }\r\n\r\n if(options.round) {\r\n label.classList.add('checkbox-field-round');\r\n }\r\n\r\n if(options.disabled) {\r\n this.toggleDisability(true);\r\n }\r\n\r\n const input = this.input = document.createElement('input');\r\n input.classList.add('checkbox-field-input');\r\n input.type = 'checkbox';\r\n if(options.name) {\r\n input.id = 'input-' + options.name;\r\n }\r\n\r\n if(options.checked) {\r\n input.checked = true;\r\n }\r\n\r\n if(options.stateKey) {\r\n appStateManager.getState().then(state => {\r\n const stateValue = getDeepProperty(state, options.stateKey);\r\n let checked: boolean;\r\n if(options.stateValues) {\r\n checked = options.stateValues.indexOf(stateValue) === 1;\r\n } else {\r\n checked = stateValue;\r\n }\r\n\r\n this.setValueSilently(checked);\r\n\r\n input.addEventListener('change', () => {\r\n let value: any;\r\n if(options.stateValues) {\r\n value = options.stateValues[input.checked ? 1 : 0];\r\n } else {\r\n value = input.checked;\r\n }\r\n\r\n appStateManager.setByKey(options.stateKey, value);\r\n });\r\n });\r\n }\r\n\r\n let span: HTMLSpanElement;\r\n if(options.text) {\r\n span = this.span = document.createElement('span');\r\n span.classList.add('checkbox-caption');\r\n _i18n(span, options.text, options.textArgs);\r\n } else {\r\n label.classList.add('checkbox-without-caption');\r\n }\r\n\r\n label.append(input);\r\n\r\n if(options.toggle) {\r\n label.classList.add('checkbox-field-toggle');\r\n\r\n const toggle = document.createElement('div');\r\n toggle.classList.add('checkbox-toggle');\r\n label.append(toggle);\r\n } else {\r\n const box = document.createElement('div');\r\n box.classList.add('checkbox-box');\r\n \r\n const checkSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\r\n checkSvg.classList.add('checkbox-box-check');\r\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n const use = document.createElementNS(\"http://www.w3.org/2000/svg\", \"use\");\r\n use.setAttributeNS(null, 'href', '#check');\r\n use.setAttributeNS(null, 'x', '-1');\r\n checkSvg.append(use);\r\n \r\n const bg = document.createElement('div');\r\n bg.classList.add('checkbox-box-background');\r\n \r\n const border = document.createElement('div');\r\n border.classList.add('checkbox-box-border');\r\n \r\n box.append(border, bg, checkSvg);\r\n \r\n label.append(box);\r\n }\r\n\r\n if(span) {\r\n label.append(span);\r\n }\r\n\r\n if(options.withRipple) {\r\n label.classList.add('checkbox-ripple', 'hover-effect');\r\n ripple(label, undefined, undefined, true);\r\n //label.prepend(input);\r\n } else if(options.withHover) {\r\n label.classList.add('hover-effect');\r\n }\r\n }\r\n\r\n get checked() {\r\n return this.input.checked;\r\n }\r\n\r\n set checked(checked: boolean) {\r\n /* if(this.checked === checked) {\r\n return;\r\n } */\r\n \r\n this.setValueSilently(checked);\r\n\r\n const event = new Event('change', {bubbles: true, cancelable: true});\r\n this.input.dispatchEvent(event);\r\n }\r\n\r\n public setValueSilently(checked: boolean) {\r\n this.input.checked = checked;\r\n }\r\n\r\n public toggleDisability(disable: boolean) {\r\n this.label.classList.toggle('checkbox-disabled', disable);\r\n return () => this.toggleDisability(!disable);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\r\n if(disable) {\r\n elements.forEach(el => el.setAttribute('disabled', 'true'));\r\n } else {\r\n elements.forEach(el => el.removeAttribute('disabled'));\r\n }\r\n\r\n return () => toggleDisability(elements, !disable);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpTag(el: any, tag: string): HTMLElement {\r\n return el.closest(tag);\r\n /* if(el.tagName === tag) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.tagName === tag) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\n\r\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false) {\r\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || document.activeElement !== el)) {\r\n return;\r\n }\r\n \r\n el.focus();\r\n if(typeof window.getSelection !== \"undefined\" && typeof document.createRange !== \"undefined\") {\r\n var range = document.createRange();\r\n range.selectNodeContents(el);\r\n range.collapse(false);\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n // @ts-ignore\r\n } else if(typeof document.body.createTextRange !== \"undefined\") {\r\n // @ts-ignore\r\n var textRange = document.body.createTextRange();\r\n textRange.moveToElementText(el);\r\n textRange.collapse(false);\r\n textRange.select();\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/16.1fd991b3cf3f32baf9f1.chunk.js b/public/16.1587e222e41a6d3aa087.chunk.js similarity index 98% rename from public/16.1fd991b3cf3f32baf9f1.chunk.js rename to public/16.1587e222e41a6d3aa087.chunk.js index 9d0c022f4..7215476a5 100644 --- a/public/16.1fd991b3cf3f32baf9f1.chunk.js +++ b/public/16.1587e222e41a6d3aa087.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[16,6,25],{111:function(e,t,n){"use strict";function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function o(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{i(e,t,!1)})}function a(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!a()}n.d(t,"e",(function(){return i})),n.d(t,"b",(function(){return s})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return r}))},115:function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return s}));function i(e,t){const n=""["".length-1]||"";let i;switch(e._){case"inputPhotoFileLocation":i=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":i=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":i=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":i=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":i=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":i=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),i=""}return i+(n?"."+n:n)}function s(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},133:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(15),s=n(0);function o(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},139:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var i=n(72);var s=function(e,t){let n,i,s,o={},a=0,r=0,c=0,l=0,d=0;function u(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const o=document.createElement("div");o.classList.add("crop-overlay-color"),n.appendChild(i);e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(o),i.appendChild(s),s.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;h(200,200),p(a,r),m(a,r),i.addEventListener("mousedown",g,!1),i.addEventListener("touchstart",g,!1),i.addEventListener("wheel",b,!1),document.addEventListener("keypress",f,!1)}function h(e,t){c=e*d,l=t*d,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*d,a=e*d,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function v(e){e=e*Math.PI*2;let t,n,o,a,r=Math.floor(i.clientWidth+e),c=Math.floor(i.clientHeight+e),l=s.clientWidth,d=s.clientHeight;r<50||r>l||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,o=t+r,a=n+c,t<0&&(t=0),n<0&&(n=0),o>l||a>d||(h(r,r),p(t,n),m(t,n)))}function f(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":v(4);break;case"-":v(-4)}}function b(e){e.preventDefault(),v(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){o.container_width=i.offsetWidth,o.container_height=i.offsetHeight,o.container_left=i.offsetLeft,o.container_top=i.offsetTop,o.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,o.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,a,r,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(o.mouse_x-o.container_left),n=c.y-(o.mouse_y-o.container_top),a=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-a&&(t=s.offsetWidth-a),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?u():e.onload=u,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,a,r,c,l,0,0,c,l)},removeHandlers:function(){i.removeEventListener("mousedown",g),i.removeEventListener("touchstart",g),i.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",f),n.remove(),i.remove(),s.remove()}}},o=n(58),a=n(16),r=n(98),c=n(30);class l extends o.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(a._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(r.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=s(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(c.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>i.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),o=n(1),a=n(15),r=n(71);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const a=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,v=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let v=!1;if(o.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!a.default.settings.animationsEnabled)return;if(t.touches.length>1||v||m(t))return;v=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(v)return void(v=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},25:function(e,t,n){"use strict";n.r(t);var i=n(34),s=n(40),o=n(35),a=n(139),r=n(17),c=n(16),l=n(33),d=n(32),u=n(93),h=n(69),p=n(8),m=n(36);let v=null;const f=new h.a("page-signUp",!0,()=>Promise.all([n.e(7),n.e(5)]).then(n.bind(null,73)).then(e=>{const t=new u.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const r=document.createElement("canvas");r.id="canvas-avatar",r.className="avatar-edit-canvas";const h=document.createElement("span");h.className="tgico tgico-cameraadd",t.imageDiv.append(r,h);const f=e.default;let b;t.imageDiv.addEventListener("click",()=>{(new a.a).open(r,e=>{b=e})});const g=e=>{const n=w.value||"",i=E.value||"",s=n||i?(n+" "+i).trim():"";s?Object(m.a)(t.title,d.b.wrapEmojiText(s)):Object(m.a)(t.title,Object(c.i18n)("YourName"))};const w=new s.b({label:"FirstName",maxLength:70}),E=new s.b({label:"LastName",maxLength:64}),L=Object(i.a)("btn-primary btn-color-primary"),y=new c.default.IntlElement({key:"StartMessaging"});return L.append(y.element),t.inputWrapper.append(w.container,E.container,L),w.input.addEventListener("input",g),E.input.addEventListener("input",g),L.addEventListener("click",(function(e){if(w.input.classList.contains("error")||E.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),i=E.value.trim(),s={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:i};y.update({key:"PleaseWait"});const a=Object(o.f)(this);l.a.invokeApi("auth.signUp",s).then(e=>{switch(e._){case"auth.authorization":l.a.setUser(e.user),new Promise((e,t)=>{if(!b)return e();b().then(n=>{f.uploadProfilePhoto(n).then(e,t)},t)}).finally(()=>{n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()})});break;default:y.update({key:e._}),this.removeAttribute("disabled"),a.remove()}}).catch(e=>{this.removeAttribute("disabled"),a.remove(),e.type,y.update({key:e.type})})})),Object(p.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{v=e,r.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=f},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return v})),n.d(t,"d",(function(){return w})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return C}));var i=n(29),s=n(5),o=n(30),a=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&v()};const m=e=>{v()},v=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),g&&g.remove(),f=null,l.default.dispatchEvent("context_menu_toggle",!1)),b&&(b(),b=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&v()});let f=null,b=null,g=null;function w(e,t){v(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{v()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),g||(g=document.createElement("div"),g.classList.add("btn-menu-overlay"),g.addEventListener(o.a,e=>{Object(s.a)(e),m()})),f.parentElement.insertBefore(g,f),b=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=a.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let L=!1,y=0;function S(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,L=!1},400),L=!0}function C(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{L?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(37),a=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},58:function(e,t,n){"use strict";n.d(t,"b",(function(){return E})),n.d(t,"a",(function(){return L}));var i=n(15),s=n(18),o=n(70),a=n(49),r=n(16),c=n(6),l=n(8),d=n(80),u=n(30),h=n(133),p=n(5),m=n(48),v=n(39),f=n(111);const b=document.body;let g=b;const w=()=>{g=Object(f.c)()||b,E.reAppend()};Object(f.a)(b,w);class E extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.a.backByItem(this.navigationItem)},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(i.default.isOverlayActive=!1),a.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(v.e)(E.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||o.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(u.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(u.b)(this.element,e=>{Object(c.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(r.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(s.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(s.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(r.i18n)(e.langKey,e.langArgs)),Object(u.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container),E.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},a.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(i.default.isOverlayActive=!0,o.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(h.a)(e):"Enter"===e.key)&&(Object(u.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==g&&g!==n&&g.append(t)})}static getPopup(e){return this.POPUPS.find(t=>t instanceof e)}}E.POPUPS=[];const L=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},66:function(e,t,n){"use strict";var i=n(44),s=n(45),o=n(29),a=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},72:function(e,t,n){"use strict";var i=n(15),s=n(33),o=n(45),a=n(115),r=n(127),c=n(29);const l=new class{constructor(){this.cacheStorage=new r.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},i.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const i=this.downloads[t.fileName];i&&i.notifyAll(t)})}getNewDeferred(e){const t=Object(o.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",s.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(a.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),i=e=>{n.reject(e)};return(()=>{if(!s.a.worker||e.onlyCache){const o=this.cacheStorage.getFile(t).then(t=>{if(t.sizes.a.downloadFile(e).then(n.resolve,i))}s.a.downloadFile(e).then(n.resolve,i)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return s.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const i=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),i&&t(i)}createDownloadAnchor(e,t,n){const i=document.createElement("a");i.href=e,i.download=t,i.target="_blank",i.style.position="absolute",i.style.top="1px",i.style.left="1px",document.body.append(i);try{var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),i.dispatchEvent(s)}catch(t){console.error("Download click error",t);try{i.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{i.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,i;const s=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(i=s[t])&&void 0!==i?i:s[t]={downloaded:0,url:""}}};c.a&&(c.a.appDownloadManager=l),t.a=l},80:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));class i{constructor(){this.listeners=new Set}add(e){return(t,n,i)=>{const s={element:e,event:t,callback:n,options:i};return this.addManual(s),s}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,i){let s;for(const o of this.listeners)if(o.element===e&&o.event===t&&o.callback===n&&o.options===i){s=o;break}s&&this.remove(s)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},93:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(16);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(i.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(i.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=16.1fd991b3cf3f32baf9f1.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[16,6,25],{111:function(e,t,n){"use strict";function i(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function s(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function o(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{i(e,t,!1)})}function a(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!a()}n.d(t,"e",(function(){return i})),n.d(t,"b",(function(){return s})),n.d(t,"a",(function(){return o})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return r}))},115:function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return s}));function i(e,t){const n=""["".length-1]||"";let i;switch(e._){case"inputPhotoFileLocation":i=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":i=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":i=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":i=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":i=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":i=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),i=""}return i+(n?"."+n:n)}function s(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},133:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(15),s=n(0);function o(e){if("Enter"===e.key&&!s.IS_MOBILE&&!e.isComposing){if("enter"===i.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=s.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(s.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},139:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var i=n(73);var s=function(e,t){let n,i,s,o={},a=0,r=0,c=0,l=0,d=0;function u(){e.classList.add("crop-blur"),e.draggable=!1,s=new Image,s.src=e.src,s.draggable=!1,s.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),i=document.createElement("div"),i.classList.add("crop-overlay");const o=document.createElement("div");o.classList.add("crop-overlay-color"),n.appendChild(i);e.parentNode.appendChild(n),n.appendChild(s),n.appendChild(e),n.appendChild(o),i.appendChild(s),s.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const a=e.offsetWidth/2-100,r=e.offsetHeight/2-100;h(200,200),p(a,r),m(a,r),i.addEventListener("mousedown",g,!1),i.addEventListener("touchstart",g,!1),i.addEventListener("wheel",b,!1),document.addEventListener("keypress",f,!1)}function h(e,t){c=e*d,l=t*d,i.style.width=e+"px",i.style.height=t+"px"}function p(e,t){r=t*d,a=e*d,s.style.top=-t+"px",s.style.left=-e+"px"}function m(e,t){i.style.top=t+"px",i.style.left=e+"px"}function v(e){e=e*Math.PI*2;let t,n,o,a,r=Math.floor(i.clientWidth+e),c=Math.floor(i.clientHeight+e),l=s.clientWidth,d=s.clientHeight;r<50||r>l||(t=i.offsetLeft-e/2,n=i.offsetTop-e/2,o=t+r,a=n+c,t<0&&(t=0),n<0&&(n=0),o>l||a>d||(h(r,r),p(t,n),m(t,n)))}function f(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":v(4);break;case"-":v(-4)}}function b(e){e.preventDefault(),v(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){o.container_width=i.offsetWidth,o.container_height=i.offsetHeight,o.container_left=i.offsetLeft,o.container_top=i.offsetTop,o.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,o.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",E),document.addEventListener("touchmove",E),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E)}function E(e){let t,n,a,r,c={x:0,y:0};e.preventDefault(),e.stopPropagation(),c.x=e.pageX||e.touches&&e.touches[0].pageX,c.y=e.pageY||e.touches&&e.touches[0].pageY,t=c.x-(o.mouse_x-o.container_left),n=c.y-(o.mouse_y-o.container_top),a=i.offsetWidth,r=i.offsetHeight,t<0?t=0:t>s.offsetWidth-a&&(t=s.offsetWidth-a),n<0?n=0:n>s.offsetHeight-r&&(n=s.offsetHeight-r),p(t,n),m(t,n)}return e.complete?u():e.onload=u,{crop:function(){t.width=c,t.height=l,t.getContext("2d").drawImage(e,a,r,c,l,0,0,c,l)},removeHandlers:function(){i.removeEventListener("mousedown",g),i.removeEventListener("touchstart",g),i.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",E),document.removeEventListener("touchmove",E),document.removeEventListener("keypress",f),n.remove(),i.remove(),s.remove()}}},o=n(58),a=n(16),r=n(98),c=n(30);class l extends o.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(a._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(r.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=s(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(c.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>i.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return l}));var i=n(6),s=n(66),o=n(1),a=n(15),r=n(72);let c=0;function l(e,t=(()=>Promise.resolve()),n=null,l=!1,d=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[l?"prepend":"append"](u);const p=(e,i)=>{const a=Date.now(),r=document.createElement("div"),l=c++,d=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-a;const t=()=>{s.a.mutate(()=>{r.remove()}),n&&n(l)};if(er.classList.add("hiding"),Math.max(n-d/2,0)),setTimeout(t,n)}else r.classList.add("hiding"),setTimeout(t,d/2);o.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,v=!1},t&&t(l),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const n=e-t.left,s=i-t.top,o=Math.sqrt(Math.pow(Math.abs(s-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),a=n-o/2,c=s-o/2;r.style.width=r.style.height=o+"px",r.style.left=a+"px",r.style.top=c+"px",u.append(r)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(d===e||!Object(r.a)(t.target,d));let v=!1;if(o.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};d.addEventListener("touchstart",t=>{if(!a.default.settings.animationsEnabled)return;if(t.touches.length>1||v||m(t))return;v=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),d.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),d.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else d.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!a.default.settings.animationsEnabled)return;if("0"===d.dataset.ripple||m(e))return;if(v)return void(v=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},25:function(e,t,n){"use strict";n.r(t);var i=n(34),s=n(40),o=n(35),a=n(139),r=n(17),c=n(16),l=n(33),d=n(32),u=n(93),h=n(69),p=n(8),m=n(36);let v=null;const f=new h.a("page-signUp",!0,()=>Promise.all([n.e(7),n.e(5)]).then(n.bind(null,74)).then(e=>{const t=new u.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const r=document.createElement("canvas");r.id="canvas-avatar",r.className="avatar-edit-canvas";const h=document.createElement("span");h.className="tgico tgico-cameraadd",t.imageDiv.append(r,h);const f=e.default;let b;t.imageDiv.addEventListener("click",()=>{(new a.a).open(r,e=>{b=e})});const g=e=>{const n=w.value||"",i=E.value||"",s=n||i?(n+" "+i).trim():"";s?Object(m.a)(t.title,d.b.wrapEmojiText(s)):Object(m.a)(t.title,Object(c.i18n)("YourName"))};const w=new s.b({label:"FirstName",maxLength:70}),E=new s.b({label:"LastName",maxLength:64}),L=Object(i.a)("btn-primary btn-color-primary"),y=new c.default.IntlElement({key:"StartMessaging"});return L.append(y.element),t.inputWrapper.append(w.container,E.container,L),w.input.addEventListener("input",g),E.input.addEventListener("input",g),L.addEventListener("click",(function(e){if(w.input.classList.contains("error")||E.input.classList.contains("error"))return!1;if(!w.value.length)return w.input.classList.add("error"),!1;this.disabled=!0;const t=w.value.trim(),i=E.value.trim(),s={phone_number:v.phone_number,phone_code_hash:v.phone_code_hash,first_name:t,last_name:i};y.update({key:"PleaseWait"});const a=Object(o.f)(this);l.a.invokeApi("auth.signUp",s).then(e=>{switch(e._){case"auth.authorization":l.a.setUser(e.user),new Promise((e,t)=>{if(!b)return e();b().then(n=>{f.uploadProfilePhoto(n).then(e,t)},t)}).finally(()=>{n.e(4).then(n.bind(null,19)).then(e=>{e.default.mount()})});break;default:y.update({key:e._}),this.removeAttribute("disabled"),a.remove()}}).catch(e=>{this.removeAttribute("disabled"),a.remove(),e.type,y.update({key:e.type})})})),Object(p.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{v=e,r.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=f},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return a})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}));var i=n(1),s=n(57);const o=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function a(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(o,t,n)}function r(e,t,n){e.removeEventListener(o,t,n)}function c(e){Object(s.a)(e,o)}},34:function(e,t,n){"use strict";var i=n(16),s=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(s.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return v})),n.d(t,"d",(function(){return w})),n.d(t,"e",(function(){return E})),n.d(t,"b",(function(){return S})),n.d(t,"a",(function(){return C}));var i=n(29),s=n(5),o=n(30),a=n(38),r=n(1),c=n(0),l=n(15),d=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=f.getBoundingClientRect(),{clientX:n,clientY:i}=e,s=n>=t.right?n-t.right:t.left-n,o=i>=t.bottom?i-t.bottom:t.top-i;(s>=100||o>=100)&&v()};const m=e=>{v()},v=()=>{f&&(f.classList.remove("active"),f.parentElement.classList.remove("menu-open"),g&&g.remove(),f=null,l.default.dispatchEvent("context_menu_toggle",!1)),b&&(b(),b=null),r.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(o.a,m),c.IS_MOBILE_SAFARI||d.a.removeByType("menu")};window.addEventListener("resize",()=>{f&&v()});let f=null,b=null,g=null;function w(e,t){v(),c.IS_MOBILE_SAFARI||d.a.pushItem({type:"menu",onPop:e=>{v()}}),f=e,f.classList.add("active"),f.parentElement.classList.add("menu-open"),g||(g=document.createElement("div"),g.classList.add("btn-menu-overlay"),g.addEventListener(o.a,e=>{Object(s.a)(e),m()})),f.parentElement.insertBefore(g,f),b=t,r.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(o.a,m),l.default.dispatchEvent("context_menu_toggle",!0)}function E({pageX:e,pageY:t},n,i){let{scrollWidth:s,scrollHeight:o}=n;const r=document.body.getBoundingClientRect(),c=r.width,l=r.height;i=a.b.isMobile?"right":"left";let d="top";const u={x:{left:e,right:e-s},intermediateX:"right"===i?8:c-s-8,y:{top:t,bottom:t-o},intermediateY:t=8},p={top:u.y.top+o+8<=l,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[d]?u.y[d]:(d="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===d?d:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let L=!1,y=0;function S(){y&&clearTimeout(y),y=window.setTimeout(()=>{y=0,L=!1},400),L=!0}function C(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),o=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&r.IS_TOUCH_SUPPORTED){let n;const a={capture:!0},r=()=>{clearTimeout(n),o("touchmove",r,a),o("touchend",r,a),o("touchcancel",r,a)};i("touchstart",o=>{o.touches.length>1?r():(i("touchmove",r,a),i("touchend",r,a),i("touchcancel",r,a),n=window.setTimeout(()=>{L?r():(t(o.touches[0]),r(),f&&e.addEventListener("touchend",s.a,{once:!0}))},400))})}else i("contextmenu",r.IS_TOUCH_SUPPORTED?n=>{t(n),f&&e.addEventListener("touchend",s.a,{once:!0})}:t)}},49:function(e,t,n){"use strict";var i=n(29),s=n(0),o=n(37),a=n(8),r=n(5),c=n(39),l=n(82);const d=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(o.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(r.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),s.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(l.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(a.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=d,t.a=d},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},58:function(e,t,n){"use strict";n.d(t,"b",(function(){return E})),n.d(t,"a",(function(){return L}));var i=n(15),s=n(18),o=n(71),a=n(49),r=n(16),c=n(6),l=n(8),d=n(80),u=n(30),h=n(133),p=n(5),m=n(48),v=n(39),f=n(111);const b=document.body;let g=b;const w=()=>{g=Object(f.c)()||b,E.reAppend()};Object(f.a)(b,w);class E extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.a.backByItem(this.navigationItem)},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(i.default.isOverlayActive=!1),a.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(v.e)(E.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||o.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(u.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(u.b)(this.element,e=>{Object(c.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(r.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(s.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(s.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(r.i18n)(e.langKey,e.langArgs)),Object(u.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container),E.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},a.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(i.default.isOverlayActive=!0,o.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(h.a)(e):"Enter"===e.key)&&(Object(u.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,i=t.parentElement;i&&i!==g&&g!==n&&g.append(t)})}static getPopup(e){return this.POPUPS.find(t=>t instanceof e)}}E.POPUPS=[];const L=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},66:function(e,t,n){"use strict";var i=n(44),s=n(45),o=n(29),a=n(68);const r=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(s.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(a.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};o.a&&(o.a.sequentialDom=r),t.a=r},73:function(e,t,n){"use strict";var i=n(15),s=n(33),o=n(45),a=n(115),r=n(127),c=n(29);const l=new class{constructor(){this.cacheStorage=new r.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},i.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const i=this.downloads[t.fileName];i&&i.notifyAll(t)})}getNewDeferred(e){const t=Object(o.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",s.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(a.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),i=e=>{n.reject(e)};return(()=>{if(!s.a.worker||e.onlyCache){const o=this.cacheStorage.getFile(t).then(t=>{if(t.sizes.a.downloadFile(e).then(n.resolve,i))}s.a.downloadFile(e).then(n.resolve,i)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return s.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const i=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),i&&t(i)}createDownloadAnchor(e,t,n){const i=document.createElement("a");i.href=e,i.download=t,i.target="_blank",i.style.position="absolute",i.style.top="1px",i.style.left="1px",document.body.append(i);try{var s=document.createEvent("MouseEvents");s.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),i.dispatchEvent(s)}catch(t){console.error("Download click error",t);try{i.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{i.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,i;const s=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(i=s[t])&&void 0!==i?i:s[t]={downloaded:0,url:""}}};c.a&&(c.a.appDownloadManager=l),t.a=l},80:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));class i{constructor(){this.listeners=new Set}add(e){return(t,n,i)=>{const s={element:e,event:t,callback:n,options:i};return this.addManual(s),s}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,i){let s;for(const o of this.listeners)if(o.element===e&&o.event===t&&o.callback===n&&o.options===i){s=o;break}s&&this.remove(s)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(0);function s(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},93:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var i=n(16);class s{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(i.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(i.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=16.1587e222e41a6d3aa087.chunk.js.map \ No newline at end of file diff --git a/public/16.1fd991b3cf3f32baf9f1.chunk.js.map b/public/16.1587e222e41a6d3aa087.chunk.js.map similarity index 99% rename from public/16.1fd991b3cf3f32baf9f1.chunk.js.map rename to public/16.1587e222e41a6d3aa087.chunk.js.map index 8ff883031..52b07ac76 100644 --- a/public/16.1fd991b3cf3f32baf9f1.chunk.js.map +++ b/public/16.1587e222e41a6d3aa087.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/pages/loginPage.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","isSendShortcutPressed","e","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","rippleClickId","ripple","elem","Promise","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","max","setTimeout","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","clickY","size","sqrt","abs","isRippleUnneeded","includes","tagName","touchEnd","animationsEnabled","once","cancelBubble","passive","button","dataset","authCode","page","imported","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","title","avatarPreview","addIco","appProfileManager","default","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","inputWrapper","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","setUser","user","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","catch","err","_authCode","pushToState","CLICK_EVENT_NAME","attachClickEvent","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","diffY","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","hash","isPossibleSwipe","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","undefined","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","push","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","navigationItem","destroy","removeAll","withoutOverlay","isOverlayActive","removeItem","POPUPS","cleanup","checkAnimations","confirmShortcutIsSendShortcut","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","isDanger","langKey","langArgs","find","isCancel","popup","popupConstructor","addCancelButton","sequentialDom","promises","raf","scheduled","kind","promise","scheduleFlush","do","read","write","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","cancelDownload","clearDownload","getNewDeferred","fetch","hasOwnProperty","onError","worker","onlyCache","getFile","downloadFile","tryDownload","mimeType","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","listener","addManual","onceCallback","onceFired","delete","_listener","isSwipingBackSafari","TouchEvent","LoginPage","subtitle"],"mappings":"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","file":"16.1fd991b3cf3f32baf9f1.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignUp.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts","webpack:///./src/pages/loginPage.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","isSendShortcutPressed","e","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","rippleClickId","ripple","elem","Promise","onEnd","prepend","attachListenerTo","querySelector","r","handler","contains","drawRipple","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","delay","max","setTimeout","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","clickY","size","sqrt","abs","isRippleUnneeded","includes","tagName","touchEnd","animationsEnabled","once","cancelBubble","passive","button","dataset","authCode","page","imported","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","title","avatarPreview","addIco","appProfileManager","default","uploadAvatar","open","_uploadAvatar","handleInput","name","nameInputField","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","inputWrapper","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","setUser","user","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","catch","err","_authCode","pushToState","CLICK_EVENT_NAME","attachClickEvent","touchMouseDown","detachClickEvent","simulateClickEvent","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","text","putPreloader","returnDiv","html","div","innerHTML","insertAdjacentHTML","lastElementChild","setButtonLoader","onMouseMove","openedMenu","diffX","diffY","closeBtnMenu","onClick","parentElement","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","hash","isPossibleSwipe","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","undefined","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","push","noHistory","origin","pathname","single","simulateEvent","event","Event","bubbles","cancelable","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","navigationItem","destroy","removeAll","withoutOverlay","isOverlayActive","removeItem","POPUPS","cleanup","checkAnimations","confirmShortcutIsSendShortcut","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","isDanger","langKey","langArgs","find","isCancel","popup","popupConstructor","addCancelButton","sequentialDom","promises","raf","scheduled","kind","promise","scheduleFlush","do","read","write","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","cancelDownload","clearDownload","getNewDeferred","fetch","hasOwnProperty","onError","worker","onlyCache","getFile","downloadFile","tryDownload","mimeType","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","listener","addManual","onceCallback","onceFired","delete","_listener","isSwipingBackSafari","TouchEvent","LoginPage","subtitle"],"mappings":"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","file":"16.1587e222e41a6d3aa087.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/18.25e70e3100f53609fdd3.chunk.js b/public/18.33a13d3129fb705afcd7.chunk.js similarity index 99% rename from public/18.25e70e3100f53609fdd3.chunk.js rename to public/18.33a13d3129fb705afcd7.chunk.js index b07b59429..a3aef1c1b 100644 --- a/public/18.25e70e3100f53609fdd3.chunk.js +++ b/public/18.33a13d3129fb705afcd7.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),o=n(30),s=n(9),r=n(16),a=n(33),c=n(15),d=n(34),l=n(35);let u,h=!1;function p(e){h||(u||(u=a.a.getConfig().then(e=>e.suggested_lang_code!==r.default.lastRequestedLangCode?Promise.all([e,r.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),r.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const a=[];n.forEach(e=>{const t=r.default.strings.get(e.key);t&&(a.push(t),r.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(s.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),a.forEach(e=>{r.default.strings.set(e.key,e)}),Object(o.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),r.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return d}));var i=n(6),o=n(66),s=n(1),r=n(15),a=n(71);let c=0;function d(e,t=(()=>Promise.resolve()),n=null,d=!1,l=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[d?"prepend":"append"](u);const p=(e,i)=>{const r=Date.now(),a=document.createElement("div"),d=c++,l=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-r;const t=()=>{o.a.mutate(()=>{a.remove()}),n&&n(d)};if(ea.classList.add("hiding"),Math.max(n-l/2,0)),setTimeout(t,n)}else a.classList.add("hiding"),setTimeout(t,l/2);s.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(d),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();a.classList.add("c-ripple__circle");const n=e-t.left,o=i-t.top,s=Math.sqrt(Math.pow(Math.abs(o-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),r=n-s/2,c=o-s/2;a.style.width=a.style.height=s+"px",a.style.left=r+"px",a.style.top=c+"px",u.append(a)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(l===e||!Object(a.a)(t.target,l));let f=!1;if(s.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};l.addEventListener("touchstart",t=>{if(!r.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),l.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),l.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else l.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!r.default.settings.animationsEnabled)return;if("0"===l.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},22:function(e,t,n){"use strict";n.r(t);var i=n(33),o=n(69),s=n(78),r=n(56),a=n(7),c=n(34),d=n(16),l=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(o,s){function r(e){try{c(i.next(e))}catch(e){s(e)}}function a(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((i=i.apply(e,t||[])).next())}))};let v;const w=new o.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const o=document.createElement("div");o.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});o.append(l),Object(p.a)(o);const b=e.parentElement,y=document.createElement("h4");Object(d._i18n)(y,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),E.append(t)}),b.append(y,E,o),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),O=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let O=!1;u.default.addEventListener("user_auth",()=>{O=!0,v=null},{once:!0});let S,_={ignoreErrors:!0};const T=o=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:a.a.id,api_hash:a.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!S||!Object(r.b)(S,c.token)){S=c.token;let n=Object(r.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const o=window.getComputedStyle(document.documentElement),s=o.getPropertyValue("--surface-color").trim(),a=o.getPropertyValue("--primary-text-color").trim(),d=o.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${d}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:l,dotsOptions:{color:a,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:s},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(o){let e=Date.now()/1e3,t=c.expires-e-s.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),O=!0,v=null;break;default:console.error("pageSignQR: default error:",e),O=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(O=!1;!O&&!(yield T(!0)););}))}))),v.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=w},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return c}));var i=n(1),o=n(57);const s=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function r(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(s,t,n)}function a(e,t,n){e.removeEventListener(s,t,n)}function c(e){Object(o.a)(e,s)}},34:function(e,t,n){"use strict";var i=n(16),o=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(o.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return y})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return S}));var i=n(29),o=n(5),s=n(30),r=n(38),a=n(1),c=n(0),d=n(15),l=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,o=n>=t.right?n-t.right:t.left-n,s=i>=t.bottom?i-t.bottom:t.top-i;(o>=100||s>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),w&&w.remove(),g=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),a.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(s.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,w=null;function b(e,t){f(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),w||(w=document.createElement("div"),w.classList.add("btn-menu-overlay"),w.addEventListener(s.a,e=>{Object(o.a)(e),m()})),g.parentElement.insertBefore(w,g),v=t,a.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(s.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:e,pageY:t},n,i){let{scrollWidth:o,scrollHeight:s}=n;const a=document.body.getBoundingClientRect(),c=a.width,d=a.height;i=r.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-o},intermediateX:"right"===i?8:c-o-8,y:{top:t,bottom:t-s},intermediateY:t=8},p={top:u.y.top+s+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function S(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),s=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&a.IS_TOUCH_SUPPORTED){let n;const r={capture:!0},a=()=>{clearTimeout(n),s("touchmove",a,r),s("touchend",a,r),s("touchcancel",a,r)};i("touchstart",s=>{s.touches.length>1?a():(i("touchmove",a,r),i("touchend",a,r),i("touchcancel",a,r),n=window.setTimeout(()=>{E?a():(t(s.touches[0]),a(),g&&e.addEventListener("touchend",o.a,{once:!0}))},400))})}else i("contextmenu",a.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",o.a,{once:!0})}:t)}},49:function(e,t,n){"use strict";var i=n(29),o=n(0),s=n(37),r=n(8),a=n(5),c=n(39),d=n(82);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(s.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(a.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),o.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(r.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-s!=1||(n+=String.fromCharCode(r(o>>>18&63),r(o>>>12&63),r(o>>>6&63),r(63&o)),o=0);return n.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function a(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=d(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"e",(function(){return s})),n.d(t,"b",(function(){return a})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return d})),n.d(t,"a",(function(){return l})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),o=n(45),s=n(29),r=n(68);const a=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(o.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(r.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};s.a&&(s.a.sequentialDom=a),t.a=a},78:function(e,t,n){"use strict";var i=n(29),o=n(62),s=n(33);const r=new class{constructor(){this.serverTimeOffset=0,o.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),s.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(0);function o(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}}}]); -//# sourceMappingURL=18.25e70e3100f53609fdd3.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{102:function(e,t,n){"use strict";n.d(t,"a",(function(){return p}));var i=n(5),o=n(30),s=n(9),r=n(16),a=n(33),c=n(15),d=n(34),l=n(35);let u,h=!1;function p(e){h||(u||(u=a.a.getConfig().then(e=>e.suggested_lang_code!==r.default.lastRequestedLangCode?Promise.all([e,r.default.getStrings(e.suggested_lang_code,["Login.ContinueOnLanguage"]),r.default.getCacheLangPack()]):[]))).then(([t,n])=>{if(!t)return;const a=[];n.forEach(e=>{const t=r.default.strings.get(e.key);t&&(a.push(t),r.default.strings.set(e.key,e))});const u=Object(d.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.ContinueOnLanguage"});u.lastElementChild.classList.remove("i18n"),Object(s.a)().then(()=>{window.requestAnimationFrame(()=>{e.append(u)})}),c.default.addEventListener("language_change",()=>{u.remove()},{once:!0}),a.forEach(e=>{r.default.strings.set(e.key,e)}),Object(o.b)(u,e=>{Object(i.a)(e),h=!0,u.disabled=!0,Object(l.f)(u),r.default.getLangPack(t.suggested_lang_code)})})}},108:function(e,t,n){"use strict";function i(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}n.d(t,"a",(function(){return i}))},18:function(e,t,n){"use strict";n.r(t),n.d(t,"ripple",(function(){return d}));var i=n(6),o=n(66),s=n(1),r=n(15),a=n(72);let c=0;function d(e,t=(()=>Promise.resolve()),n=null,d=!1,l=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let u=document.createElement("div");u.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&u.classList.add("is-square"),e[d?"prepend":"append"](u);const p=(e,i)=>{const r=Date.now(),a=document.createElement("div"),d=c++,l=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-r;const t=()=>{o.a.mutate(()=>{a.remove()}),n&&n(d)};if(ea.classList.add("hiding"),Math.max(n-l/2,0)),setTimeout(t,n)}else a.classList.add("hiding"),setTimeout(t,l/2);s.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,f=!1},t&&t(d),window.requestAnimationFrame(()=>{const t=u.getBoundingClientRect();a.classList.add("c-ripple__circle");const n=e-t.left,o=i-t.top,s=Math.sqrt(Math.pow(Math.abs(o-t.height/2)+t.height/2,2)+Math.pow(Math.abs(n-t.width/2)+t.width/2,2)),r=n-s/2,c=o-s/2;a.style.width=a.style.height=s+"px",a.style.left=r+"px",a.style.top=c+"px",u.append(a)})},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(i.a)(t.target,"c-ripple")!==u)&&(l===e||!Object(a.a)(t.target,l));let f=!1;if(s.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};l.addEventListener("touchstart",t=>{if(!r.default.settings.animationsEnabled)return;if(t.touches.length>1||f||m(t))return;f=!0;let{clientX:n,clientY:i}=t.touches[0];p(n,i),l.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),l.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else l.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!r.default.settings.animationsEnabled)return;if("0"===l.dataset.ripple||m(e))return;if(f)return void(f=!1);let{clientX:t,clientY:n}=e;p(t,n),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},22:function(e,t,n){"use strict";n.r(t);var i=n(33),o=n(69),s=n(78),r=n(56),a=n(7),c=n(34),d=n(16),l=n(17),u=n(15),h=n(35),p=n(102),m=n(81),f=n(108),g=function(e,t,n,i){return new(n||(n=Promise))((function(o,s){function r(e){try{c(i.next(e))}catch(e){s(e)}}function a(e){try{c(i.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((i=i.apply(e,t||[])).next())}))};let v;const w=new o.a("page-signQR",!0,()=>v,()=>{v||(v=g(void 0,void 0,void 0,(function*(){const e=w.pageEl.querySelector(".auth-image");let t=Object(h.f)(e,!0);const o=document.createElement("div");o.classList.add("input-wrapper");const l=Object(c.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Cancel"});o.append(l),Object(p.a)(o);const b=e.parentElement,y=document.createElement("h4");Object(d._i18n)(y,"Login.QR.Title");const E=document.createElement("ol");E.classList.add("qr-description"),["Login.QR.Help1","Login.QR.Help2","Login.QR.Help3"].forEach(e=>{const t=document.createElement("li");t.append(Object(d.i18n)(e)),E.append(t)}),b.append(y,E,o),l.addEventListener("click",()=>{Promise.all([n.e(3),n.e(20)]).then(n.bind(null,20)).then(e=>e.default.mount()),O=!0});const L=(yield Promise.all([n.e(11).then(n.t.bind(null,144,7))]))[0].default;let O=!1;u.default.addEventListener("user_auth",()=>{O=!0,v=null},{once:!0});let S,_={ignoreErrors:!0};const T=o=>g(void 0,void 0,void 0,(function*(){try{let c=yield i.a.invokeApi("auth.exportLoginToken",{api_id:a.a.id,api_hash:a.a.hash,except_ids:[]},{ignoreErrors:!0});if("auth.loginTokenMigrateTo"===c._&&(_.dcId||(_.dcId=c.dc_id,i.a.setBaseDcId(c.dc_id)),c=yield i.a.invokeApi("auth.importLoginToken",{token:c.token},_)),"auth.loginTokenSuccess"===c._){const e=c.authorization;return i.a.setUser(e.user),n.e(4).then(n.bind(null,19)).then(e=>e.default.mount()),!0}if(!S||!Object(r.b)(S,c.token)){S=c.token;let n=Object(r.e)(c.token),i="tg://login?token="+Object(f.a)(n,!0);const o=window.getComputedStyle(document.documentElement),s=o.getPropertyValue("--surface-color").trim(),a=o.getPropertyValue("--primary-text-color").trim(),d=o.getPropertyValue("--primary-color").trim(),l=yield fetch("assets/img/logo_padded.svg").then(e=>e.text()).then(e=>{e=e.replace(/(fill:).+?(;)/,`$1${d}$2`);const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise(e=>{const n=new FileReader;n.onload=t=>{e(t.target.result)},n.readAsDataURL(t)})}),u=new L({width:240*window.devicePixelRatio,height:240*window.devicePixelRatio,data:i,image:l,dotsOptions:{color:a,type:"rounded"},cornersSquareOptions:{type:"extra-rounded"},imageOptions:{imageSize:1,margin:0},backgroundOptions:{color:s},qrOptions:{errorCorrectionLevel:"L"}});let h;u.append(e),e.lastChild.classList.add("qr-canvas"),h=u._drawingPromise?u._drawingPromise:Promise.race([Object(m.a)(1e3),new Promise(e=>{u._canvas._image.addEventListener("load",()=>{window.requestAnimationFrame(()=>e())},{once:!0})})]),yield h.then(()=>{if(t){t.style.animation="hide-icon .4s forwards";const n=e.children[1];n.style.display="none",n.style.animation="grow-icon .4s forwards",setTimeout(()=>{n.style.display=""},150),setTimeout(()=>{n.style.animation=""},500),t=void 0}else Array.from(e.children).slice(0,-1).forEach(e=>{e.remove()})})}if(o){let e=Date.now()/1e3,t=c.expires-e-s.a.serverTimeOffset;yield Object(m.a)(t>3?3e3:1e3*t|0)}}catch(e){switch(e.type){case"SESSION_PASSWORD_NEEDED":console.warn("pageSignQR: SESSION_PASSWORD_NEEDED"),e.handled=!0,n.e(17).then(n.bind(null,21)).then(e=>e.default.mount()),O=!0,v=null;break;default:console.error("pageSignQR: default error:",e),O=!0}return!0}return!1}));return()=>g(void 0,void 0,void 0,(function*(){for(O=!1;!O&&!(yield T(!0)););}))}))),v.then(e=>{e()}),l.default.pushToState("authState",{_:"authStateSignQr"})});t.default=w},30:function(e,t,n){"use strict";n.d(t,"a",(function(){return s})),n.d(t,"b",(function(){return r})),n.d(t,"c",(function(){return a})),n.d(t,"d",(function(){return c}));var i=n(1),o=n(57);const s=i.IS_TOUCH_SUPPORTED?"mousedown":"click";function r(e,t,n={}){const i=n.listenerSetter?n.listenerSetter.add(e):e.addEventListener.bind(e);n.touchMouseDown=!0,i(s,t,n)}function a(e,t,n){e.removeEventListener(s,t,n)}function c(e){Object(o.a)(e,s)}},34:function(e,t,n){"use strict";var i=n(16),o=n(18);t.a=(e,t={})=>{const n=document.createElement(t.asDiv?"div":"button");return n.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&n.classList.add("rp-square"),Object(o.ripple)(n)),t.onlyMobile&&n.classList.add("only-handhelds"),t.disabled&&n.setAttribute("disabled","true"),t.text&&n.append(Object(i.i18n)(t.text)),n}},35:function(e,t,n){"use strict";n.d(t,"f",(function(){return u})),n.d(t,"g",(function(){return h})),n.d(t,"c",(function(){return f})),n.d(t,"d",(function(){return b})),n.d(t,"e",(function(){return y})),n.d(t,"b",(function(){return O})),n.d(t,"a",(function(){return S}));var i=n(29),o=n(5),s=n(30),r=n(38),a=n(1),c=n(0),d=n(15),l=n(49);function u(e,t=!1){const n='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=n,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",n),e.lastElementChild}function h(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,u(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.a.putPreloader=u;let p=e=>{let t=g.getBoundingClientRect(),{clientX:n,clientY:i}=e,o=n>=t.right?n-t.right:t.left-n,s=i>=t.bottom?i-t.bottom:t.top-i;(o>=100||s>=100)&&f()};const m=e=>{f()},f=()=>{g&&(g.classList.remove("active"),g.parentElement.classList.remove("menu-open"),w&&w.remove(),g=null,d.default.dispatchEvent("context_menu_toggle",!1)),v&&(v(),v=null),a.IS_TOUCH_SUPPORTED||(window.removeEventListener("mousemove",p),window.removeEventListener("contextmenu",m)),document.removeEventListener(s.a,m),c.IS_MOBILE_SAFARI||l.a.removeByType("menu")};window.addEventListener("resize",()=>{g&&f()});let g=null,v=null,w=null;function b(e,t){f(),c.IS_MOBILE_SAFARI||l.a.pushItem({type:"menu",onPop:e=>{f()}}),g=e,g.classList.add("active"),g.parentElement.classList.add("menu-open"),w||(w=document.createElement("div"),w.classList.add("btn-menu-overlay"),w.addEventListener(s.a,e=>{Object(o.a)(e),m()})),g.parentElement.insertBefore(w,g),v=t,a.IS_TOUCH_SUPPORTED||(window.addEventListener("mousemove",p),window.addEventListener("contextmenu",m,{once:!0})),document.addEventListener(s.a,m),d.default.dispatchEvent("context_menu_toggle",!0)}function y({pageX:e,pageY:t},n,i){let{scrollWidth:o,scrollHeight:s}=n;const a=document.body.getBoundingClientRect(),c=a.width,d=a.height;i=r.b.isMobile?"right":"left";let l="top";const u={x:{left:e,right:e-o},intermediateX:"right"===i?8:c-o-8,y:{top:t,bottom:t-s},intermediateY:t=8},p={top:u.y.top+s+8<=d,bottom:u.y.bottom-8>=8};{let e;e=h[i]?u.x[i]:(i="center",u.intermediateX),n.style.left=e+"px"}{let e;e=p[l]?u.y[l]:(l="center",u.intermediateY),n.style.top=e+"px"}n.className=n.className.replace(/(top|center|bottom)-(left|center|right)/g,""),n.classList.add(("center"===l?l:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left"))}let E=!1,L=0;function O(){L&&clearTimeout(L),L=window.setTimeout(()=>{L=0,E=!1},400),E=!0}function S(e,t,n){const i=n?n.add(e):e.addEventListener.bind(e),s=n?n.removeManual.bind(n,e):e.removeEventListener.bind(e);if(c.IS_APPLE&&a.IS_TOUCH_SUPPORTED){let n;const r={capture:!0},a=()=>{clearTimeout(n),s("touchmove",a,r),s("touchend",a,r),s("touchcancel",a,r)};i("touchstart",s=>{s.touches.length>1?a():(i("touchmove",a,r),i("touchend",a,r),i("touchcancel",a,r),n=window.setTimeout(()=>{E?a():(t(s.touches[0]),a(),g&&e.addEventListener("touchend",o.a,{once:!0}))},400))})}else i("contextmenu",a.IS_TOUCH_SUPPORTED?n=>{t(n),g&&e.addEventListener("touchend",o.a,{once:!0})}:t)}},49:function(e,t,n){"use strict";var i=n(29),o=n(0),s=n(37),r=n(8),a=n(5),c=n(39),d=n(82);const l=new class{constructor(){this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=Object(s.b)("NC"),this.debug=!0,this.currentHash=window.location.hash;let e=!1;if(window.addEventListener("popstate",t=>{if(this.debug&&this.log("popstate",t,e),window.location.hash!==this.currentHash)return this.onHashChange&&this.onHashChange(),void this.replaceState();this.currentHash=window.location.hash;if(t.state!==this.id)return void this.pushState();const n=this.navigations.pop();n?(this.manual=!e,this.handleItem(n)):this.pushState()}),window.addEventListener("keydown",e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||(Object(a.a)(e),this.back(t.type)))},{capture:!0,passive:!1}),o.IS_MOBILE_SAFARI){const t={passive:!0};window.addEventListener("touchstart",t=>{t.touches.length>1||(this.debug&&this.log("touchstart"),Object(d.a)(t)&&(e=!0,window.addEventListener("touchend",()=>{setTimeout(()=>{e=!1},100)},{passive:!0,once:!0})))},t)}history.scrollRestoration="manual",this.pushState()}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||Object(r.a)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const n=this.navigations[t];if(n.type===e)return{item:n,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}pushItem(e){this.navigations.push(e),this.debug&&this.log("pushstate",e,this.navigations),e.noHistory||this.pushState()}pushState(){this.manual=!1,history.pushState(this.id,"")}replaceState(){history.replaceState(this.id,"",location.origin+location.pathname)}removeItem(e){e&&Object(c.e)(this.navigations,e)}removeByType(e,t=!1){for(let n=this.navigations.length-1;n>=0;--n){if(this.navigations[n].type===e&&(this.navigations.splice(n,1),t))break}}};i.a.appNavigationController=l,t.a=l},56:function(e,t,n){"use strict";function i(e){const t=e.length,n=new Array(t);for(let i=0;i>>t&24),2!==t&&i-s!=1||(n+=String.fromCharCode(r(o>>>18&63),r(o>>>12&63),r(o>>>6&63),r(63&o)),o=0);return n.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function a(e,t){const n=e.length;if(n!==t.length)return!1;for(let i=0;ie+(t.byteLength||t.length),0),n=new Uint8Array(t);let i=0;return e.forEach(e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,i),i+=e.byteLength||e.length}),n}function u(e){const t=new Uint8Array(e.byteLength);for(let n=0,i=4*e.length;n>>2]>>>24-n%4*8&255;return t}function h(e){const t=d(e),n=[];for(let e=0,i=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}n.d(t,"f",(function(){return i})),n.d(t,"c",(function(){return o})),n.d(t,"e",(function(){return s})),n.d(t,"b",(function(){return a})),n.d(t,"h",(function(){return c})),n.d(t,"i",(function(){return d})),n.d(t,"a",(function(){return l})),n.d(t,"d",(function(){return u})),n.d(t,"g",(function(){return h}))},57:function(e,t,n){"use strict";function i(e,t){const n=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(n)}n.d(t,"a",(function(){return i}))},66:function(e,t,n){"use strict";var i=n(44),o=n(45),s=n(29),r=n(68);const a=new class{constructor(){this.promises={},this.raf=i.b.bind(null),this.scheduled=!1}do(e,t){let n=this.promises[e];return n||(this.scheduleFlush(),n=this.promises[e]=Object(o.a)()),void 0!==t&&n.then(()=>t()),n}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const n=Object(r.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&n.then(()=>t()),n}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};s.a&&(s.a.sequentialDom=a),t.a=a},78:function(e,t,n){"use strict";var i=n(29),o=n(62),s=n(33);const r=new class{constructor(){this.serverTimeOffset=0,o.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),s.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};i.a&&(i.a.serverTimeManager=r),t.a=r},82:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var i=n(0);function o(e){return i.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}}}]); +//# sourceMappingURL=18.33a13d3129fb705afcd7.chunk.js.map \ No newline at end of file diff --git a/public/18.25e70e3100f53609fdd3.chunk.js.map b/public/18.33a13d3129fb705afcd7.chunk.js.map similarity index 99% rename from public/18.25e70e3100f53609fdd3.chunk.js.map rename to public/18.33a13d3129fb705afcd7.chunk.js.map index 19a9e342a..0d6f8747b 100644 --- a/public/18.25e70e3100f53609fdd3.chunk.js.map +++ b/public/18.33a13d3129fb705afcd7.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","length","cancelBubble","stopPropagation","passive","button","dataset","page","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","animation","c","children","display","undefined","Array","from","slice","el","timestamp","diff","expires","serverTimeOffset","err","console","warn","handled","error","func","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","element","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","noHistory","origin","pathname","single","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","b","ArrayBuffer","bytesFromWordss","input","o","bytesToWordss","words","Uint32Array","simulateEvent","name","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent"],"mappings":"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","file":"18.25e70e3100f53609fdd3.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/components/languageChangeButton.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/ripple.ts","webpack:///./src/pages/pageSignQR.ts","webpack:///./src/helpers/dom/clickEvent.ts","webpack:///./src/components/button.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/helpers/dom/dispatchEvent.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/helpers/dom/isSwipingBackSafari.ts"],"names":["cachedPromise","set","getLanguageChangeButton","appendTo","getConfig","then","config","suggested_lang_code","lastRequestedLangCode","Promise","all","getStrings","getCacheLangPack","strings","backup","forEach","string","backupString","get","key","push","btnChangeLanguage","text","lastElementChild","classList","remove","window","requestAnimationFrame","append","addEventListener","once","e","disabled","getLangPack","fixBase64String","str","toUrl","replace","rippleClickId","ripple","elem","callback","resolve","onEnd","prepend","attachListenerTo","querySelector","add","r","document","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","Math","max","setTimeout","removeEventListener","touchStartFired","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","isRippleUnneeded","target","includes","tagName","touchEnd","settings","animationsEnabled","touches","length","cancelBubble","stopPropagation","passive","button","dataset","page","imageDiv","pageEl","preloader","inputWrapper","btnBack","container","parentElement","h4","helpList","li","m","default","mount","stop","QRCodeStyling","prevToken","options","ignoreErrors","iterate","isLoop","loginToken","invokeApi","api_id","id","api_hash","hash","except_ids","_","dcId","dc_id","setBaseDcId","token","authorization","setUser","user","encoded","url","documentElement","surfaceColor","trim","textColor","primaryColor","logoUrl","fetch","res","blob","Blob","type","reader","FileReader","onload","result","readAsDataURL","qrCode","devicePixelRatio","data","image","dotsOptions","color","cornersSquareOptions","imageOptions","imageSize","margin","backgroundOptions","qrOptions","errorCorrectionLevel","promise","lastChild","_drawingPromise","race","_canvas","_image","animation","c","children","display","undefined","Array","from","slice","el","timestamp","diff","expires","serverTimeOffset","err","console","warn","handled","error","func","pushToState","CLICK_EVENT_NAME","attachClickEvent","listenerSetter","bind","touchMouseDown","detachClickEvent","simulateClickEvent","className","asDiv","icon","noRipple","rippleSquare","onlyMobile","setAttribute","putPreloader","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","setButtonLoader","removeAttribute","onMouseMove","openedMenu","diffX","right","diffY","bottom","closeBtnMenu","onClick","menuOverlay","dispatchEvent","openedMenuOnClose","removeByType","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","windowHeight","isMobile","verticalSide","sides","intermediateX","intermediateY","possibleSides","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","clearTimeout","attachContextMenuListener","element","removeManual","timeout","capture","onCancel","appNavigationController","navigations","manual","log","debug","currentHash","location","isPossibleSwipe","this","onHashChange","replaceState","state","pushState","item","pop","handleItem","onEscape","back","history","scrollRestoration","good","noBlurOnPop","i","index","ret","findItemByType","backByItem","indexOf","splice","noHistory","origin","pathname","single","bytesToHex","bytes","arr","toString","join","bytesFromHex","hexString","len","Uint8Array","ceil","start","parseInt","charAt","substr","bytesToBase64","mod3","nLen","nUint24","nIdx","String","fromCharCode","uint6ToBase64","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","v","byteLength","tmp","lastLength","b","ArrayBuffer","bytesFromWordss","input","o","bytesToWordss","words","Uint32Array","simulateEvent","name","event","Event","bubbles","cancelable","sequentialDom","promises","raf","scheduled","kind","scheduleFlush","do","read","write","serverTimeManager","to","addTaskListener","task","payload","isSwipingBackSafari","TouchEvent"],"mappings":"uFAAA,oGAgBA,IAmBIA,EAnBAC,GAAM,EAqBK,SAASC,EAAwBC,GAC3CF,IAnBAD,IACIA,EAAgB,IAAWI,YAAYC,KAAKC,GAC9CA,EAAOC,sBAAwB,UAAKC,sBAG9BC,QAAQC,IAAI,CACjBJ,EACA,UAAKK,WAAWL,EAAOC,oBAAqB,CAAC,6BAC7C,UAAKK,qBAGA,MASDP,KAAK,EAAEC,EAAQO,MACvB,IAAIP,EACF,OAGF,MAAMQ,EAA2B,GACjCD,EAAQE,QAAQC,IACd,MAAMC,EAAe,UAAKJ,QAAQK,IAAIF,EAAOG,KACzCF,IAIJH,EAAOM,KAAKH,GACZ,UAAKJ,QAAQZ,IAAIe,EAAOG,IAAoBH,MAG9C,MAAMK,EAAoB,YAAO,4DAA6D,CAACC,KAAM,6BACrGD,EAAkBE,iBAAiBC,UAAUC,OAAO,QACpD,cAAYpB,KAAK,KACfqB,OAAOC,sBAAsB,KAC3BxB,EAASyB,OAAOP,OAIpB,UAAUQ,iBAAiB,kBAAmB,KAC5CR,EAAkBI,UACjB,CAACK,MAAM,IAEVhB,EAAOC,QAAQC,IACb,UAAKH,QAAQZ,IAAIe,EAAOG,IAAoBH,KAG9C,YAAiBK,EAAoBU,IACnC,YAAYA,GAEZ9B,GAAM,EAENoB,EAAkBW,UAAW,EAC7B,YAAaX,GAEb,UAAKY,YAAY3B,EAAOC,2B,iCC/Ef,SAAS2B,EAAgBC,EAAaC,GACnD,OAAGA,EACMD,EAAIE,QAAQ,MAAO,KAAKA,QAAQ,MAAO,KAAKA,QAAQ,OAAQ,IAE5DF,EAAIE,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAJhD,mC,gCCAA,wFAYA,IAAIC,EAAgB,EACb,SAASC,EACdC,EACAC,EAAoD,KAAMhC,QAAQiC,WAClEC,EAA8B,KAC9BC,GAAU,EACVC,EAAmBL,GAGnB,GAAGA,EAAKM,cAAc,aAAc,OACpCN,EAAKhB,UAAUuB,IAAI,MAEnB,IAAIC,EAAIC,SAASC,cAAc,OAC/BF,EAAExB,UAAUuB,IAAI,YAShB,IAAII,EAPaX,EAAKhB,UAAU4B,SAAS,cAEvCJ,EAAExB,UAAUuB,IAAI,aAGlBP,EAAKI,EAAU,UAAY,UAAUI,GAIrC,MAAMK,EAAa,CAACC,EAAiBC,KACnC,MAAMC,EAAYC,KAAKC,MACjBlB,EAAOS,SAASC,cAAc,OAE9BS,EAAUrB,IAIVsB,EAAgG,KAApFlC,OAAOmC,iBAAiBb,GAAGc,iBAAiB,qBAAqBzB,QAAQ,IAAK,IAGhGc,EAAU,KAMR,IAAIY,EAAcN,KAAKC,MAAQF,EAC/B,MAAMQ,EAAK,KAET,IAAcC,OAAO,KACnBzB,EAAKf,WAGJkB,GAAOA,EAAMgB,IAElB,GAAGI,EAAcH,EAAU,CACzB,IAAIM,EAAQC,KAAKC,IAAIR,EAAWG,EAAaH,EAAW,GACxDS,WAAW,IAAM7B,EAAKhB,UAAUuB,IAAI,UAAWoB,KAAKC,IAAIF,EAAQN,EAAW,EAAG,IAE9ES,WAAWL,EAAIE,QAEf1B,EAAKhB,UAAUuB,IAAI,UACnBsB,WAAWL,EAAIJ,EAAW,GAGxB,sBACFlC,OAAO4C,oBAAoB,cAAenB,GAG5CA,EAAU,KACVoB,GAAkB,GAIpB9B,GAAYA,EAASkB,GAenBjC,OAAOC,sBAAsB,KAC3B,MAAM6C,EAAOxB,EAAEyB,wBACfjC,EAAKhB,UAAUuB,IAAI,oBAEnB,MAAM2B,EAASpB,EAAUkB,EAAKG,KACxBC,EAASrB,EAAUiB,EAAKK,IAGxBC,EADSX,KAAKY,KAAK,SAACZ,KAAKa,IAAIJ,EAASJ,EAAKS,OAAS,GAAKT,EAAKS,OAAS,EAAM,GAAI,SAACd,KAAKa,IAAIN,EAASF,EAAKU,MAAQ,GAAKV,EAAKU,MAAQ,EAAM,IAIzIC,EAAIT,EAASI,EAAO,EACpBM,EAAIR,EAASE,EAAO,EAI1BtC,EAAK6C,MAAMH,MAAQ1C,EAAK6C,MAAMJ,OAASH,EAAO,KAC9CtC,EAAK6C,MAAMV,KAAOQ,EAAI,KACtB3C,EAAK6C,MAAMR,IAAMO,EAAI,KAgBrBpC,EAAEpB,OAAOY,MAQT8C,EAAoBvD,GAAaA,EAAEwD,SAAW/C,IAChD,CAAC,SAAU,KAAKgD,SAAUzD,EAAEwD,OAAuBE,UAChD,YAAgB1D,EAAEwD,OAAuB,cAAgBvC,KAE5DH,IAAqBL,IACjB,YAAcT,EAAEwD,OAAQ1C,IAIhC,IAAI0B,GAAkB,EACtB,GAAG,qBAAoB,CACrB,IAAImB,EAAW,KACbvC,GAAWA,KAGbN,EAAiBhB,iBAAiB,aAAeE,IAC/C,IAAI,UAAU4D,SAASC,kBACrB,OAIF,GAAG7D,EAAE8D,QAAQC,OAAS,GAAKvB,GAAmBe,EAAiBvD,GAC7D,OAIFwC,GAAkB,EAElB,IAAI,QAACjB,EAAO,QAAEC,GAAWxB,EAAE8D,QAAQ,GACnCxC,EAAWC,EAASC,GACpBV,EAAiBhB,iBAAiB,WAAY6D,EAAU,CAAC5D,MAAM,IAE/DJ,OAAOG,iBAAiB,YAAcE,IACpCA,EAAEgE,cAAe,EACjBhE,EAAEiE,kBACFN,IACA7C,EAAiByB,oBAAoB,WAAYoB,IAChD,CAAC5D,MAAM,KACT,CAACmE,SAAS,SAEbpD,EAAiBhB,iBAAiB,YAAcE,IAC9C,IAAI,CAAC,EAAG,GAAGyD,SAASzD,EAAEmE,QACpB,OAGF,IAAI,UAAUP,SAASC,kBACrB,OAIF,GAAuC,MAApC/C,EAAiBsD,QAAQ5D,QAAkB+C,EAAiBvD,GAC7D,OACK,GAAGwC,EAER,YADAA,GAAkB,GAIpB,IAAI,QAACjB,EAAO,QAAEC,GAAWxB,EACzBsB,EAAWC,EAASC,GACpB7B,OAAOG,iBAAiB,UAAWsB,EAAS,CAACrB,MAAM,EAAMmE,SAAS,IAClEvE,OAAOG,iBAAiB,cAAesB,EAAS,CAACrB,MAAM,EAAMmE,SAAS,KACrE,CAACA,SAAS,M,gCCvMjB,oH,sSAyBA,IAyNIjG,EACJ,MAAMoG,EAAO,IAAI,IAAK,eAAe,EAAM,IAClCpG,EACN,KAEGA,IAAeA,EA9NS,OAAD,6BAC3B,MACMqG,EADcD,EAAKE,OACIxD,cAAc,eAE3C,IAAIyD,EAAY,YAAaF,GAAU,GAEvC,MAAMG,EAAevD,SAASC,cAAc,OAC5CsD,EAAahF,UAAUuB,IAAI,iBAE3B,MAAM0D,EAAU,YAAO,4DAA6D,CAACnF,KAAM,oBAC3FkF,EAAa5E,OAAO6E,GAEpB,YAAwBD,GAExB,MAAME,EAAYL,EAASM,cAErBC,EAAK3D,SAASC,cAAc,MAClC,gBAAM0D,EAAI,kBAEV,MAAMC,EAAW5D,SAASC,cAAc,MACxC2D,EAASrF,UAAUuB,IAAI,kBACtB,CAAC,iBAAkB,iBAAkB,kBAAoChC,QAASI,IACjF,MAAM2F,EAAK7D,SAASC,cAAc,MAClC4D,EAAGlF,OAAO,eAAKT,IACf0F,EAASjF,OAAOkF,KAGlBJ,EAAU9E,OAAOgF,EAAIC,EAAUL,GAE/BC,EAAQ5E,iBAAiB,QAAS,KAChC,oDAAuBxB,KAAK0G,GAAKA,EAAEC,QAAQC,SAC3CC,GAAO,IAGT,MAGMC,SAHgB1G,QAAQC,IAAI,CAChC,sCAE4B,GAAGsG,QAEjC,IAAIE,GAAO,EACX,UAAUrF,iBAAiB,YAAa,KACtCqF,GAAO,EACPlH,EAAgB,MACf,CAAC8B,MAAM,IAEV,IACIsF,EADAC,EAA6C,CAACC,cAAc,GAGhE,MAAMC,EAAgBC,GAAoB,OAAD,6BACvC,IACE,IAAIC,QAAmB,IAAWC,UAAU,wBAAyB,CACnEC,OAAQ,IAAIC,GACZC,SAAU,IAAIC,KACdC,WAAY,IACX,CAACT,cAAc,IAclB,GAZoB,6BAAjBG,EAAWO,IACRX,EAAQY,OACVZ,EAAQY,KAAOR,EAAWS,MAC1B,IAAWC,YAAYV,EAAWS,QAIpCT,QAAmB,IAAWC,UAAU,wBAAyB,CAC/DU,MAAOX,EAAWW,OACjBf,IAGe,2BAAjBI,EAAWO,EAAgC,CAC5C,MAAMK,EAAgBZ,EAAWY,cAGjC,OAFA,IAAWC,QAAQD,EAAcE,MACjC,6BAAmBlI,KAAK0G,GAAKA,EAAEC,QAAQC,UAChC,EAOT,IAAIG,IAAc,YAASA,EAAWK,EAAWW,OAAQ,CACvDhB,EAAYK,EAAWW,MAEvB,IAAII,EAAU,YAAcf,EAAWW,OACnCK,EAAM,oBAAsB,YAAgBD,GAAS,GAEzD,MAAMnD,EAAQ3D,OAAOmC,iBAAiBZ,SAASyF,iBACzCC,EAAetD,EAAMvB,iBAAiB,mBAAmB8E,OACzDC,EAAYxD,EAAMvB,iBAAiB,wBAAwB8E,OAC3DE,EAAezD,EAAMvB,iBAAiB,mBAAmB8E,OAEzDG,QAAgBC,MAAM,8BAC3B3I,KAAK4I,GAAOA,EAAI3H,QAChBjB,KAAKiB,IACJA,EAAOA,EAAKe,QAAQ,gBAAiB,KAAKyG,OAC1C,MAAMI,EAAO,IAAIC,KAAK,CAAC7H,GAAO,CAAC8H,KAAM,gCAGrC,OAAO,IAAI3I,QAAiBiC,IAC1B,MAAM2G,EAAS,IAAIC,WACnBD,EAAOE,OAAUxH,IACfW,EAAQX,EAAEwD,OAAOiE,SAEnBH,EAAOI,cAAcP,OAKnBQ,EAAS,IAAIvC,EAAc,CAC/BjC,MAAO,IAAMxD,OAAOiI,iBACpB1E,OAAQ,IAAMvD,OAAOiI,iBACrBC,KAAMnB,EACNoB,MAAOd,EACPe,YAAa,CACXC,MAAOlB,EACPO,KAAM,WAERY,qBAAsB,CACpBZ,KAAM,iBAERa,aAAc,CACZC,UAAW,EACXC,OAAQ,GAEVC,kBAAmB,CACjBL,MAAOpB,GAET0B,UAAW,CACTC,qBAAsB,OAO1B,IAAIC,EAHJb,EAAO9H,OAAOyE,GACbA,EAASmE,UAAgChJ,UAAUuB,IAAI,aAItDwH,EADCb,EAAOe,gBACEf,EAAOe,gBAEPhK,QAAQiK,KAAK,CACrB,YAAM,KACN,IAAIjK,QAAeiC,IACjBgH,EAAOiB,QAAQC,OAAO/I,iBAAiB,OAAQ,KAC7CH,OAAOC,sBAAsB,IAAMe,MAClC,CAACZ,MAAM,cAMVyI,EAAQlK,KAAK,KACjB,GAAGkG,EAAW,CACZA,EAAUlB,MAAMwF,UAAY,yBAE5B,MAAMC,EAAIzE,EAAS0E,SAAS,GAC5BD,EAAEzF,MAAM2F,QAAU,OAClBF,EAAEzF,MAAMwF,UAAY,yBACpBxG,WAAW,KACTyG,EAAEzF,MAAM2F,QAAU,IACjB,KAEH3G,WAAW,KACTyG,EAAEzF,MAAMwF,UAAY,IACnB,KACHtE,OAAY0E,OAEZC,MAAMC,KAAK9E,EAAS0E,UAAUK,MAAM,GAAI,GAAGrK,QAAQsK,IACjDA,EAAG5J,aAMX,GAAG+F,EAAQ,CACT,IAAI8D,EAAY7H,KAAKC,MAAQ,IACzB6H,EAAO9D,EAAW+D,QAAUF,EAAY,IAAkBG,uBAExD,YAAMF,EAlLG,EAkLqB,IAAuB,IAAMA,EAAO,IAE1E,MAAMG,GACN,OAAQA,EAAiBtC,MACvB,IAAK,0BACHuC,QAAQC,KAAK,uCACZF,EAAiBG,SAAU,EAC5B,8BAAyBxL,KAAK0G,GAAKA,EAAEC,QAAQC,SAC7CC,GAAO,EACPlH,EAAgB,KAChB,MACF,QACE2L,QAAQG,MAAM,6BAA8BJ,GAC5CxE,GAAO,EAIX,OAAO,EAGT,OAAO,KAKT,MAAO,IAAW,OAAD,6BAGf,IAFAA,GAAO,GAGFA,WAIqBK,GAAQ,cAcpCvH,EAAcK,KAAK0L,IACjBA,MAGF,UAAgBC,YAAY,YAAa,CAAChE,EAAG,sBAGhC,a,gCC/Pf,2JAUO,MAAMiE,EAA8D,qBAAqB,YAAc,QAEvG,SAASC,EAAiB1J,EAA4BC,EAAsD4E,EAA8B,IAC/I,MAAMtE,EAAMsE,EAAQ8E,eAAiB9E,EAAQ8E,eAAepJ,IAAIP,GAAQA,EAAKX,iBAAiBuK,KAAK5J,GAGnG6E,EAAQgF,gBAAiB,EA4BzBtJ,EAAIkJ,EAAkBxJ,EAAU4E,GAG3B,SAASiF,EAAiB9J,EAAmBC,EAAgD4E,GAIhG7E,EAAK8B,oBAAoB2H,EAAkBxJ,EAAU4E,GAIlD,SAASkF,EAAmB/J,GACjC,YAAcA,EAAMyJ,K,gCCxDtB,oBA8Ce,IA3BA,CAACO,EAAmBnF,EAAyB,MAC1D,MAAMnB,EAA4BjD,SAASC,cAAcmE,EAAQoF,MAAQ,MAAQ,UAuBjF,OAtBAvG,EAAOsG,UAAYA,GAAanF,EAAQqF,KAAO,UAAYrF,EAAQqF,KAAO,IAEtErF,EAAQsF,WACPtF,EAAQuF,cACT1G,EAAO1E,UAAUuB,IAAI,aAGvB,iBAAOmD,IAGNmB,EAAQwF,YACT3G,EAAO1E,UAAUuB,IAAI,kBAGpBsE,EAAQrF,UACTkE,EAAO4G,aAAa,WAAY,QAG/BzF,EAAQ/F,MACT4E,EAAOtE,OAAO,eAAKyF,EAAQ/F,OAGtB4E,I,gCC3CT,+SAgBO,SAAS6G,EAAavK,EAAewK,GAAY,GACtD,MAAMC,EAAO,wMAKb,GAAGD,EAAW,CACZ,MAAME,EAAMjK,SAASC,cAAc,OAQnC,OAPAgK,EAAI1L,UAAUuB,IAAI,aAClBmK,EAAIC,UAAYF,EAEbzK,GACDA,EAAK4K,YAAYF,GAGZA,EAIT,OADA1K,EAAK6K,mBAAmB,YAAaJ,GAC9BzK,EAAKjB,iBAKP,SAAS+L,EAAgB9K,EAAyBkK,EAAO,SAK9D,OAJAlK,EAAKhB,UAAUC,OAAO,SAAWiL,GACjClK,EAAKR,UAAW,EAChB+K,EAAavK,GAEN,KACLA,EAAK2K,UAAY,GACjB3K,EAAKhB,UAAUuB,IAAI,SAAW2J,GAC9BlK,EAAK+K,gBAAgB,aAVzB,IAAeR,aAAeA,EAsB9B,IAAIS,EAAezL,IACjB,IAAIyC,EAAOiJ,EAAWhJ,yBAClB,QAACnB,EAAO,QAAEC,GAAWxB,EAErB2L,EAAQpK,GAAWkB,EAAKmJ,MAAQrK,EAAUkB,EAAKmJ,MAAQnJ,EAAKG,KAAOrB,EACnEsK,EAAQrK,GAAWiB,EAAKqJ,OAAStK,EAAUiB,EAAKqJ,OAASrJ,EAAKK,IAAMtB,GAErEmK,GAAS,KAAOE,GAAS,MAC1BE,KAMJ,MAAMC,EAAWhM,IAEf+L,KAWWA,EAAe,KACvBL,IACDA,EAAWjM,UAAUC,OAAO,UAC5BgM,EAAW9G,cAAcnF,UAAUC,OAAO,aAEvCuM,GAAaA,EAAYvM,SAC5BgM,EAAa,KAEb,UAAUQ,cAAc,uBAAuB,IAG9CC,IACDA,IACAA,EAAoB,MAGlB,uBACFxM,OAAO4C,oBAAoB,YAAakJ,GAExC9L,OAAO4C,oBAAoB,cAAeyJ,IAG5C9K,SAASqB,oBAAoB,IAAkByJ,GAE3C,oBACF,IAAwBI,aAAa,SAIzCzM,OAAOG,iBAAiB,SAAU,KAC7B4L,GACDK,MAWJ,IAAIL,EAA0B,KAAMS,EAAgC,KAAMF,EAA2B,KAC9F,SAASI,EAAYC,EAA0BC,GACpDR,IAEI,oBACF,IAAwBS,SAAS,CAC/BnF,KAAM,OACNoF,MAAQC,IACNX,OAKNL,EAAaY,EACbZ,EAAWjM,UAAUuB,IAAI,UACzB0K,EAAW9G,cAAcnF,UAAUuB,IAAI,aAEnCiL,IACFA,EAAc/K,SAASC,cAAc,OACrC8K,EAAYxM,UAAUuB,IAAI,oBAG1BiL,EAAYnM,iBAAiB,IAAmBE,IAC9C,YAAYA,GACZgM,OAIJN,EAAW9G,cAAc+H,aAAaV,EAAaP,GAInDS,EAAoBI,EAEhB,uBACF5M,OAAOG,iBAAiB,YAAa2L,GAErC9L,OAAOG,iBAAiB,cAAekM,EAAS,CAACjM,MAAM,KAUzDmB,SAASpB,iBAAiB,IAAkBkM,GAE5C,UAAUE,cAAc,uBAAuB,GAK1C,SAASU,GAAa,MAACC,EAAK,MAAEC,GAA4BrM,EAAmBsM,GAKlF,IAAKC,YAAaC,EAAWC,aAAcC,GAAc1M,EAEzD,MAAMgC,EAAOvB,SAASkM,KAAK1K,wBACrB2K,EAAc5K,EAAKU,MACnBmK,EAAe7K,EAAKS,OAE1B6J,EAAO,IAAWQ,SAAW,QAAU,OACvC,IAAIC,EAAkD,MAEtD,MAiBMC,EAhBG,CACLrK,EAAG,CACDR,KAAMiK,EACNjB,MAAOiB,EAAQI,GAEjBS,cAAwB,UAATX,EArBA,EAqBkCM,EAAcJ,EArBhD,EAuBf5J,EAAG,CACDP,IAAKgK,EACLhB,OAAQgB,EAAQK,GAGlBQ,cAAeb,EAAQQ,EAAe,EA7BxB,EA6B0CA,EAAeH,EA7BzD,GAmCZS,EACD,CACDhL,KAAM6K,EAAMrK,EAAER,KAAOqK,EApCN,GAoCkCI,EACjDzB,MAAO6B,EAAMrK,EAAEwI,OArCA,GAkCbgC,EAKD,CACD9K,IAAK2K,EAAMpK,EAAEP,IAAMqK,EAzCL,GAyCiCG,EAC/CxB,OAAQ2B,EAAMpK,EAAEyI,OA1CF,MAoDlB,CAUE,IAAIlJ,EAQJA,EAAOgL,EAAgBb,GAAQU,EAAMrK,EAAE2J,IAASA,EAAO,SAAUU,EAAMC,eAEvEjN,EAAK6C,MAAMV,KAAOA,EAAO,KAY3B,CACE,IAAIE,EAEJA,EAAM8K,EAAgBJ,GAAgBC,EAAMpK,EAAEmK,IAAiBA,EAAe,SAAUC,EAAME,eAE9FlN,EAAK6C,MAAMR,IAAMA,EAAM,KAGzBrC,EAAKgK,UAAYhK,EAAKgK,UAAUnK,QAAQ,2CAA4C,IACpFG,EAAKhB,UAAUuB,KAEK,WAAjBwM,EAA4BA,EAAe,UAC5C,KACU,WAATT,EAAoBA,EAAiB,SAATA,EAAkB,QAAU,SAG7D,IAAIc,GAA4B,EAAOC,EAAmC,EACnE,SAASC,IACXD,GACDE,aAAaF,GAGfA,EAAmCnO,OAAO2C,WAAW,KACnDwL,EAAmC,EACnCD,GAA4B,GAC3B,KAEHA,GAA4B,EAGvB,SAASI,EAA0BC,EAAsBxN,EAA2C0J,GACzG,MAAMpJ,EAAMoJ,EAAiBA,EAAepJ,IAAIkN,GAAWA,EAAQpO,iBAAiBuK,KAAK6D,GACnFxO,EAAS0K,EAAiBA,EAAe+D,aAAa9D,KAAKD,EAAgB8D,GAAWA,EAAQ3L,oBAAoB8H,KAAK6D,GAE7H,GAAG,YAAY,qBAAoB,CACjC,IAAIE,EAEJ,MAAM9I,EAAgC,CAAC+I,SAAS,GAE1CC,EAAW,KACfN,aAAaI,GAEb1O,EAAO,YAAa4O,EAAUhJ,GAE9B5F,EAAO,WAAY4O,EAAUhJ,GAE7B5F,EAAO,cAAe4O,EAAUhJ,IAGlCtE,EAAI,aAAehB,IACdA,EAAE8D,QAAQC,OAAS,EACpBuK,KAIFtN,EAAI,YAAasN,EAAUhJ,GAC3BtE,EAAI,WAAYsN,EAAUhJ,GAC1BtE,EAAI,cAAesN,EAAUhJ,GAE7B8I,EAAUzO,OAAO2C,WAAW,KACvBuL,EACDS,KAIF5N,EAASV,EAAE8D,QAAQ,IACnBwK,IAEG5C,GACDwC,EAAQpO,iBAAiB,WAAY,IAAa,CAACC,MAAM,MAE1D,aASLiB,EAAI,cAAe,qBAAsBhB,IACvCU,EAASV,GAEN0L,GACDwC,EAAQpO,iBAAiB,WAAY,IAAa,CAACC,MAAM,KAEzDW,K,gCC/VR,yDAmNA,MAAM6N,EAA0B,IA1LzB,MASL,cARQ,KAAAC,YAAqC,GACrC,KAAA3I,GAAKnE,KAAKC,MACV,KAAA8M,QAAS,EACT,KAAAC,IAAM,YAAO,MACb,KAAAC,OAAQ,EACR,KAAAC,YAAcjP,OAAOkP,SAAS9I,KAIpC,IAAI+I,GAAkB,EAqCtB,GApCAnP,OAAOG,iBAAiB,WAAaE,IAGnC,GAFA+O,KAAKJ,OAASI,KAAKL,IAAI,WAAY1O,EAAG8O,GAEnCnP,OAAOkP,SAAS9I,OAASgJ,KAAKH,YAG/B,OAFAG,KAAKC,cAAgBD,KAAKC,oBAC1BD,KAAKE,eAGPF,KAAKH,YAAcjP,OAAOkP,SAAS9I,KAGnC,GADmB/F,EAAEkP,QACXH,KAAKlJ,GAEb,YADAkJ,KAAKI,YAIP,MAAMC,EAAOL,KAAKP,YAAYa,MAC1BD,GAKJL,KAAKN,QAAUK,EACfC,KAAKO,WAAWF,IALdL,KAAKI,cASTxP,OAAOG,iBAAiB,UAAYE,IAClC,MAAMoP,EAAOL,KAAKP,YAAYO,KAAKP,YAAYzK,OAAS,GACpDqL,IACS,WAAVpP,EAAEZ,KAAqBgQ,EAAKG,WAAWH,EAAKG,aAC7C,YAAYvP,GACZ+O,KAAKS,KAAKJ,EAAK/H,SAEhB,CAACgH,SAAS,EAAMnK,SAAS,IAEzB,mBAAkB,CACnB,MAAMoB,EAAU,CAACpB,SAAS,GAC1BvE,OAAOG,iBAAiB,aAAeE,IAClCA,EAAE8D,QAAQC,OAAS,IACtBgL,KAAKJ,OAASI,KAAKL,IAAI,cAEpB,YAAoB1O,KACrB8O,GAAkB,EAElBnP,OAAOG,iBAAiB,WAAY,KAClCwC,WAAW,KACTwM,GAAkB,GACjB,MACF,CAAC5K,SAAS,EAAMnE,MAAM,OAoC1BuF,GAGLmK,QAAQC,kBAAoB,SAE5BX,KAAKI,YAGC,WAAWC,GACjB,MAAMO,EAAOP,EAAK3C,QAAOsC,KAAKN,aAAiBvF,GAC/C6F,KAAKJ,OAASI,KAAKL,IAAI,wBAAyBU,EAAML,KAAKP,cAC/C,IAATmB,EACDZ,KAAKvC,SAAS4C,GACLA,EAAKQ,aACd,cAGFb,KAAKN,QAAS,EAGT,eAAepH,GACpB,IAAI,IAAIwI,EAAId,KAAKP,YAAYzK,OAAS,EAAG8L,GAAK,IAAKA,EAAG,CACpD,MAAMT,EAAOL,KAAKP,YAAYqB,GAC9B,GAAGT,EAAK/H,OAASA,EACf,MAAO,CAAC+H,OAAMU,MAAOD,IAKpB,KAAKxI,GACV,GAAGA,EAAM,CACP,MAAM0I,EAAMhB,KAAKiB,eAAe3I,GAChC,GAAG0I,EAED,YADAhB,KAAKkB,WAAWF,EAAIX,KAAMW,EAAID,OAKlCL,QAAQD,OAGH,WAAWJ,EAAsBU,EAAQf,KAAKP,YAAY0B,QAAQd,IACvEL,KAAKN,QAAS,EAGZM,KAAKP,YAAY2B,OAAOL,EAAO,GAC/Bf,KAAKO,WAAWF,GAIb,SAASA,GACdL,KAAKP,YAAYnP,KAAK+P,GACtBL,KAAKJ,OAASI,KAAKL,IAAI,YAAaU,EAAML,KAAKP,aAE3CY,EAAKgB,WACPrB,KAAKI,YAID,YACNJ,KAAKN,QAAS,EACdgB,QAAQN,UAAUJ,KAAKlJ,GAAI,IAGtB,eACL4J,QAAQR,aAAaF,KAAKlJ,GAAI,GAAIgJ,SAASwB,OAASxB,SAASyB,UAGxD,WAAWlB,GACZA,GAIJ,YAAiBL,KAAKP,YAAaY,GAG9B,aAAa/H,EAA8BkJ,GAAS,GACzD,IAAI,IAAIV,EAAId,KAAKP,YAAYzK,OAAS,EAAG8L,GAAK,IAAKA,EAAG,CAEpD,GADad,KAAKP,YAAYqB,GACtBxI,OAASA,IACf0H,KAAKP,YAAY2B,OAAON,EAAG,GAExBU,GACD,SAQV,IAAehC,wBAA0BA,EAC1B,O,gCC1MR,SAASiC,EAAWC,GACzB,MAAM1M,EAAS0M,EAAM1M,OACf2M,EAAgB,IAAIvH,MAAMpF,GAChC,IAAI,IAAI8L,EAAI,EAAGA,EAAI9L,IAAU8L,EAC3Ba,EAAIb,IAAMY,EAAMZ,GAAK,GAAK,IAAM,KAAOY,EAAMZ,IAAM,GAAGc,SAAS,IAEjE,OAAOD,EAAIE,KAAK,IAGX,SAASC,EAAaC,GAC3B,MAAMC,EAAMD,EAAU/M,OAChB0M,EAAQ,IAAIO,WAAW5O,KAAK6O,KAAKF,EAAM,IAC7C,IAAIG,EAAQ,EAETH,EAAM,IACPN,EAAMS,KAAWC,SAASL,EAAUM,OAAO,GAAI,KAGjD,IAAI,IAAIvB,EAAIqB,EAAOrB,EAAIkB,EAAKlB,GAAK,EAC/BY,EAAMS,KAAWC,SAASL,EAAUO,OAAOxB,EAAG,GAAI,IAGpD,OAAOY,EAGF,SAASa,EAAcb,GAC5B,IAAIc,EACA9J,EAAS,GAEb,IAAI,IAAI+J,EAAOf,EAAM1M,OAAQ0N,EAAU,EAAGC,EAAO,EAAGA,EAAOF,IAAQE,EACjEH,EAAOG,EAAO,EACdD,GAAWhB,EAAMiB,KAAU,KAAOH,EAAO,IAC7B,IAATA,GAAcC,EAAOE,GAAS,IAC/BjK,GAAUkK,OAAOC,aACfC,EAAcJ,IAAY,GAAK,IAC/BI,EAAcJ,IAAY,GAAK,IAC/BI,EAAcJ,IAAY,EAAI,IAC9BI,EAAwB,GAAVJ,IAEhBA,EAAU,GAId,OAAOhK,EAAOnH,QAAQ,aAAc,KAG/B,SAASuR,EAAcC,GAC5B,OAAOA,EAAS,GACZA,EAAS,GACTA,EAAS,GACPA,EAAS,GACTA,EAAS,GACPA,EAAS,EACE,KAAXA,EACE,GACW,KAAXA,EACE,GACA,GAGP,SAASC,EAASC,EAA+BC,GACtD,MAAMlB,EAAMiB,EAAOjO,OACnB,GAAGgN,IAAQkB,EAAOlO,OAChB,OAAO,EAGT,IAAI,IAAI8L,EAAI,EAAGA,EAAIkB,IAAOlB,EACxB,GAAGmC,EAAOnC,KAAOoC,EAAOpC,GACtB,OAAO,EAIX,OAAO,EAGF,SAASqC,EAASF,EAAoBC,GAC3C,MAAMlB,EAAMiB,EAAOjO,OACb0M,EAAQ,IAAIO,WAAWD,GAE7B,IAAI,IAAIlB,EAAI,EAAGA,EAAIkB,IAAOlB,EACxBY,EAAMZ,GAAKmC,EAAOnC,GAAKoC,EAAOpC,GAGhC,OAAOY,EAmBF,SAAS0B,EAAoB1B,GAClC,OAAGA,aAAiBO,WACXP,EACmB,iBAAZ,GACP,IAAI2B,aAAcC,OAAO5B,GAG3B,IAAIO,WAAWP,GAyBjB,SAAS6B,KAAiBC,GAC/B,MAAMxO,EAASwO,EAAKC,OAAO,CAACC,EAAKC,IAAMD,GAAQC,EAAkBC,YAAeD,EAAiB3O,QAAS,GAEpG6O,EAAM,IAAI5B,WAAWjN,GAE3B,IAAI8O,EAAa,EAMjB,OALAN,EAAKvT,QAAQ8T,IACXF,EAAI1U,IAAI4U,aAAaC,YAAc,IAAI/B,WAAW8B,GAAKA,EAAGD,GAC1DA,GAAeC,EAAkBH,YAAeG,EAAiB/O,SAG5D6O,EAGF,SAASI,EAAgBC,GAC9B,MAAMC,EAAI,IAAIlC,WAAWiC,EAAMN,YAC/B,IAAI,IAAI9C,EAAI,EAAG9L,EAAwB,EAAfkP,EAAMlP,OAAY8L,EAAI9L,IAAU8L,EACtDqD,EAAErD,GAAOoD,EAAMpD,IAAM,KAAQ,GAAMA,EAAI,EAAK,EAAM,IAGpD,OAAOqD,EAGF,SAASC,EAAcF,GAC5B,MAAMxC,EAAQ0B,EAAoBc,GAE5BG,EAAkB,GACxB,IAAI,IAAIvD,EAAI,EAAGkB,EAAMN,EAAM1M,OAAQ8L,EAAIkB,IAAOlB,EAC5CuD,EAAMvD,IAAM,IAAMY,EAAMZ,IAAO,GAAMA,EAAI,EAAK,EAGhD,OAAO,IAAIwD,YAAYD,GAhLzB,mT,gCCAe,SAASE,EAAc7S,EAAmB8S,GACvD,MAAMC,EAAQ,IAAIC,MAAMF,EAAM,CAACG,SAAS,EAAMC,YAAY,IAC1DlT,EAAKyL,cAAcsH,GAFrB,mC,gCCAA,oCAuEA,MAAMI,EAAgB,IA5DtB,oBACU,KAAAC,SAGH,GACG,KAAAC,IAAM,IAAQzJ,KAAK,MACnB,KAAA0J,WAAY,EAEZ,GAAGC,EAAuCtT,GAChD,IAAI8H,EAAUuG,KAAK8E,SAASG,GAU5B,OATIxL,IACFuG,KAAKkF,gBACLzL,EAAUuG,KAAK8E,SAASG,GAAQ,oBAGlB9K,IAAbxI,GACD8H,EAAQlK,KAAK,IAAMoC,KAGd8H,EAGF,QAAQ9H,GACb,OAAOqO,KAAKmF,GAAG,OAAQxT,GAGlB,OAAOA,GACZ,OAAOqO,KAAKmF,GAAG,QAASxT,GAQnB,cAAcwN,EAAsBxN,GACzC,MAAM8H,EAAU,YAAQ0F,GAAWa,KAAK7M,SAAWxD,QAAQiC,UAM3D,YAJgBuI,IAAbxI,GACD8H,EAAQlK,KAAK,IAAMoC,KAGd8H,EAGD,gBACFuG,KAAKgF,YACPhF,KAAKgF,WAAY,EAEjBhF,KAAK+E,IAAI,KACP/E,KAAK8E,SAASM,MAAQpF,KAAK8E,SAASM,KAAKxT,UACzCoO,KAAK8E,SAASO,OAASrF,KAAK8E,SAASO,MAAMzT,UAE3CoO,KAAKgF,WAAY,EACjBhF,KAAK8E,SAAW,QAOxB,MAAmB,IAAeD,cAAgBA,GACnC,O,gCCzEf,4BAwDA,MAAMS,EAAoB,IAvCnB,MAYL,cAQEtF,KAAKrF,iBAAmB,EAMxB,IAAevK,IAAI,sBAAsBb,KAAMgW,IAC1CA,IACDvF,KAAKrF,iBAAmB4K,KAK5B,IAAWC,gBAAgB,wBAA0BC,IACnDzF,KAAKrF,iBAAmB8K,EAAKC,YAMnC,MAAmB,IAAeJ,kBAAoBA,GACvC,O,gCC1Df,6CAQe,SAASK,EAAoB1U,GAC1C,OAAO,oBAAoBA,aAAa2U,YAAc3U,EAAE8D,QAAQ,GAAGvC,QAAU","file":"18.33a13d3129fb705afcd7.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport loadFonts from \"../helpers/dom/loadFonts\";\nimport { Config, LangPackDifference, LangPackString } from \"../layer\";\nimport I18n, { LangPackKey } from \"../lib/langPack\";\nimport apiManager from \"../lib/mtproto/mtprotoworker\";\nimport rootScope from \"../lib/rootScope\";\nimport Button from \"./button\";\nimport { putPreloader } from \"./misc\";\n\nlet set = false;\n\nfunction getLang(): Promise<[Config.config, LangPackString[], LangPackDifference.langPackDifference]> {\n if(cachedPromise) return cachedPromise;\n return cachedPromise = apiManager.getConfig().then(config => {\n if(config.suggested_lang_code !== I18n.lastRequestedLangCode) {\n //I18n.loadLangPack(config.suggested_lang_code);\n\n return Promise.all([\n config,\n I18n.getStrings(config.suggested_lang_code, ['Login.ContinueOnLanguage']),\n I18n.getCacheLangPack()\n ]);\n } else {\n return [] as any;\n }\n });\n}\n\nlet cachedPromise: ReturnType;\n\nexport default function getLanguageChangeButton(appendTo: HTMLElement) {\n if(set) return;\n getLang().then(([config, strings]) => {\n if(!config) {\n return;\n }\n\n const backup: LangPackString[] = [];\n strings.forEach(string => {\n const backupString = I18n.strings.get(string.key as LangPackKey);\n if(!backupString) {\n return;\n }\n \n backup.push(backupString);\n I18n.strings.set(string.key as LangPackKey, string);\n });\n\n const btnChangeLanguage = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.ContinueOnLanguage'});\n btnChangeLanguage.lastElementChild.classList.remove('i18n'); // prevent changing language\n loadFonts().then(() => {\n window.requestAnimationFrame(() => {\n appendTo.append(btnChangeLanguage);\n });\n });\n\n rootScope.addEventListener('language_change', () => {\n btnChangeLanguage.remove();\n }, {once: true});\n\n backup.forEach(string => {\n I18n.strings.set(string.key as LangPackKey, string);\n });\n \n attachClickEvent(btnChangeLanguage, (e) => {\n cancelEvent(e);\n\n set = true;\n\n btnChangeLanguage.disabled = true;\n putPreloader(btnChangeLanguage);\n\n I18n.getLangPack(config.suggested_lang_code);\n });\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DcId } from '../types';\r\nimport type { ApiError } from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport Page from './page';\r\nimport serverTimeManager from '../lib/mtproto/serverTimeManager';\r\nimport { AuthAuthorization, AuthLoginToken } from '../layer';\r\nimport { bytesCmp, bytesToBase64 } from '../helpers/bytes';\r\nimport App from '../config/app';\r\nimport Button from '../components/button';\r\nimport { _i18n, i18n, LangPackKey } from '../lib/langPack';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport rootScope from '../lib/rootScope';\r\nimport { putPreloader } from '../components/misc';\r\nimport getLanguageChangeButton from '../components/languageChangeButton';\r\nimport { pause } from '../helpers/schedulers/pause';\r\nimport fixBase64String from '../helpers/fixBase64String';\r\n\r\nconst FETCH_INTERVAL = 3;\r\n\r\nlet onFirstMount = async() => {\r\n const pageElement = page.pageEl;\r\n const imageDiv = pageElement.querySelector('.auth-image') as HTMLDivElement;\r\n\r\n let preloader = putPreloader(imageDiv, true);\r\n\r\n const inputWrapper = document.createElement('div');\r\n inputWrapper.classList.add('input-wrapper');\r\n\r\n const btnBack = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Login.QR.Cancel'});\r\n inputWrapper.append(btnBack);\r\n\r\n getLanguageChangeButton(inputWrapper);\r\n\r\n const container = imageDiv.parentElement;\r\n\r\n const h4 = document.createElement('h4');\r\n _i18n(h4, 'Login.QR.Title');\r\n\r\n const helpList = document.createElement('ol');\r\n helpList.classList.add('qr-description');\r\n (['Login.QR.Help1', 'Login.QR.Help2', 'Login.QR.Help3'] as LangPackKey[]).forEach((key) => {\r\n const li = document.createElement('li');\r\n li.append(i18n(key));\r\n helpList.append(li);\r\n });\r\n\r\n container.append(h4, helpList, inputWrapper);\r\n\r\n btnBack.addEventListener('click', () => {\r\n import('./pageSignIn').then(m => m.default.mount());\r\n stop = true;\r\n });\r\n \r\n const results = await Promise.all([\r\n import('qr-code-styling' as any)\r\n ]);\r\n const QRCodeStyling = results[0].default;\r\n\r\n let stop = false;\r\n rootScope.addEventListener('user_auth', () => {\r\n stop = true;\r\n cachedPromise = null;\r\n }, {once: true});\r\n \r\n let options: {dcId?: DcId, ignoreErrors: true} = {ignoreErrors: true};\r\n let prevToken: Uint8Array | number[];\r\n\r\n const iterate = async(isLoop: boolean) => {\r\n try {\r\n let loginToken = await apiManager.invokeApi('auth.exportLoginToken', {\r\n api_id: App.id,\r\n api_hash: App.hash,\r\n except_ids: []\r\n }, {ignoreErrors: true});\r\n \r\n if(loginToken._ === 'auth.loginTokenMigrateTo') {\r\n if(!options.dcId) {\r\n options.dcId = loginToken.dc_id as DcId;\r\n apiManager.setBaseDcId(loginToken.dc_id);\r\n //continue;\r\n }\r\n \r\n loginToken = await apiManager.invokeApi('auth.importLoginToken', {\r\n token: loginToken.token\r\n }, options) as AuthLoginToken.authLoginToken;\r\n }\r\n\r\n if(loginToken._ === 'auth.loginTokenSuccess') {\r\n const authorization = loginToken.authorization as any as AuthAuthorization.authAuthorization;\r\n apiManager.setUser(authorization.user);\r\n import('./pageIm').then(m => m.default.mount());\r\n return true;\r\n }\r\n\r\n /* // to base64\r\n var decoder = new TextDecoder('utf8');\r\n var b64encoded = btoa(String.fromCharCode.apply(null, [...loginToken.token])); */\r\n\r\n if(!prevToken || !bytesCmp(prevToken, loginToken.token)) {\r\n prevToken = loginToken.token;\r\n\r\n let encoded = bytesToBase64(loginToken.token);\r\n let url = \"tg://login?token=\" + fixBase64String(encoded, true);\r\n\r\n const style = window.getComputedStyle(document.documentElement);\r\n const surfaceColor = style.getPropertyValue('--surface-color').trim();\r\n const textColor = style.getPropertyValue('--primary-text-color').trim();\r\n const primaryColor = style.getPropertyValue('--primary-color').trim();\r\n\r\n const logoUrl = await fetch('assets/img/logo_padded.svg')\r\n .then(res => res.text())\r\n .then(text => {\r\n text = text.replace(/(fill:).+?(;)/, `$1${primaryColor}$2`);\r\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\r\n\r\n // * because iOS Safari doesn't want to eat objectURL\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n resolve(e.target.result as string);\r\n };\r\n reader.readAsDataURL(blob);\r\n });\r\n //return URL.createObjectURL(blob);\r\n });\r\n\r\n const qrCode = new QRCodeStyling({\r\n width: 240 * window.devicePixelRatio,\r\n height: 240 * window.devicePixelRatio,\r\n data: url,\r\n image: logoUrl,\r\n dotsOptions: {\r\n color: textColor,\r\n type: 'rounded'\r\n },\r\n cornersSquareOptions: {\r\n type: 'extra-rounded'\r\n },\r\n imageOptions: {\r\n imageSize: 1,\r\n margin: 0\r\n },\r\n backgroundOptions: {\r\n color: surfaceColor\r\n },\r\n qrOptions: {\r\n errorCorrectionLevel: \"L\"\r\n }\r\n });\r\n\r\n qrCode.append(imageDiv);\r\n (imageDiv.lastChild as HTMLCanvasElement).classList.add('qr-canvas');\r\n\r\n let promise: Promise;\r\n if(qrCode._drawingPromise) {\r\n promise = qrCode._drawingPromise;\r\n } else {\r\n promise = Promise.race([\r\n pause(1000),\r\n new Promise((resolve) => {\r\n qrCode._canvas._image.addEventListener('load', () => {\r\n window.requestAnimationFrame(() => resolve());\r\n }, {once: true});\r\n })\r\n ]);\r\n }\r\n\r\n // * это костыль, но библиотека не предоставляет никаких событий\r\n await promise.then(() => {\r\n if(preloader) {\r\n preloader.style.animation = 'hide-icon .4s forwards';\r\n\r\n const c = imageDiv.children[1] as HTMLElement;\r\n c.style.display = 'none';\r\n c.style.animation = 'grow-icon .4s forwards';\r\n setTimeout(() => {\r\n c.style.display = '';\r\n }, 150);\r\n\r\n setTimeout(() => {\r\n c.style.animation = '';\r\n }, 500);\r\n preloader = undefined;\r\n } else {\r\n Array.from(imageDiv.children).slice(0, -1).forEach(el => {\r\n el.remove();\r\n });\r\n }\r\n });\r\n }\r\n\r\n if(isLoop) {\r\n let timestamp = Date.now() / 1000;\r\n let diff = loginToken.expires - timestamp - serverTimeManager.serverTimeOffset;\r\n \r\n await pause(diff > FETCH_INTERVAL ? 1e3 * FETCH_INTERVAL : 1e3 * diff | 0);\r\n }\r\n } catch(err) {\r\n switch((err as ApiError).type) {\r\n case 'SESSION_PASSWORD_NEEDED':\r\n console.warn('pageSignQR: SESSION_PASSWORD_NEEDED');\r\n (err as ApiError).handled = true;\r\n import('./pagePassword').then(m => m.default.mount());\r\n stop = true;\r\n cachedPromise = null;\r\n break;\r\n default:\r\n console.error('pageSignQR: default error:', err);\r\n stop = true;\r\n break;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n //await iterate(false);\r\n\r\n return async() => {\r\n stop = false;\r\n\r\n do {\r\n if(stop) {\r\n break;\r\n }\r\n \r\n const needBreak = await iterate(true);\r\n if(needBreak) {\r\n break;\r\n }\r\n } while(true);\r\n };\r\n};\r\n\r\nlet cachedPromise: Promise<() => Promise>;\r\nconst page = new Page('page-signQR', true, () => {\r\n return cachedPromise;\r\n}, () => {\r\n //console.log('onMount');\r\n if(!cachedPromise) cachedPromise = onFirstMount();\r\n cachedPromise.then(func => {\r\n func();\r\n });\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignQr'});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type ListenerSetter from \"../listenerSetter\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\r\nimport simulateEvent from \"./dispatchEvent\";\r\n\r\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\r\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\r\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\r\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\r\n // const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\r\n\r\n options.touchMouseDown = true;\r\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\r\n add('mousedown', callback, options);\r\n } else if(CLICK_EVENT_NAME === 'touchend') {\r\n const o = {...options, once: true};\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n const onTouchMove = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n remove('touchend', onTouchEnd, o);\r\n };\r\n \r\n const onTouchEnd = (e: TouchEvent) => {\r\n remove('touchmove', onTouchMove, o);\r\n callback(e);\r\n if(options.once) {\r\n remove('touchstart', onTouchStart);\r\n }\r\n };\r\n \r\n add('touchend', onTouchEnd, o);\r\n add('touchmove', onTouchMove, o);\r\n };\r\n\r\n add('touchstart', onTouchStart);\r\n } else {\r\n add(CLICK_EVENT_NAME, callback, options);\r\n } */\r\n add(CLICK_EVENT_NAME, callback, options);\r\n}\r\n\r\nexport function detachClickEvent(elem: HTMLElement, callback: (e: TouchEvent | MouseEvent) => void, options?: AddEventListenerOptions) {\r\n // if(CLICK_EVENT_NAME === 'touchend') {\r\n // elem.removeEventListener('touchstart', callback, options);\r\n // } else {\r\n elem.removeEventListener(CLICK_EVENT_NAME, callback, options);\r\n // }\r\n}\r\n\r\nexport function simulateClickEvent(elem: HTMLElement) {\r\n simulateEvent(elem, CLICK_EVENT_NAME);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { i18n, LangPackKey } from \"../lib/langPack\";\r\nimport { ripple } from \"./ripple\";\r\n\r\nexport type ButtonOptions = Partial<{\r\n noRipple: true, \r\n onlyMobile: true, \r\n icon: string, \r\n rippleSquare: true, \r\n text: LangPackKey, \r\n disabled: boolean,\r\n asDiv: boolean\r\n}>;\r\n\r\nconst Button = (className: string, options: ButtonOptions = {}) => {\r\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\r\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\r\n\r\n if(!options.noRipple) {\r\n if(options.rippleSquare) {\r\n button.classList.add('rp-square');\r\n }\r\n\r\n ripple(button);\r\n }\r\n\r\n if(options.onlyMobile) {\r\n button.classList.add('only-handhelds');\r\n }\r\n\r\n if(options.disabled) {\r\n button.setAttribute('disabled', 'true');\r\n }\r\n\r\n if(options.text) {\r\n button.append(i18n(options.text));\r\n }\r\n\r\n return button;\r\n};\r\n\r\nexport default Button;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\r\nimport ListenerSetter from \"../helpers/listenerSetter\";\r\nimport mediaSizes from \"../helpers/mediaSizes\";\r\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\r\nimport { IS_APPLE, IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport appNavigationController from \"./appNavigationController\";\r\n\r\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\r\n const html = `\r\n \r\n \r\n `;\r\n\r\n if(returnDiv) {\r\n const div = document.createElement('div');\r\n div.classList.add('preloader');\r\n div.innerHTML = html;\r\n\r\n if(elem) {\r\n elem.appendChild(div);\r\n }\r\n\r\n return div;\r\n }\r\n \r\n elem.insertAdjacentHTML('beforeend', html);\r\n return elem.lastElementChild as HTMLElement;\r\n}\r\n\r\nMOUNT_CLASS_TO.putPreloader = putPreloader;\r\n\r\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\r\n elem.classList.remove('tgico-' + icon);\r\n elem.disabled = true;\r\n putPreloader(elem);\r\n\r\n return () => {\r\n elem.innerHTML = '';\r\n elem.classList.add('tgico-' + icon);\r\n elem.removeAttribute('disabled');\r\n };\r\n}\r\n\r\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\r\n Array.from(elements).forEach(el => {\r\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\r\n if(!match) return;\r\n to[match[1]] = el as HTMLElement;\r\n });\r\n} */\r\n\r\nlet onMouseMove = (e: MouseEvent) => {\r\n let rect = openedMenu.getBoundingClientRect();\r\n let {clientX, clientY} = e;\r\n \r\n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\r\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\r\n \r\n if(diffX >= 100 || diffY >= 100) {\r\n closeBtnMenu();\r\n //openedMenu.parentElement.click();\r\n }\r\n //console.log('mousemove', diffX, diffY);\r\n};\r\n\r\nconst onClick = (e: MouseEvent | TouchEvent) => {\r\n //cancelEvent(e);\r\n closeBtnMenu();\r\n};\r\n\r\n// ! no need in this due to the same handler in appNavigationController\r\n/* const onKeyDown = (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') {\r\n closeBtnMenu();\r\n cancelEvent(e);\r\n }\r\n}; */\r\n\r\nexport const closeBtnMenu = () => {\r\n if(openedMenu) {\r\n openedMenu.classList.remove('active');\r\n openedMenu.parentElement.classList.remove('menu-open');\r\n //openedMenu.previousElementSibling.remove(); // remove overlay\r\n if(menuOverlay) menuOverlay.remove();\r\n openedMenu = null;\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', false);\r\n }\r\n \r\n if(openedMenuOnClose) {\r\n openedMenuOnClose();\r\n openedMenuOnClose = null;\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('mousemove', onMouseMove);\r\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\r\n window.removeEventListener('contextmenu', onClick);\r\n }\r\n\r\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.removeByType('menu');\r\n }\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n if(openedMenu) {\r\n closeBtnMenu();\r\n }\r\n \r\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\r\n const rect = openedMenu.getBoundingClientRect();\r\n const {innerWidth, innerHeight} = window;\r\n\r\n console.log(innerWidth, innerHeight, rect);\r\n } */\r\n});\r\n\r\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\r\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\r\n closeBtnMenu();\r\n\r\n if(!IS_MOBILE_SAFARI) {\r\n appNavigationController.pushItem({\r\n type: 'menu',\r\n onPop: (canAnimate) => {\r\n closeBtnMenu();\r\n }\r\n });\r\n }\r\n \r\n openedMenu = menuElement;\r\n openedMenu.classList.add('active');\r\n openedMenu.parentElement.classList.add('menu-open');\r\n\r\n if(!menuOverlay) {\r\n menuOverlay = document.createElement('div');\r\n menuOverlay.classList.add('btn-menu-overlay');\r\n\r\n // ! because this event must be canceled, and can't cancel on menu click (below)\r\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n });\r\n }\r\n\r\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\r\n\r\n //document.body.classList.add('disable-hover');\r\n \r\n openedMenuOnClose = onClose;\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.addEventListener('mousemove', onMouseMove);\r\n //window.addEventListener('keydown', onKeyDown, {capture: true});\r\n window.addEventListener('contextmenu', onClick, {once: true});\r\n }\r\n\r\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\r\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\r\n cancelEvent(e);\r\n onClick(e);\r\n }); */\r\n \r\n // ! safari iOS doesn't handle window click event on overlay, idk why\r\n document.addEventListener(CLICK_EVENT_NAME, onClick);\r\n\r\n rootScope.dispatchEvent('context_menu_toggle', true);\r\n}\r\n\r\nconst PADDING_TOP = 8;\r\nconst PADDING_LEFT = 8;\r\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\r\n //let {clientX, clientY} = e;\r\n\r\n // * side mean the OPEN side\r\n\r\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\r\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\r\n const rect = document.body.getBoundingClientRect();\r\n const windowWidth = rect.width;\r\n const windowHeight = rect.height;\r\n\r\n side = mediaSizes.isMobile ? 'right' : 'left';\r\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\r\n\r\n const getSides = () => {\r\n return {\r\n x: {\r\n left: pageX,\r\n right: pageX - menuWidth\r\n },\r\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\r\n y: {\r\n top: pageY,\r\n bottom: pageY - menuHeight\r\n },\r\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\r\n };\r\n };\r\n\r\n const sides = getSides();\r\n\r\n const possibleSides = {\r\n x: {\r\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\r\n right: sides.x.right >= PADDING_LEFT\r\n },\r\n y: {\r\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\r\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\r\n }\r\n };\r\n\r\n /* if(side === undefined) {\r\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\r\n side = 'right';\r\n }\r\n } */\r\n\r\n {\r\n /* const x = sides.x;\r\n\r\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\r\n if(side) {\r\n s.findAndSplice(s => s === side);\r\n s.unshift(side);\r\n }\r\n\r\n const possibleSide = s.find(s => possibleSides.x[s]); */\r\n let left: number;\r\n /* if(possibleSide) {\r\n left = x[possibleSide];\r\n side = possibleSide;\r\n } else {\r\n left = sides.intermediateX;\r\n side = undefined;\r\n } */\r\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\r\n \r\n elem.style.left = left + 'px';\r\n }\r\n\r\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\r\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\r\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\r\n verticalSide = 'bottom';\r\n } else {\r\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\r\n verticalSide = 'top';\r\n } */\r\n\r\n {\r\n let top: number;\r\n\r\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\r\n \r\n elem.style.top = top + 'px';\r\n }\r\n \r\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\r\n elem.classList.add(\r\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\r\n (verticalSide === 'center' ? verticalSide : 'bottom') +\r\n '-' +\r\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\r\n}\r\n\r\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\r\nexport function cancelContextMenuOpening() {\r\n if(_cancelContextMenuOpeningTimeout) {\r\n clearTimeout(_cancelContextMenuOpeningTimeout);\r\n }\r\n \r\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\r\n _cancelContextMenuOpeningTimeout = 0;\r\n _cancelContextMenuOpening = false;\r\n }, .4e3);\r\n\r\n _cancelContextMenuOpening = true;\r\n}\r\n\r\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\r\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\r\n\r\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\r\n let timeout: number;\r\n\r\n const options: EventListenerOptions = {capture: true};\r\n\r\n const onCancel = () => {\r\n clearTimeout(timeout);\r\n // @ts-ignore\r\n remove('touchmove', onCancel, options);\r\n // @ts-ignore\r\n remove('touchend', onCancel, options);\r\n // @ts-ignore\r\n remove('touchcancel', onCancel, options);\r\n };\r\n\r\n add('touchstart', (e: TouchEvent) => {\r\n if(e.touches.length > 1) {\r\n onCancel();\r\n return;\r\n }\r\n \r\n add('touchmove', onCancel, options);\r\n add('touchend', onCancel, options);\r\n add('touchcancel', onCancel, options);\r\n\r\n timeout = window.setTimeout(() => {\r\n if(_cancelContextMenuOpening) {\r\n onCancel();\r\n return;\r\n }\r\n\r\n callback(e.touches[0]);\r\n onCancel();\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n }, .4e3);\r\n });\r\n\r\n /* if(!isSafari) {\r\n add('contextmenu', (e: any) => {\r\n cancelEvent(e);\r\n }, {passive: false, capture: true});\r\n } */\r\n } else {\r\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\r\n callback(e);\r\n\r\n if(openedMenu) {\r\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\r\n }\r\n } : callback);\r\n }\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_MOBILE_SAFARI } from \"../environment/userAgent\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { doubleRaf } from \"../helpers/schedulers\";\r\nimport blurActiveElement from \"../helpers/dom/blurActiveElement\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport isSwipingBackSafari from \"../helpers/dom/isSwipingBackSafari\";\r\n\r\nexport type NavigationItem = {\r\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | \r\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' | \r\n 'global-search' | 'voice' | 'mobile-search',\r\n onPop: (canAnimate: boolean) => boolean | void,\r\n onEscape?: () => boolean,\r\n noHistory?: boolean,\r\n noBlurOnPop?: boolean,\r\n};\r\n\r\nexport class AppNavigationController {\r\n private navigations: Array = [];\r\n private id = Date.now();\r\n private manual = false;\r\n private log = logger('NC');\r\n private debug = true;\r\n private currentHash = window.location.hash;\r\n public onHashChange: () => void;\r\n\r\n constructor() {\r\n let isPossibleSwipe = false;\r\n window.addEventListener('popstate', (e) => {\r\n this.debug && this.log('popstate', e, isPossibleSwipe);\r\n\r\n if(window.location.hash !== this.currentHash) {\r\n this.onHashChange && this.onHashChange();\r\n this.replaceState();\r\n return;\r\n }\r\n this.currentHash = window.location.hash;\r\n\r\n const id: number = e.state;\r\n if(id !== this.id/* && !this.navigations.length */) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n const item = this.navigations.pop();\r\n if(!item) {\r\n this.pushState();\r\n return;\r\n }\r\n\r\n this.manual = !isPossibleSwipe;\r\n this.handleItem(item);\r\n //this.pushState(); // * prevent adding forward arrow\r\n });\r\n\r\n window.addEventListener('keydown', (e) => {\r\n const item = this.navigations[this.navigations.length - 1];\r\n if(!item) return;\r\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\r\n cancelEvent(e);\r\n this.back(item.type);\r\n }\r\n }, {capture: true, passive: false});\r\n\r\n if(IS_MOBILE_SAFARI) {\r\n const options = {passive: true};\r\n window.addEventListener('touchstart', (e) => {\r\n if(e.touches.length > 1) return;\r\n this.debug && this.log('touchstart');\r\n\r\n if(isSwipingBackSafari(e)) {\r\n isPossibleSwipe = true;\r\n\r\n window.addEventListener('touchend', () => {\r\n setTimeout(() => {\r\n isPossibleSwipe = false;\r\n }, 100);\r\n }, {passive: true, once: true});\r\n }\r\n\r\n /* const detach = () => {\r\n window.removeEventListener('touchend', onTouchEnd);\r\n window.removeEventListener('touchmove', onTouchMove);\r\n };\r\n\r\n let moved = false;\r\n const onTouchMove = (e: TouchEvent) => {\r\n this.debug && this.log('touchmove');\r\n if(e.touches.length > 1) {\r\n detach();\r\n return;\r\n }\r\n\r\n moved = true;\r\n };\r\n\r\n const onTouchEnd = (e: TouchEvent) => {\r\n this.debug && this.log('touchend');\r\n if(e.touches.length > 1 || !moved) {\r\n detach();\r\n return;\r\n }\r\n\r\n isPossibleSwipe = true;\r\n doubleRaf().then(() => {\r\n isPossibleSwipe = false;\r\n });\r\n\r\n detach();\r\n };\r\n\r\n window.addEventListener('touchend', onTouchEnd, options);\r\n window.addEventListener('touchmove', onTouchMove, options); */\r\n }, options);\r\n }\r\n\r\n history.scrollRestoration = 'manual';\r\n\r\n this.pushState(); // * push init state\r\n }\r\n\r\n private handleItem(item: NavigationItem) {\r\n const good = item.onPop(!this.manual ? false : undefined);\r\n this.debug && this.log('popstate, navigation:', item, this.navigations);\r\n if(good === false) {\r\n this.pushItem(item);\r\n } else if(!item.noBlurOnPop) {\r\n blurActiveElement(); // no better place for it\r\n }\r\n\r\n this.manual = false;\r\n }\r\n\r\n public findItemByType(type: NavigationItem['type']) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n return {item, index: i};\r\n }\r\n }\r\n }\r\n\r\n public back(type?: NavigationItem['type']) {\r\n if(type) {\r\n const ret = this.findItemByType(type);\r\n if(ret) {\r\n this.backByItem(ret.item, ret.index);\r\n return;\r\n }\r\n }\r\n\r\n history.back();\r\n }\r\n\r\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\r\n this.manual = true;\r\n // ! commented because 'popstate' event will be fired with delay\r\n //if(index !== (this.navigations.length - 1)) {\r\n this.navigations.splice(index, 1);\r\n this.handleItem(item);\r\n //}\r\n }\r\n\r\n public pushItem(item: NavigationItem) {\r\n this.navigations.push(item);\r\n this.debug && this.log('pushstate', item, this.navigations);\r\n\r\n if(!item.noHistory) {\r\n this.pushState();\r\n }\r\n }\r\n\r\n private pushState() {\r\n this.manual = false;\r\n history.pushState(this.id, '');\r\n }\r\n\r\n public replaceState() {\r\n history.replaceState(this.id, '', location.origin + location.pathname);\r\n }\r\n\r\n public removeItem(item: NavigationItem) {\r\n if(!item) {\r\n return;\r\n }\r\n \r\n indexOfAndSplice(this.navigations, item);\r\n }\r\n\r\n public removeByType(type: NavigationItem['type'], single = false) {\r\n for(let i = this.navigations.length - 1; i >= 0; --i) {\r\n const item = this.navigations[i];\r\n if(item.type === type) {\r\n this.navigations.splice(i, 1);\r\n\r\n if(single) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst appNavigationController = new AppNavigationController();\r\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\r\nexport default appNavigationController;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_MOBILE_SAFARI } from \"../../environment/userAgent\";\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/19.5ca6388c23a93b466714.chunk.js b/public/19.577567d0b0e7b3f9570b.chunk.js similarity index 94% rename from public/19.5ca6388c23a93b466714.chunk.js rename to public/19.577567d0b0e7b3f9570b.chunk.js index 50f9203b6..0b9bff613 100644 --- a/public/19.5ca6388c23a93b466714.chunk.js +++ b/public/19.577567d0b0e7b3f9570b.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[19,22],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var n=s(47),i=s(48),r=s(29);class o extends i.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof n.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;r.a.rootScope=c,t.default=c},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return a}));var n=s(6),i=s(66),r=s(1),o=s(15),c=s(71);let l=0;function a(e,t=(()=>Promise.resolve()),s=null,a=!1,u=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[a?"prepend":"append"](d);const m=(e,n)=>{const o=Date.now(),c=document.createElement("div"),a=l++,u=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{i.a.mutate(()=>{c.remove()}),s&&s(a)};if(ec.classList.add("hiding"),Math.max(s-u/2,0)),setTimeout(t,s)}else c.classList.add("hiding"),setTimeout(t,u/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,p=!1},t&&t(a),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const s=e-t.left,i=n-t.top,r=Math.sqrt(Math.pow(Math.abs(i-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,l=i-r/2;c.style.width=c.style.height=r+"px",c.style.left=o+"px",c.style.top=l+"px",d.append(c)})},f=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(n.a)(t.target,"c-ripple")!==d)&&(u===e||!Object(c.a)(t.target,u));let p=!1;if(r.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};u.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||p||f(t))return;p=!0;let{clientX:s,clientY:n}=t.touches[0];m(s,n),u.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),u.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else u.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===u.dataset.ripple||f(e))return;if(p)return void(p=!1);let{clientX:t,clientY:s}=e;m(t,s),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const n=s(63).a.debug,i="undefined"!=typeof window?window:self;t.b=n},44:function(e,t,s){"use strict";let n;function i(e){n?n.push(e):(n=[e],requestAnimationFrame(()=>{const e=n;n=void 0,e.forEach(e=>e())}))}s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return l})),s.d(t,"d",(function(){return a})),s.d(t,"a",(function(){return u}));let r,o,c=!1;function l(e){r?c?e():r.push(e):(r=[e],requestAnimationFrame(()=>{c=!0;for(let e=0;e{o=void 0}),o)}function u(){return new Promise(e=>{i(()=>{i(e)})})}},45:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var n=s(76);function i(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(n.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},47:function(e,t,s){"use strict";s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return i})),s.d(t,"e",(function(){return r})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return c}));const n=0,i=1271266957,r=777e3,o=2147483647,c=""},48:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));class n{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var n,i;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(i=s)||void 0===i?void 0:i.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const n=t&&[],i=this.listeners[e];if(i){i.slice().forEach(t=>{var r;if(-1===i.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...s)}catch(e){console.error(e)}n&&n.push(o),(null===(r=t.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},63:function(e,t,s){"use strict";const n={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};n.http=location.search.indexOf("http=1")>0,n.http&&(n.transport="https"),t.a=n},66:function(e,t,s){"use strict";var n=s(44),i=s(45),r=s(29),o=s(68);const c=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(i.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};r.a&&(r.a.sequentialDom=c),t.a=c},68:function(e,t,s){"use strict";function n(e){return null==e?void 0:e.isConnected}s.d(t,"a",(function(){return n}))},71:function(e,t,s){"use strict";function n(e,t){if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}s.d(t,"a",(function(){return n}))},76:function(e,t,s){"use strict";function n(){}s.d(t,"a",(function(){return n}))}}]); -//# sourceMappingURL=19.5ca6388c23a93b466714.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[19,22],{15:function(e,t,s){"use strict";s.r(t),s.d(t,"RootScope",(function(){return o}));var n=s(47),i=s(48),r=s(29);class o extends i.a{constructor(){super(),this.overlaysActive=0,this.idle={isIDLE:!0,deactivated:!1,focusPromise:Promise.resolve(),focusResolve:()=>{}},this.connectionStatus={},this.filterId=0,this.config={forwarded_count_max:100,edit_time_limit:172800,pinned_dialogs_count_max:5,pinned_infolder_count_max:100,message_length_max:4096,caption_length_max:1024},this.addEventListener("peer_changed",e=>{this.peerId=e,document.body.classList.toggle("has-chat",!!e)}),this.addEventListener("user_auth",({id:e})=>{this.myId="number"==typeof n.c?+e:""+e}),this.addEventListener("connection_status_change",e=>{this.connectionStatus[e.name]=e}),this.addEventListener("idle",e=>{e?this.idle.focusPromise=new Promise(e=>{this.idle.focusResolve=e}):this.idle.focusResolve()})}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",this.myId?this.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor()}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("overlay_toggle",this.isOverlayActive)}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===this.settings.theme?this.systemTheme:this.settings.theme)){return this.settings.themes.find(t=>t.name===e)}}const c=new o;r.a.rootScope=c,t.default=c},18:function(e,t,s){"use strict";s.r(t),s.d(t,"ripple",(function(){return a}));var n=s(6),i=s(66),r=s(1),o=s(15),c=s(72);let l=0;function a(e,t=(()=>Promise.resolve()),s=null,a=!1,u=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");let d=document.createElement("div");d.classList.add("c-ripple");let h;e.classList.contains("rp-square")&&d.classList.add("is-square"),e[a?"prepend":"append"](d);const m=(e,n)=>{const o=Date.now(),c=document.createElement("div"),a=l++,u=1e3*+window.getComputedStyle(d).getPropertyValue("--ripple-duration").replace("s","");h=()=>{let e=Date.now()-o;const t=()=>{i.a.mutate(()=>{c.remove()}),s&&s(a)};if(ec.classList.add("hiding"),Math.max(s-u/2,0)),setTimeout(t,s)}else c.classList.add("hiding"),setTimeout(t,u/2);r.IS_TOUCH_SUPPORTED||window.removeEventListener("contextmenu",h),h=null,p=!1},t&&t(a),window.requestAnimationFrame(()=>{const t=d.getBoundingClientRect();c.classList.add("c-ripple__circle");const s=e-t.left,i=n-t.top,r=Math.sqrt(Math.pow(Math.abs(i-t.height/2)+t.height/2,2)+Math.pow(Math.abs(s-t.width/2)+t.width/2,2)),o=s-r/2,l=i-r/2;c.style.width=c.style.height=r+"px",c.style.left=o+"px",c.style.top=l+"px",d.append(c)})},f=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||Object(n.a)(t.target,"c-ripple")!==d)&&(u===e||!Object(c.a)(t.target,u));let p=!1;if(r.IS_TOUCH_SUPPORTED){let e=()=>{h&&h()};u.addEventListener("touchstart",t=>{if(!o.default.settings.animationsEnabled)return;if(t.touches.length>1||p||f(t))return;p=!0;let{clientX:s,clientY:n}=t.touches[0];m(s,n),u.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",t=>{t.cancelBubble=!0,t.stopPropagation(),e(),u.removeEventListener("touchend",e)},{once:!0})},{passive:!0})}else u.addEventListener("mousedown",e=>{if(![0,2].includes(e.button))return;if(!o.default.settings.animationsEnabled)return;if("0"===u.dataset.ripple||f(e))return;if(p)return void(p=!1);let{clientX:t,clientY:s}=e;m(t,s),window.addEventListener("mouseup",h,{once:!0,passive:!0}),window.addEventListener("contextmenu",h,{once:!0,passive:!0})},{passive:!0})}},29:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));const n=s(63).a.debug,i="undefined"!=typeof window?window:self;t.b=n},44:function(e,t,s){"use strict";let n;function i(e){n?n.push(e):(n=[e],requestAnimationFrame(()=>{const e=n;n=void 0,e.forEach(e=>e())}))}s.d(t,"b",(function(){return i})),s.d(t,"c",(function(){return l})),s.d(t,"d",(function(){return a})),s.d(t,"a",(function(){return u}));let r,o,c=!1;function l(e){r?c?e():r.push(e):(r=[e],requestAnimationFrame(()=>{c=!0;for(let e=0;e{o=void 0}),o)}function u(){return new Promise(e=>{i(()=>{i(e)})})}},45:function(e,t,s){"use strict";s.d(t,"a",(function(){return i}));var n=s(70);function i(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((s,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,s(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(n.a).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}},47:function(e,t,s){"use strict";s.d(t,"c",(function(){return n})),s.d(t,"d",(function(){return i})),s.d(t,"e",(function(){return r})),s.d(t,"b",(function(){return o})),s.d(t,"a",(function(){return c}));const n=0,i=1271266957,r=777e3,o=2147483647,c=""},48:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));class n{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,s){var n,i;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:s}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(i=s)||void 0===i?void 0:i.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,s){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...s){this.reuseResults&&(this.listenerResults[e]=s);const n=t&&[],i=this.listeners[e];if(i){i.slice().forEach(t=>{var r;if(-1===i.findIndex(e=>e.callback===t.callback))return;let o;try{o=t.callback(...s)}catch(e){console.error(e)}n&&n.push(o),(null===(r=t.options)||void 0===r?void 0:r.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}},63:function(e,t,s){"use strict";const n={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};n.http=location.search.indexOf("http=1")>0,n.http&&(n.transport="https"),t.a=n},66:function(e,t,s){"use strict";var n=s(44),i=s(45),r=s(29),o=s(68);const c=new class{constructor(){this.promises={},this.raf=n.b.bind(null),this.scheduled=!1}do(e,t){let s=this.promises[e];return s||(this.scheduleFlush(),s=this.promises[e]=Object(i.a)()),void 0!==t&&s.then(()=>t()),s}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const s=Object(o.a)(e)?this.mutate():Promise.resolve();return void 0!==t&&s.then(()=>t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf(()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}}))}};r.a&&(r.a.sequentialDom=c),t.a=c},68:function(e,t,s){"use strict";function n(e){return null==e?void 0:e.isConnected}s.d(t,"a",(function(){return n}))},70:function(e,t,s){"use strict";function n(){}s.d(t,"a",(function(){return n}))},72:function(e,t,s){"use strict";function n(e,t){if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}s.d(t,"a",(function(){return n}))}}]); +//# sourceMappingURL=19.577567d0b0e7b3f9570b.chunk.js.map \ No newline at end of file diff --git a/public/19.5ca6388c23a93b466714.chunk.js.map b/public/19.577567d0b0e7b3f9570b.chunk.js.map similarity index 97% rename from public/19.5ca6388c23a93b466714.chunk.js.map rename to public/19.577567d0b0e7b3f9570b.chunk.js.map index 4c8423506..cfc4ae462 100644 --- a/public/19.5ca6388c23a93b466714.chunk.js.map +++ b/public/19.577567d0b0e7b3f9570b.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/lib/rootScope.ts","webpack:///./src/components/ripple.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/helpers/noop.ts"],"names":["RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","rippleClickId","ripple","elem","callback","onEnd","prepend","attachListenerTo","add","r","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","debug","MOUNT_CLASS_TO","self","fastRafCallbacks","fastRaf","push","currentCallbacks","forEach","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","i","fastRafPromise","then","doubleRaf","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","addNotifyListener","deferred","reject","catch","finally","cancel","Object","assign","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listenerResults","options","hasOwnProperty","pop","obj","findAndSplice","l","collectResults","arr","slice","listener","findIndex","result","console","error","_dispatchEvent","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","sequentialDom","promises","raf","bind","scheduled","kind","promise","scheduleFlush","do","element","read","write","isInDOM","isConnected","findUpAsChild","el","parent","parentElement","noop"],"mappings":"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","file":"19.5ca6388c23a93b466714.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\n// import type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: any/* CallInstance */},\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","export default function noop() {}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/lib/rootScope.ts","webpack:///./src/components/ripple.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/lib/mtproto/mtproto_config.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/config/modes.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/dom/findUpAsChild.ts"],"names":["RootScope","super","overlaysActive","idle","isIDLE","deactivated","focusPromise","Promise","resolve","focusResolve","connectionStatus","filterId","config","forwarded_count_max","edit_time_limit","pinned_dialogs_count_max","pinned_infolder_count_max","message_length_max","caption_length_max","this","addEventListener","peerId","document","body","classList","toggle","id","myId","status","name","undefined","_themeColorElem","head","querySelector","color","themeColor","isNight","themeColorElem","setAttribute","darkModeMediaQuery","window","matchMedia","checkDarkMode","systemTheme","matches","dispatchEvent","setTheme","addListener","err","colorScheme","documentElement","setThemeColor","value","isOverlayActive","getTheme","settings","theme","themes","find","t","rootScope","rippleClickId","ripple","elem","callback","onEnd","prepend","attachListenerTo","add","r","createElement","handler","contains","drawRipple","clientX","clientY","startTime","Date","now","clickId","duration","getComputedStyle","getPropertyValue","replace","elapsedTime","cb","mutate","remove","delay","Math","max","setTimeout","removeEventListener","touchStartFired","requestAnimationFrame","rect","getBoundingClientRect","clickX","left","clickY","top","size","sqrt","abs","height","width","x","y","style","append","isRippleUnneeded","e","target","includes","tagName","touchEnd","animationsEnabled","touches","length","once","cancelBubble","stopPropagation","passive","button","dataset","DEBUG","debug","MOUNT_CLASS_TO","self","fastRafCallbacks","fastRaf","push","currentCallbacks","forEach","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","i","fastRafPromise","then","doubleRaf","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","args","lastNotify","listeners","addNotifyListener","deferred","reject","catch","finally","cancel","Object","assign","NULL_PEER_ID","REPLIES_PEER_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","EventListenerBase","reuseResults","_constructor","listenerResults","options","hasOwnProperty","pop","obj","findAndSplice","l","collectResults","arr","slice","listener","findIndex","result","console","error","_dispatchEvent","Modes","test","location","search","indexOf","http","ssl","multipleConnections","asServiceWorker","transport","sequentialDom","promises","raf","bind","scheduled","kind","promise","scheduleFlush","do","element","read","write","isInDOM","isConnected","noop","findUpAsChild","el","parent","parentElement"],"mappings":"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","file":"19.577567d0b0e7b3f9570b.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, ConstructorDeclMap, Config, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, PhoneCall, MethodDeclMap } from \"../layer\";\nimport type { MyDocument } from \"./appManagers/appDocsManager\";\nimport type { AppMessagesManager, Dialog, MessagesStorage, MyMessage } from \"./appManagers/appMessagesManager\";\nimport type { MyDialogFilter } from \"./storages/filters\";\nimport type { Folder } from \"./storages/dialogs\";\nimport type { UserTyping } from \"./appManagers/appProfileManager\";\nimport type { State, Theme } from \"./appManagers/appStateManager\";\nimport type { MyDraftMessage } from \"./appManagers/appDraftsManager\";\nimport type { PushSubscriptionNotify } from \"./mtproto/webPushApiManager\";\nimport type { PushNotificationObject } from \"./serviceWorker/push\";\nimport type { ConnectionStatusChange } from \"./mtproto/connectionStatus\";\nimport type { GroupCallId } from \"./appManagers/appGroupCallsManager\";\nimport type GroupCallInstance from \"./calls/groupCallInstance\";\n// import type CallInstance from \"./calls/callInstance\";\nimport type { StreamAmplitude } from \"./calls/streamManager\";\nimport type Chat from \"../components/chat/chat\";\nimport { NULL_PEER_ID, UserAuth } from \"./mtproto/mtproto_config\";\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport { MTAppConfig } from \"./mtproto/appConfig\";\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n \n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'chat_changing': {from: Chat, to: Chat},\n\n 'peer_changed': PeerId,\n 'peer_changing': Chat,\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': PeerId,\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Folder,\n \n 'dialog_draft': {peerId: PeerId, dialog: Dialog, drop: boolean, draft: MyDraftMessage | undefined, index: number},\n 'dialog_unread': {peerId: PeerId},\n 'dialog_flush': {peerId: PeerId},\n 'dialog_drop': {peerId: PeerId, dialog?: Dialog},\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n //'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': {[peerId: PeerId]: Dialog},\n \n 'history_append': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_update': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': AppMessagesManager['newMessagesToHandle'],\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n 'history_focus': {peerId: PeerId, threadId?: number, mid?: number, startParam?: string},\n //'history_request': void,\n \n 'message_edit': {storage: MessagesStorage, peerId: PeerId, mid: number},\n 'message_views': {peerId: PeerId, mid: number, views: number},\n 'message_sent': {storage: MessagesStorage, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': {peerId: PeerId, mid: number},\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n\n 'media_play': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number},\n 'media_stop': void,\n \n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n \n 'contacts_update': UserId,\n 'avatar_update': PeerId,\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n //'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n \n 'event-heavy-animation-start': void,\n 'event-heavy-animation-end': void,\n \n 'im_mount': void,\n 'im_tab_change': number,\n \n 'idle': boolean,\n \n 'overlay_toggle': boolean,\n \n 'background_change': void,\n \n 'privacy_update': Update.updatePrivacy,\n \n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n \n 'language_change': string,\n \n 'theme_change': void,\n \n 'instance_activated': void,\n 'instance_deactivated': void,\n \n 'push_notification_click': PushNotificationObject,\n 'push_init': PushSubscriptionNotify,\n 'push_subscribe': PushSubscriptionNotify,\n 'push_unsubscribe': PushSubscriptionNotify,\n \n 'emoji_recent': string,\n \n 'download_start': DocId,\n 'download_progress': any,\n 'document_downloaded': MyDocument,\n\n 'context_menu_toggle': boolean,\n 'choosing_sticker': boolean\n\n 'group_call_instance': GroupCallInstance,\n 'group_call_update': GroupCall,\n 'group_call_amplitude': {amplitudes: StreamAmplitude[], type: 'all' | 'input'},\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_instance': {hasCurrent: boolean, instance: any/* CallInstance */},\n};\n\nexport class RootScope extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n} & {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n}> {\n public overlaysActive = 0;\n public myId: PeerId;\n public idle = {\n isIDLE: true,\n deactivated: false,\n focusPromise: Promise.resolve(),\n focusResolve: () => {}\n };\n public connectionStatus: {[name: string]: ConnectionStatusChange} = {};\n public settings: State['settings'];\n public peerId: PeerId;\n public filterId = 0;\n public systemTheme: Theme['name'];\n public config: Partial = {\n forwarded_count_max: 100,\n edit_time_limit: 86400 * 2,\n pinned_dialogs_count_max: 5,\n pinned_infolder_count_max: 100,\n message_length_max: 4096,\n caption_length_max: 1024,\n };\n public appConfig: MTAppConfig;\n\n public themeColor: string;\n private _themeColorElem: Element;\n\n constructor() {\n super();\n\n this.addEventListener('peer_changed', (peerId) => {\n this.peerId = peerId;\n document.body.classList.toggle('has-chat', !!peerId);\n });\n\n this.addEventListener('user_auth', ({id}) => {\n // @ts-ignore\n this.myId = typeof(NULL_PEER_ID) === 'number' ? +id : '' + id;\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.addEventListener('idle', (isIDLE) => {\n if(isIDLE) {\n this.idle.focusPromise = new Promise((resolve) => {\n this.idle.focusResolve = resolve;\n });\n } else {\n this.idle.focusResolve();\n }\n });\n }\n\n get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n //const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n //const newTheme = this.getTheme();\n\n if(this.myId) {\n this.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n }\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('overlay_toggle', this.isOverlayActive);\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = this.settings.theme === 'system' ? this.systemTheme : this.settings.theme) {\n return this.settings.themes.find(t => t.name === name);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n\n/* rootScope.addEventListener('album_edit', (e) => {\n \n});\n\nrootScope.addEventListener<'album_edit'>('album_edit', (e) => {\n \n}); */\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\r\nimport sequentialDom from \"../helpers/sequentialDom\";\r\nimport {IS_TOUCH_SUPPORTED} from \"../environment/touchSupport\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\n\r\nlet rippleClickId = 0;\r\nexport function ripple(\r\n elem: HTMLElement, \r\n callback: (id: number) => Promise = () => Promise.resolve(), \r\n onEnd: (id: number) => void = null, \r\n prepend = false,\r\n attachListenerTo = elem\r\n) {\r\n //return;\r\n if(elem.querySelector('.c-ripple')) return;\r\n elem.classList.add('rp');\r\n \r\n let r = document.createElement('div');\r\n r.classList.add('c-ripple');\r\n\r\n const isSquare = elem.classList.contains('rp-square');\r\n if(isSquare) {\r\n r.classList.add('is-square');\r\n }\r\n\r\n elem[prepend ? 'prepend' : 'append'](r);\r\n\r\n let handler: () => void;\r\n //let animationEndPromise: Promise;\r\n const drawRipple = (clientX: number, clientY: number) => {\r\n const startTime = Date.now();\r\n const elem = document.createElement('div');\r\n\r\n const clickId = rippleClickId++;\r\n \r\n //console.log('ripple drawRipple');\r\n \r\n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\r\n //console.log('ripple duration', duration);\r\n\r\n handler = () => {\r\n //handler = () => animationEndPromise.then((duration) => {\r\n //console.log('ripple animation was:', duration);\r\n\r\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\r\n //return;\r\n let elapsedTime = Date.now() - startTime;\r\n const cb = () => {\r\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\r\n sequentialDom.mutate(() => {\r\n elem.remove();\r\n });\r\n \r\n if(onEnd) onEnd(clickId);\r\n };\r\n if(elapsedTime < duration) {\r\n let delay = Math.max(duration - elapsedTime, duration / 2);\r\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\r\n\r\n setTimeout(cb, delay);\r\n } else {\r\n elem.classList.add('hiding');\r\n setTimeout(cb, duration / 2);\r\n }\r\n\r\n if(!IS_TOUCH_SUPPORTED) {\r\n window.removeEventListener('contextmenu', handler);\r\n }\r\n\r\n handler = null;\r\n touchStartFired = false;\r\n };\r\n //});\r\n\r\n callback && callback(clickId);\r\n\r\n /* callback().then((bad) => {\r\n if(bad) {\r\n span.remove();\r\n return;\r\n } */\r\n \r\n //console.log('ripple after promise', Date.now() - startTime);\r\n //console.log('ripple tooSlow:', tooSlow);\r\n /* if(tooSlow) {\r\n span.remove();\r\n return;\r\n } */\r\n\r\n window.requestAnimationFrame(() => {\r\n const rect = r.getBoundingClientRect();\r\n elem.classList.add('c-ripple__circle');\r\n\r\n const clickX = clientX - rect.left;\r\n const clickY = clientY - rect.top;\r\n\r\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\r\n const size = radius;\r\n\r\n // center of circle\r\n const x = clickX - size / 2;\r\n const y = clickY - size / 2;\r\n\r\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\r\n\r\n elem.style.width = elem.style.height = size + 'px';\r\n elem.style.left = x + 'px';\r\n elem.style.top = y + 'px';\r\n\r\n // нижний код выполняется с задержкой\r\n /* animationEndPromise = new Promise((resolve) => {\r\n span.addEventListener('animationend', () => {\r\n // 713 -> 700\r\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\r\n }, {once: true});\r\n }); */\r\n \r\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\r\n /* span.style.display = 'none';\r\n r.append(span);\r\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\r\n span.style.display = ''; */\r\n\r\n r.append(elem);\r\n\r\n //r.classList.add('active');\r\n //handler();\r\n });\r\n //});\r\n };\r\n\r\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\r\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \r\n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\r\n ) && (\r\n attachListenerTo === elem \r\n || !findUpAsChild(e.target, attachListenerTo)\r\n );\r\n\r\n // TODO: rename this variable\r\n let touchStartFired = false;\r\n if(IS_TOUCH_SUPPORTED) {\r\n let touchEnd = () => {\r\n handler && handler();\r\n };\r\n \r\n attachListenerTo.addEventListener('touchstart', (e) => {\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n\r\n //console.log('ripple touchstart', e);\r\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\r\n return;\r\n }\r\n \r\n //console.log('touchstart', e);\r\n touchStartFired = true;\r\n \r\n let {clientX, clientY} = e.touches[0];\r\n drawRipple(clientX, clientY);\r\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\r\n \r\n window.addEventListener('touchmove', (e) => {\r\n e.cancelBubble = true;\r\n e.stopPropagation();\r\n touchEnd();\r\n attachListenerTo.removeEventListener('touchend', touchEnd);\r\n }, {once: true});\r\n }, {passive: true});\r\n } else {\r\n attachListenerTo.addEventListener('mousedown', (e) => {\r\n if(![0, 2].includes(e.button)) { // only left and right buttons\r\n return;\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n return;\r\n }\r\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\r\n\r\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\r\n return;\r\n } else if(touchStartFired) {\r\n touchStartFired = false;\r\n return;\r\n }\r\n \r\n let {clientX, clientY} = e;\r\n drawRipple(clientX, clientY);\r\n window.addEventListener('mouseup', handler, {once: true, passive: true});\r\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\r\n }, {passive: true});\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n\r\n/**\r\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\r\n */\r\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\r\n\r\nexport const NULL_PEER_ID: PeerId = 0;\r\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\r\nexport const SERVICE_PEER_ID: PeerId = 777000;\r\nexport const MUTE_UNTIL = 0x7FFFFFFF;\r\nexport const BOT_START_PARAM = '';\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { fastRaf } from \"./schedulers\";\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"./dom/isInDOM\";\r\n\r\nclass SequentialDom {\r\n private promises: Partial<{\r\n read: CancellablePromise,\r\n write: CancellablePromise\r\n }> = {};\r\n private raf = fastRaf.bind(null);\r\n private scheduled = false;\r\n\r\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\r\n let promise = this.promises[kind];\r\n if(!promise) {\r\n this.scheduleFlush();\r\n promise = this.promises[kind] = deferredPromise();\r\n }\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n \r\n return promise;\r\n }\r\n\r\n public measure(callback?: VoidFunction) {\r\n return this.do('read', callback);\r\n }\r\n\r\n public mutate(callback?: VoidFunction) {\r\n return this.do('write', callback);\r\n }\r\n\r\n /**\r\n * Will fire instantly if element is not connected\r\n * @param element \r\n * @param callback \r\n */\r\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\r\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\r\n\r\n if(callback !== undefined) {\r\n promise.then(() => callback());\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n private scheduleFlush() {\r\n if(!this.scheduled) {\r\n this.scheduled = true;\r\n\r\n this.raf(() => {\r\n this.promises.read && this.promises.read.resolve();\r\n this.promises.write && this.promises.write.resolve();\r\n\r\n this.scheduled = false;\r\n this.promises = {};\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst sequentialDom = new SequentialDom();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\r\nexport default sequentialDom;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","export default function noop() {}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/2.db718300c1179401e843.chunk.js b/public/2.53fa88cb7bccd9cf2f74.chunk.js similarity index 99% rename from public/2.db718300c1179401e843.chunk.js rename to public/2.53fa88cb7bccd9cf2f74.chunk.js index 9e452a2d7..6b53790a5 100644 --- a/public/2.db718300c1179401e843.chunk.js +++ b/public/2.53fa88cb7bccd9cf2f74.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[2,28],{120:function(t,e,s){"use strict";s.d(e,"c",(function(){return a})),s.d(e,"b",(function(){return o})),s.d(e,"a",(function(){return h}));var i=s(44),n=s(45);const r=new Map;function a(t){const e=function(t){return r.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,s){return s||(s=function(t){a(t);const e={isCancelled:!1,deferred:Object(n.a)()};return r.set(t,e),e.deferred.then(()=>{r.delete(t)}),e}(e)),Object(i.b)(()=>{s.isCancelled||(t()?o(t,e,s):s.deferred.resolve())}),s.deferred}function h(t){Object(i.b)(()=>{t()&&h(t)})}},131:function(t,e,s){"use strict";s.d(e,"a",(function(){return c}));var i=s(132),n=s(15),r=s(44),a=s(83),o=s(71),h=s(89);function c(t,e,s,c,l=250,d){const u=Object(i.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const i=new Proxy(u,{apply:(e,s,i)=>{const n=+i[0],r=void 0===i[1]||i[1],a=t.querySelector(`[data-tab="${n}"]`)||t.children[n];c(a,n,r)}}),c=(i,o,h=!0)=>{const c=e.children[o];if(s){const t=s(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew({element:i.parentElement.children[o],position:"center",forceDirection:h?void 0:a.a.Static,forceDuration:l,axis:"x"}),n.default.settings.animationsEnabled||(h=!1);const p=u.prevId();if(i.classList.contains("active")||o===p)return!1;const g=t.querySelector(m.toLowerCase()+".active");Object(r.b)(()=>{g&&g.classList.remove("active")}),f&&-1!==p&&h&&Object(r.b)(()=>{const t=i.querySelector("i"),e=i.parentElement.children[p].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const s=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,n=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${n}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(r.b)(()=>{i.classList.add("active")}),u(o,h)},f=!t.classList.contains("no-stripe"),m=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let s,i=e.target;if(i=Object(o.a)(i,t),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=Object(h.a)(i);c(i,s)})),i}return u}},132:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(15),n=s(45),r=s(77),a=s(89),o=s(5);function h(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.transform=`translate3d(${-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,s,i,n=!0)=>{let r=null;switch(e){case"tabs":r=c;break;case"navigation":r=h}return t.dataset.animation=e,d(t,r,s,i,n)},d=(t,e,s,h,c=!0,l=!1,d=!0)=>{const u=new Map;let f,m=null;if(d){const s=e?"transitionend":"animationend",i=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const n=u.get(e.target);n&&n(),e.target===m&&(!f&&c||(f&&(f.resolve(),f=void 0),h&&h(p.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(s,i),m=f=void 0,u.clear())))};t.addEventListener(s,i)}function p(o,l=!0,g){g&&(m=g),o instanceof HTMLElement&&(o=Object(a.a)(o));const v=p.prevId();if(o===v)return!1;const y=t.children[o];if(i.default.settings.animationsEnabled&&-1!==v||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(m)m.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),m=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),m&&m.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},s)),m&&(m.classList.remove("to"),m.classList.add("from")),t.classList.add("animating");const b=v{y.classList.remove("to"),u.delete(y)}),m){const t=m,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const i=window.setTimeout(e,s);u.set(t,()=>{clearTimeout(i),u.delete(t)})}c&&(f||(f=Object(n.a)()),Object(r.b)(f,2*s))}m=y}return p.prevId=()=>m?Object(a.a)(m):-1,p}},155:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(0),n=s(48),r=s(38),a=s(64),o=s(54),h=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const c=new class{constructor(){this.cache=new Map}getCache(t){let e=this.cache.get(t);return e||this.cache.set(t,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(t){const e=this.cache.get(t);e&&!--e.counter&&this.cache.delete(t)}getCacheCounter(t){const e=this.cache.get(t);return null==e?void 0:e.counter}generateName(t,e,s,i,n){return[t,e,s,i?"colored":"",n||""].filter(Boolean).join("-")}};class l extends n.a{constructor({el:t,worker:e,options:s}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++l.reqId,this.el=t,this.worker=e;for(let t in s)this.hasOwnProperty(t)&&(this[t]=s[t]);let n;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=s.initFrame,this.color=s.color,this.inverseColor=s.inverseColor,this.name=s.name,this.skipFirstFrameRendering=s.skipFirstFrameRendering,this.toneIndex=s.toneIndex,void 0!==s.skipRatio?n=s.skipRatio:(i.IS_ANDROID||i.IS_APPLE_MOBILE||i.IS_APPLE&&!i.IS_SAFARI)&&this.width<100&&this.height<100&&!s.needUpscale&&(n=.5),this.skipDelta=void 0!==n?1/n|0:1;const o=Object(a.a)(window.devicePixelRatio,1,2);o>1&&(s.needUpscale?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>1&&(this.width>100&&this.height>100?i.IS_APPLE||!r.b.isMobile?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>2.5&&(this.width=Math.round(this.width*(o-1.5)),this.height=Math.round(this.height*(o-1.5))):(this.width=Math.round(this.width*Math.max(1.5,o-1.5)),this.height=Math.round(this.height*Math.max(1.5,o-1.5))))),s.noCache||(i.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),this.clamped=new Uint8ClampedArray(this.width*this.height*4),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=c.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=c.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cacheName&&c.getCacheCounter(this.cacheName)>1||this.frames.clear()}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){this.paused||(this.paused=!0,t&&clearTimeout(this.rafId))}resetCurrentFrame(){var t;return this.curFrame=null!==(t=this.initFrame)&&void 0!==t?t:1===this.direction?this.minFrame:this.maxFrame}stop(t=!0){this.pause();const e=this.resetCurrentFrame();t&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed!==t&&(this.speed=t,this.paused||this.setMainLoop())}setDirection(t){this.direction!==t&&(this.direction=t,this.paused||this.setMainLoop())}remove(){o.a.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&c.releaseCache(this.cacheName)}applyColor(t){const[e,s,i]=this.color;for(let n=0,r=t.length;n{this.renderFrame2(t,e)},this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){const e=this.frames.get(t);e?this.renderFrame(e,t):i.IS_SAFARI?this.sendQuery("renderFrame",t):(this.clamped.length||(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}onLap(){if(!this.loop)return this.pause(!1),!1}mainLoopForwards(){const{skipDelta:t,maxFrame:e}=this,s=this.curFrame+t>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=t;return this.requestFrame(s),s+t>e&&this.onLap(),!0}mainLoopBackwards(){const{skipDelta:t,minFrame:e}=this,s=this.curFrame-te?1:-1,callback:i})}playToFrame(t){this.pause();const{frame:e,speed:s,callback:i,direction:n}=t;this.setDirection(void 0===n?this.curFrame>e?-1:1:n),void 0!==s&&this.setSpeed(s);const r=[this.curFrame,e];-1===this.direction&&r.reverse(),this.loop=!1,this.setMinMax(r[0],r[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i&&(this.playToFrameOnFrameCallback=t=>{t===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(t,e){this.color=t,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(t){this.inverseColor=t}setMinMax(t=0,e=this.frameCount-1){this.minFrame=t,this.maxFrame=e}onLoad(t,e){return h(this,void 0,void 0,(function*(){this.frameCount=t,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=Object(a.a)(this.initFrame,this.minFrame,this.maxFrame));const s=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(s),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()},{once:!0})}))}}l.reqId=0},17:function(t,e,s){"use strict";s.r(e),s.d(e,"STATE_INIT",(function(){return w})),s.d(e,"AppStateManager",(function(){return F}));var i=s(47),n=s(48),r=s(15),a=s(87),o=s(37),h=s(31),c=s(7),l=s(29),d=s(92),u=s(0),f=s(128),m=s(62),p=s(61);function g(t,e){t=t.split(" ",1)[0],e=e.split(" ",1)[0];const s=t.split("."),i=e.split(".");for(let t=0;tn)return 1;if(e{this.requestPeerSingle(r.default.myId,"self")})}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(t=>{const e=Object.keys(this.storages),s=e.map(t=>this.storages[t].getAll()),i=k.map(t=>a.a.get(t)).concat(m.a.get("user_auth"),m.a.get("state_id")).concat(a.a.get("user_auth")).concat(s);Promise.all(i).then(s=>v(this,void 0,void 0,(function*(){let i=this.state={};for(let t=0,e=k.length;ta.a.get(t)));t.push("user_auth"),e.push("number"==typeof n||"string"==typeof n?{dcID:e[0]||c.a.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};t.forEach((t,i)=>{s[t]=e[i]}),yield m.a.set(s)}n&&(i.authState={_:"authStateSignedIn"},r.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let t=0,i=e.length;t{t.set(s,Object(h.a)(i[s]))}),i=this.state=Object(h.a)(w),t.forEach((t,e)=>{i[e]=t});for(const t in this.storagesResults)this.storagesResults[t].length=0;this.storage.set(i)}yield m.a.set({state_id:i.stateId})}const u=Date.now();if(i.stateCreatedTime+864e5{t.forEach(t=>{this.pushToState(t,Object(h.a)(w[t]));const e=this.storagesResults[t];e&&e.length&&(e.length=0)})})(L)}if(!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=Object(h.a)(w.settings.themes);const t=i.settings.themes.find(t=>t.name===i.settings.theme);t&&(t.background=i.settings.background,this.pushToState("settings",i.settings))}if(Object(h.k)(w,i,t=>{this.pushToState(t,i[t])}),i.version!==y||i.build!==b){if(-1===g(i.version,"0.8.7")){this.state.allDialogsLoaded=Object(h.a)(w.allDialogsLoaded),this.state.filters=Object(h.a)(w.filters);const t=this.storagesResults.dialogs;(null==t?void 0:t.length)&&(t.length=0)}0!==g(i.version,y)&&(this.newVersion=y),this.pushToState("version",y),this.pushToState("build",b)}r.default.settings=i.settings,l.b&&this.log("state res",i,Object(h.a)(i)),console.timeEnd("load state"),t(i)}))).catch(t)})),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(t,e){Object(h.j)(this.state,t,e),r.default.dispatchEvent("settings_updated",{key:t,value:e});const s=t.split(".")[0];this.pushToState(s,this.state[s])}pushToState(t,e,s=!0){s&&(this.state[t]=e),this.setKeyValueToStorage(t,e)}setKeyValueToStorage(t,e=this.state[t]){this.storage.set({[t]:e})}requestPeer(t,e,s){let i=this.neededPeers.get(t);i&&i.has(e)||(i||(i=new Set,this.neededPeers.set(t,i)),i.add(e),this.dispatchEvent("peerNeeded",t),void 0!==s&&this.keepPeerSingle(t,e))}requestPeerSingle(t,e,s=t){return this.requestPeer(t,e+"_"+s,1)}releaseSinglePeer(t,e){return this.keepPeerSingle(i.c,e+"_"+t)}isPeerNeeded(t){return this.neededPeers.has(t)}keepPeerSingle(t,e){const s=this.singlePeerMap.get(e);if(s&&s!==t&&this.neededPeers.has(s)){const t=this.neededPeers.get(s);t.delete(e),t.size||(this.neededPeers.delete(s),this.dispatchEvent("peerUnneeded",s))}t?this.singlePeerMap.set(e,t):this.singlePeerMap.delete(e)}}F.STATE_INIT=w;const E=new F;l.a.appStateManager=E;e.default=E},39:function(t,e,s){"use strict";s.d(e,"a",(function(){return i})),s.d(e,"e",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"d",(function(){return a})),s.d(e,"f",(function(){return o})),s.d(e,"b",(function(){return h}));const i=(t,e)=>t.reduce((t,e)=>t+e,e);function n(t,e){const s=t.indexOf(e),i=-1!==s&&t.splice(s,1);return i&&i[0]}function r(t,e){const s=[];let i=-1;for(;-1!==(i=t.findIndex(e));)s.push(t.splice(i,1)[0]);return s}function a(t,e){for(let s=t.length-1;s>=0;--s)e(t[s],s,t)}function o(t,e,s,i){const n=e[s];if(void 0===i&&-1!==(i=t.indexOf(e))){const e=t[i-1],r=t[i+1];if((!e||e[s]>=n)&&(!r||r[s]<=n))return i;t.splice(i,1)}const r=t.length;if(!r||n<=t[r-1][s])return t.push(e)-1;if(n>=t[0][s])return t.unshift(e),0;for(let i=0;it[i][s])return t.splice(i,0,e),i;return console.error("wtf",t,e),t.indexOf(e)}function h(t){return[...new Set(t)]}},44:function(t,e,s){"use strict";let i;function n(t){i?i.push(t):(i=[t],requestAnimationFrame(()=>{const t=i;i=void 0,t.forEach(t=>t())}))}s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return h})),s.d(e,"d",(function(){return c})),s.d(e,"a",(function(){return l}));let r,a,o=!1;function h(t){r?o?t():r.push(t):(r=[t],requestAnimationFrame(()=>{o=!0;for(let t=0;t{a=void 0}),a)}function l(){return new Promise(t=>{n(()=>{n(t)})})}},54:function(t,e,s){"use strict";function i(){return new Worker(s.p+"rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js")}var n=s(70),r=s(29),a=s(81),o=s(37),h=s(33),c=s(155),l=s(0),d=s(48);class u extends d.a{constructor(t){super(),this.worker=t,this.worker.onerror=t=>{try{this.dispatchEvent("workerError",t),this.cleanup(),this.terminate()}catch(t){}},this.worker.onmessage=t=>{this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.IS_SAFARI)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const s=[];e.forEach(t=>{t instanceof ArrayBuffer&&s.push(t),t.buffer&&t.buffer instanceof ArrayBuffer&&s.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},s)}}}const f=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let m=t=>Math.round(255*Math.min(Math.max(t,0),1));function p(t,e){const s=f[Math.max(e-1,0)],i=t=>{switch(t.ty){case"st":case"fl":(t=>{const e=t.c.k,i=m(e[2])|m(e[1])<<8|m(e[0])<<16,n=s.find(t=>t[0]===i);n&&(e[0]=(n[1]>>16&255)/255,e[1]=(n[1]>>8&255)/255,e[2]=(255&n[1])/255)})(t)}t.hasOwnProperty("it")&&n(t.it)},n=t=>{for(const e of t)i(e)};try{for(const e of t.layers)if(e.shapes)for(const t of e.shapes)t.it?n(t.it):i(t)}catch(s){console.warn("cant apply replacements",s,t,e)}}var g=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const v=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(o.b)("LOTTIE",o.a.Error),this.onPlayerLoaded=(t,e,s)=>{const i=this.players[t];i?(this.log.debug("onPlayerLoaded"),i.onLoad(e,s)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,s)=>{const i=this.players[t];i?(i.clamped=s,i.renderFrame(s,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const s=this.players[t];if(s){n.a.getAnimations(s.el).forEach(t=>{n.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const s=this.players[e];s.loop=t,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),r.addEventListener("frame",this.onFrame),r.addEventListener("loaded",this.onPlayerLoaded),r.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0}),r.addEventListener("workerError",t=>{e("rlottie load error: "+t.message),this.loaded=!1},{once:!0})}})}loadAnimationAsAsset(t,e){return t.name=e,this.loadAnimationFromURL(t,"assets/tgs/"+e+".json")}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.headers&&"application/octet-stream"!==t.headers.get("content-type")?t.text():t.arrayBuffer().then(t=>h.a.invokeCrypto("gzipUncompress",t,!0))).then(s=>{const i=Object.assign(t,{animationData:s,needUpscale:!0});return i.name||(i.name=e),this.loadAnimationWorker(i)})):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(a.a)(2500)]).then(()=>t)}loadAnimationWorker(t,e=t.group||"",s=-1){return g(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(s>=1&&s<=5){t.toneIndex=s;const e=JSON.parse(t.animationData);p(e,s),t.animationData=JSON.stringify(e)}if(this.loaded||(yield this.loadLottieWorkers()),t.width&&t.height||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const i=this.initPlayer(t.container,t);return"none"!==e&&n.a.addAnimation(i,e),i}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t,e){const s=new c.a({el:t,worker:this.workers[this.curWorkerNum++],options:e});return this.players[s.reqId]=s,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),s.loadFromData(e.animationData),s}};r.a.lottieLoader=v;e.a=v},64:function(t,e,s){"use strict";function i(t,e=" "){const s=t.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),s.join(".")}function n(t,e=2){if(0===t)return"0 Bytes";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,i)).toFixed(s))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}function r(t,e=2){if(0===t)return"0";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1e3));return parseFloat((t/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}function a(t,e,s){return ts?s:t}s.d(e,"d",(function(){return i})),s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"a",(function(){return a}))},68:function(t,e,s){"use strict";function i(t){return null==t?void 0:t.isConnected}s.d(e,"a",(function(){return i}))},69:function(t,e,s){"use strict";s.d(e,"a",(function(){return d}));var i=s(54),n=s(131),r=s(29),a=s(83),o=s(89);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(n.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&i.a.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};r.a.pagesManager=h;var c=h,l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};class d{constructor(t,e,s,i,n){this.isAuthPage=e,this.onFirstMount=s,this.onMount=i,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},70:function(t,e,s){"use strict";var i=s(15),n=s(0),r=s(29),a=s(68),o=s(39),h=s(155);const c=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{if(!i.default.idle.isIDLE)for(const e of t){const t=e.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const i=this.byGroups[s].find(e=>e.el===t);if(i){e.isIntersecting?(this.visible.add(i),this.checkAnimation(i,!1)):(this.visible.delete(i),this.checkAnimation(i,!0),i.animation instanceof h.a&&i.animation.clearCache());break}}}}),i.default.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),i.default.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}getAnimations(t){const e=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===t&&e.push(i);return e}removeAnimation(t){const{el:e,animation:s}=t;s.remove(),s instanceof HTMLVideoElement&&n.IS_SAFARI&&setTimeout(()=>{s.src="",s.load()},1e3);for(const e in this.byGroups)Object(o.e)(this.byGroups[e],t);this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var s;const n={el:t instanceof h.a?t.el:t,animation:t,group:e};t instanceof h.a&&!i.default.settings.stickers.loop&&t.loop&&(t.loop=i.default.settings.stickers.loop),(null!==(s=this.byGroups[e])&&void 0!==s?s:this.byGroups[e]=[]).push(n),this.observer.observe(n.el)}checkAnimations(t,e,s=!1){if(i.default.idle.isIDLE)return;const n=e?[e]:Object.keys(this.byGroups);if(!e||this.byGroups[e])for(const e of n){this.byGroups[e].forEach(e=>{this.checkAnimation(e,t,s)})}else this.byGroups[e]=[]}checkAnimation(t,e=!1,s=!1){const{el:i,animation:n,group:r}=t;s||!Object(a.a)(i)&&!this.lockedGroups[r]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==r||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():n.paused&&this.visible.has(t)&&n.autoplay&&(!this.onlyOnePlayableGroup||this.onlyOnePlayableGroup===r)&&n.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};r.a&&(r.a.animationIntersector=c),e.a=c},71:function(t,e,s){"use strict";function i(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}s.d(e,"a",(function(){return i}))},77:function(t,e,s){"use strict";s.d(e,"b",(function(){return d})),s.d(e,"d",(function(){return f})),s.d(e,"c",(function(){return m}));var i=s(45),n=s(15),r=s(29),a=s(81);let o=!1,h=Object(i.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(i.a)(),n.default.dispatchEvent("event-heavy-animation-start"),o=!0,r.b&&l("start")),++c,r.b&&l("attach promise, length:",c,e);const s=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),f=h;return Promise.race(s).then(()=>{h!==f||h.isFulfilled||(--c,r.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,n.default.dispatchEvent("event-heavy-animation-end"),h.resolve(),r.b&&l("end"))}function f(){u()}function m(){return h}e.a=function(t,e,s){o&&t();const i=s?s.add(n.default):n.default.addEventListener.bind(n.default),r=s?s.removeManual.bind(s,n.default):n.default.removeEventListener.bind(n.default);return i("event-heavy-animation-start",t),i("event-heavy-animation-end",e),()=>{r("event-heavy-animation-end",e),r("event-heavy-animation-start",t)}}},83:function(t,e,s){"use strict";s.d(e,"a",(function(){return h})),s.d(e,"b",(function(){return c}));var i=s(77),n=s(44),r=s(120),a=s(15),o=s(68);var h;function c(t){if(void 0===t.margin&&(t.margin=0),void 0===t.maxDistance&&(t.maxDistance=1500),void 0===t.axis&&(t.axis="y"),a.default.settings.animationsEnabled||(t.forceDirection=h.Static),t.forceDirection===h.Static)return t.forceDuration=0,l(t);const e=new Promise(e=>{Object(n.b)(()=>{l(t).then(e)})});return"y"===t.axis?Object(i.b)(e):e}function l(t){const{element:e,container:s,getNormalSize:i,axis:n,margin:a,position:h,forceDirection:c,maxDistance:f,forceDuration:m}=t;if(!Object(o.a)(e))return Object(r.c)(s),Promise.resolve();const p="y"===n?"top":"left",g="y"===n?"bottom":"right",v="y"===n?"height":"width",y="y"===n?"scrollHeight":"scrollWidth",b="y"===n?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=s.getBoundingClientRect?s.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[p]-k[p],F=e[y],E=i?i({rect:k}):k[v];let S=s[b];const M=s[y];let I;switch(h){case"start":I=L-a;break;case"end":I=w[g]-k[g]+a;break;case"nearest":case"center":if(Ff?(S=s.scrollTop+=I-f,I=f):I<-f&&(S=s.scrollTop+=I+f,I=-f)),I<0){const t=-S;I=Math.max(I,t)}else if(I>0){const t=M-(S+E);I=Math.min(I,t)}const P=s[b]+I,O=Math.abs(I),D=null!=m?m:250+O/1500*350,A=Date.now(),T=O<500?u:d,x=()=>{const t=D?Math.min((Date.now()-A)/D,1):1,e=I*(1-T(t));return s[b]=Math.round(P-e),t<1};return D&&I?Object(r.b)(x,s):(Object(r.c)(s),x(),Promise.resolve())}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))},89:function(t,e,s){"use strict";function i(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}s.d(e,"a",(function(){return i}))}}]); -//# sourceMappingURL=2.db718300c1179401e843.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[2,28],{120:function(t,e,s){"use strict";s.d(e,"c",(function(){return a})),s.d(e,"b",(function(){return o})),s.d(e,"a",(function(){return h}));var i=s(44),n=s(45);const r=new Map;function a(t){const e=function(t){return r.get(t)}(t);e&&(e.isCancelled=!0,e.deferred.resolve())}function o(t,e,s){return s||(s=function(t){a(t);const e={isCancelled:!1,deferred:Object(n.a)()};return r.set(t,e),e.deferred.then(()=>{r.delete(t)}),e}(e)),Object(i.b)(()=>{s.isCancelled||(t()?o(t,e,s):s.deferred.resolve())}),s.deferred}function h(t){Object(i.b)(()=>{t()&&h(t)})}},131:function(t,e,s){"use strict";s.d(e,"a",(function(){return c}));var i=s(132),n=s(15),r=s(44),a=s(83),o=s(72),h=s(89);function c(t,e,s,c,l=250,d){const u=Object(i.a)(e,t||"tabs"===e.dataset.animation?"tabs":"navigation",l,c);if(t){const i=new Proxy(u,{apply:(e,s,i)=>{const n=+i[0],r=void 0===i[1]||i[1],a=t.querySelector(`[data-tab="${n}"]`)||t.children[n];c(a,n,r)}}),c=(i,o,h=!0)=>{const c=e.children[o];if(s){const t=s(o,c,h);if(void 0!==t&&!t)return}d&&d.scrollIntoViewNew({element:i.parentElement.children[o],position:"center",forceDirection:h?void 0:a.a.Static,forceDuration:l,axis:"x"}),n.default.settings.animationsEnabled||(h=!1);const p=u.prevId();if(i.classList.contains("active")||o===p)return!1;const g=t.querySelector(m.toLowerCase()+".active");Object(r.b)(()=>{g&&g.classList.remove("active")}),f&&-1!==p&&h&&Object(r.b)(()=>{const t=i.querySelector("i"),e=i.parentElement.children[p].querySelector("i");e.classList.remove("animate"),t.classList.remove("animate");const s=e.parentElement.parentElement.offsetLeft-t.parentElement.parentElement.offsetLeft,n=e.clientWidth/t.clientWidth;t.style.transform=`translate3d(${s}px, 0, 0) scale3d(${n}, 1, 1)`,requestAnimationFrame(()=>{t.classList.add("animate"),t.style.transform="none"})}),Object(r.b)(()=>{i.classList.add("active")}),u(o,h)},f=!t.classList.contains("no-stripe"),m=t.firstElementChild.tagName;return t.addEventListener("click",(function(e){let s,i=e.target;if(i=Object(o.a)(i,t),!i)return!1;if(i.dataset.tab){if(s=+i.dataset.tab,-1===s)return!1}else s=Object(h.a)(i);c(i,s)})),i}return u}},132:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(15),n=s(45),r=s(77),a=s(89),o=s(5);function h(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",t.style.filter="",()=>{e.style.transform=e.style.filter=""}}function c(t,e,s){const i=e.getBoundingClientRect().width,n=[t,e];return s&&n.reverse(),n[0].style.transform=`translate3d(${-i}px, 0, 0)`,n[1].style.transform=`translate3d(${i}px, 0, 0)`,t.classList.add("active"),t.offsetWidth,t.style.transform="",()=>{e.style.transform=""}}const l=(t,e,s,i,n=!0)=>{let r=null;switch(e){case"tabs":r=c;break;case"navigation":r=h}return t.dataset.animation=e,d(t,r,s,i,n)},d=(t,e,s,h,c=!0,l=!1,d=!0)=>{const u=new Map;let f,m=null;if(d){const s=e?"transitionend":"animationend",i=e=>{if(Object(o.a)(e),e.target.parentElement!==t)return;const n=u.get(e.target);n&&n(),e.target===m&&(!f&&c||(f&&(f.resolve(),f=void 0),h&&h(p.prevId()),t.classList.remove("animating","backwards","disable-hover"),l&&(t.removeEventListener(s,i),m=f=void 0,u.clear())))};t.addEventListener(s,i)}function p(o,l=!0,g){g&&(m=g),o instanceof HTMLElement&&(o=Object(a.a)(o));const v=p.prevId();if(o===v)return!1;const y=t.children[o];if(i.default.settings.animationsEnabled&&-1!==v||(l=!1),!d){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!l){if(m)m.classList.remove("active","to","from");else if(y){const t=u.get(y);t&&t()}return y&&(y.classList.remove("to","from"),y.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),m=y,void(h&&h(o))}d||(t.dataset.timeout=""+window.setTimeout(()=>{y.classList.remove("to"),m&&m.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout},s)),m&&(m.classList.remove("to"),m.classList.add("from")),t.classList.add("animating");const b=v{y.classList.remove("to"),u.delete(y)}),m){const t=m,e=()=>{t.classList.remove("active","from"),w&&w(),u.delete(t)};if(y)u.set(t,e);else{const i=window.setTimeout(e,s);u.set(t,()=>{clearTimeout(i),u.delete(t)})}c&&(f||(f=Object(n.a)()),Object(r.b)(f,2*s))}m=y}return p.prevId=()=>m?Object(a.a)(m):-1,p}},155:function(t,e,s){"use strict";s.d(e,"a",(function(){return l}));var i=s(0),n=s(48),r=s(38),a=s(64),o=s(54),h=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const c=new class{constructor(){this.cache=new Map}getCache(t){let e=this.cache.get(t);return e||this.cache.set(t,e={frames:new Map,counter:0}),++e.counter,e.frames}releaseCache(t){const e=this.cache.get(t);e&&!--e.counter&&this.cache.delete(t)}getCacheCounter(t){const e=this.cache.get(t);return null==e?void 0:e.counter}generateName(t,e,s,i,n){return[t,e,s,i?"colored":"",n||""].filter(Boolean).join("-")}};class l extends n.a{constructor({el:t,worker:e,options:s}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.reqId=++l.reqId,this.el=t,this.worker=e;for(let t in s)this.hasOwnProperty(t)&&(this[t]=s[t]);let n;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=s.initFrame,this.color=s.color,this.inverseColor=s.inverseColor,this.name=s.name,this.skipFirstFrameRendering=s.skipFirstFrameRendering,this.toneIndex=s.toneIndex,void 0!==s.skipRatio?n=s.skipRatio:(i.IS_ANDROID||i.IS_APPLE_MOBILE||i.IS_APPLE&&!i.IS_SAFARI)&&this.width<100&&this.height<100&&!s.needUpscale&&(n=.5),this.skipDelta=void 0!==n?1/n|0:1;const o=Object(a.a)(window.devicePixelRatio,1,2);o>1&&(s.needUpscale?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>1&&(this.width>100&&this.height>100?i.IS_APPLE||!r.b.isMobile?(this.width=Math.round(this.width*o),this.height=Math.round(this.height*o)):o>2.5&&(this.width=Math.round(this.width*(o-1.5)),this.height=Math.round(this.height*(o-1.5))):(this.width=Math.round(this.width*Math.max(1.5,o-1.5)),this.height=Math.round(this.height*Math.max(1.5,o-1.5))))),s.noCache||(i.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=document.createElement("canvas"),this.canvas.classList.add("rlottie"),this.canvas.width=this.width,this.canvas.height=this.height),this.context=this.canvas.getContext("2d"),this.clamped=new Uint8ClampedArray(this.width*this.height*4),this.imageData=new ImageData(this.width,this.height),this.name?(this.cacheName=c.generateName(this.name,this.width,this.height,this.color,this.toneIndex),this.frames=c.getCache(this.cacheName)):this.frames=new Map}clearCache(){this.cacheName&&c.getCacheCounter(this.cacheName)>1||this.frames.clear()}sendQuery(t,...e){this.worker.sendQuery(t,this.reqId,...e)}loadFromData(t){this.sendQuery("loadFromData",t,this.width,this.height)}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(t=!0){this.paused||(this.paused=!0,t&&clearTimeout(this.rafId))}resetCurrentFrame(){var t;return this.curFrame=null!==(t=this.initFrame)&&void 0!==t?t:1===this.direction?this.minFrame:this.maxFrame}stop(t=!0){this.pause();const e=this.resetCurrentFrame();t&&this.requestFrame(e)}restart(){this.stop(!1),this.play()}setSpeed(t){this.speed!==t&&(this.speed=t,this.paused||this.setMainLoop())}setDirection(t){this.direction!==t&&(this.direction=t,this.paused||this.setMainLoop())}remove(){o.a.onDestroy(this.reqId),this.pause(),this.sendQuery("destroy"),this.cacheName&&c.releaseCache(this.cacheName)}applyColor(t){const[e,s,i]=this.color;for(let n=0,r=t.length;n{this.renderFrame2(t,e)},this.frInterval>-s?-s%this.frInterval:this.frInterval)}this.renderFrame2(t,e)}requestFrame(t){const e=this.frames.get(t);e?this.renderFrame(e,t):i.IS_SAFARI?this.sendQuery("renderFrame",t):(this.clamped.length||(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery("renderFrame",t,this.clamped))}onLap(){if(!this.loop)return this.pause(!1),!1}mainLoopForwards(){const{skipDelta:t,maxFrame:e}=this,s=this.curFrame+t>e?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=t;return this.requestFrame(s),s+t>e&&this.onLap(),!0}mainLoopBackwards(){const{skipDelta:t,minFrame:e}=this,s=this.curFrame-te?1:-1,callback:i})}playToFrame(t){this.pause();const{frame:e,speed:s,callback:i,direction:n}=t;this.setDirection(void 0===n?this.curFrame>e?-1:1:n),void 0!==s&&this.setSpeed(s);const r=[this.curFrame,e];-1===this.direction&&r.reverse(),this.loop=!1,this.setMinMax(r[0],r[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i&&(this.playToFrameOnFrameCallback=t=>{t===e&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),i())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(t,e){this.color=t,e&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(t){this.inverseColor=t}setMinMax(t=0,e=this.frameCount-1){this.minFrame=t,this.maxFrame=e}onLoad(t,e){return h(this,void 0,void 0,(function*(){this.frameCount=t,this.fps=e,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=Object(a.a)(this.initFrame,this.minFrame,this.maxFrame));const s=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const t=60/e;this.skipDelta=this.skipDelta/t|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(s),this.dispatchEvent("ready"),this.addEventListener("enterFrame",()=>{this.dispatchEvent("firstFrame"),!this.canvas.parentNode&&this.el&&this.el.appendChild(this.canvas),this.frameListener=()=>{if(this.paused)return;const t=Date.now();this.frThen=t+this.frInterval;this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()},{once:!0})}))}}l.reqId=0},17:function(t,e,s){"use strict";s.r(e),s.d(e,"STATE_INIT",(function(){return w})),s.d(e,"AppStateManager",(function(){return F}));var i=s(47),n=s(48),r=s(15),a=s(87),o=s(37),h=s(31),c=s(7),l=s(29),d=s(92),u=s(0),f=s(128),m=s(62),p=s(61);function g(t,e){t=t.split(" ",1)[0],e=e.split(" ",1)[0];const s=t.split("."),i=e.split(".");for(let t=0;tn)return 1;if(e{this.requestPeerSingle(r.default.myId,"self")})}loadSavedState(){return this.loaded||(console.time("load state"),this.loaded=new Promise(t=>{const e=Object.keys(this.storages),s=e.map(t=>this.storages[t].getAll()),i=k.map(t=>a.a.get(t)).concat(m.a.get("user_auth"),m.a.get("state_id")).concat(a.a.get("user_auth")).concat(s);Promise.all(i).then(s=>v(this,void 0,void 0,(function*(){let i=this.state={};for(let t=0,e=k.length;ta.a.get(t)));t.push("user_auth"),e.push("number"==typeof n||"string"==typeof n?{dcID:e[0]||c.a.baseDcId,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n);let s={};t.forEach((t,i)=>{s[t]=e[i]}),yield m.a.set(s)}n&&(i.authState={_:"authStateSignedIn"},r.default.dispatchEvent("user_auth","number"==typeof n||"string"==typeof n?{dcID:0,date:Date.now()/1e3|0,id:n.toPeerId(!1)}:n));for(let t=0,i=e.length;t{t.set(s,Object(h.a)(i[s]))}),i=this.state=Object(h.a)(w),t.forEach((t,e)=>{i[e]=t});for(const t in this.storagesResults)this.storagesResults[t].length=0;this.storage.set(i)}yield m.a.set({state_id:i.stateId})}const u=Date.now();if(i.stateCreatedTime+864e5{t.forEach(t=>{this.pushToState(t,Object(h.a)(w[t]));const e=this.storagesResults[t];e&&e.length&&(e.length=0)})})(L)}if(!i.settings.hasOwnProperty("theme")&&i.settings.hasOwnProperty("nightTheme")&&(i.settings.theme=i.settings.nightTheme?"night":"day",this.pushToState("settings",i.settings)),!i.settings.hasOwnProperty("themes")&&i.settings.background){i.settings.themes=Object(h.a)(w.settings.themes);const t=i.settings.themes.find(t=>t.name===i.settings.theme);t&&(t.background=i.settings.background,this.pushToState("settings",i.settings))}if(Object(h.k)(w,i,t=>{this.pushToState(t,i[t])}),i.version!==y||i.build!==b){if(-1===g(i.version,"0.8.7")){this.state.allDialogsLoaded=Object(h.a)(w.allDialogsLoaded),this.state.filters=Object(h.a)(w.filters);const t=this.storagesResults.dialogs;(null==t?void 0:t.length)&&(t.length=0)}0!==g(i.version,y)&&(this.newVersion=y),this.pushToState("version",y),this.pushToState("build",b)}r.default.settings=i.settings,l.b&&this.log("state res",i,Object(h.a)(i)),console.timeEnd("load state"),t(i)}))).catch(t)})),this.loaded}getState(){return void 0===this.state?this.loadSavedState():Promise.resolve(this.state)}setByKey(t,e){Object(h.j)(this.state,t,e),r.default.dispatchEvent("settings_updated",{key:t,value:e});const s=t.split(".")[0];this.pushToState(s,this.state[s])}pushToState(t,e,s=!0){s&&(this.state[t]=e),this.setKeyValueToStorage(t,e)}setKeyValueToStorage(t,e=this.state[t]){this.storage.set({[t]:e})}requestPeer(t,e,s){let i=this.neededPeers.get(t);i&&i.has(e)||(i||(i=new Set,this.neededPeers.set(t,i)),i.add(e),this.dispatchEvent("peerNeeded",t),void 0!==s&&this.keepPeerSingle(t,e))}requestPeerSingle(t,e,s=t){return this.requestPeer(t,e+"_"+s,1)}releaseSinglePeer(t,e){return this.keepPeerSingle(i.c,e+"_"+t)}isPeerNeeded(t){return this.neededPeers.has(t)}keepPeerSingle(t,e){const s=this.singlePeerMap.get(e);if(s&&s!==t&&this.neededPeers.has(s)){const t=this.neededPeers.get(s);t.delete(e),t.size||(this.neededPeers.delete(s),this.dispatchEvent("peerUnneeded",s))}t?this.singlePeerMap.set(e,t):this.singlePeerMap.delete(e)}}F.STATE_INIT=w;const E=new F;l.a.appStateManager=E;e.default=E},39:function(t,e,s){"use strict";s.d(e,"a",(function(){return i})),s.d(e,"e",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"d",(function(){return a})),s.d(e,"f",(function(){return o})),s.d(e,"b",(function(){return h}));const i=(t,e)=>t.reduce((t,e)=>t+e,e);function n(t,e){const s=t.indexOf(e),i=-1!==s&&t.splice(s,1);return i&&i[0]}function r(t,e){const s=[];let i=-1;for(;-1!==(i=t.findIndex(e));)s.push(t.splice(i,1)[0]);return s}function a(t,e){for(let s=t.length-1;s>=0;--s)e(t[s],s,t)}function o(t,e,s,i){const n=e[s];if(void 0===i&&-1!==(i=t.indexOf(e))){const e=t[i-1],r=t[i+1];if((!e||e[s]>=n)&&(!r||r[s]<=n))return i;t.splice(i,1)}const r=t.length;if(!r||n<=t[r-1][s])return t.push(e)-1;if(n>=t[0][s])return t.unshift(e),0;for(let i=0;it[i][s])return t.splice(i,0,e),i;return console.error("wtf",t,e),t.indexOf(e)}function h(t){return[...new Set(t)]}},44:function(t,e,s){"use strict";let i;function n(t){i?i.push(t):(i=[t],requestAnimationFrame(()=>{const t=i;i=void 0,t.forEach(t=>t())}))}s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return h})),s.d(e,"d",(function(){return c})),s.d(e,"a",(function(){return l}));let r,a,o=!1;function h(t){r?o?t():r.push(t):(r=[t],requestAnimationFrame(()=>{o=!0;for(let t=0;t{a=void 0}),a)}function l(){return new Promise(t=>{n(()=>{n(t)})})}},54:function(t,e,s){"use strict";function i(){return new Worker(s.p+"rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js")}var n=s(71),r=s(29),a=s(81),o=s(37),h=s(33),c=s(155),l=s(0),d=s(48);class u extends d.a{constructor(t){super(),this.worker=t,this.worker.onerror=t=>{try{this.dispatchEvent("workerError",t),this.cleanup(),this.terminate()}catch(t){}},this.worker.onmessage=t=>{this.dispatchEvent(t.data.queryMethodListener,...t.data.queryMethodArguments)}}postMessage(t){this.worker.postMessage(t)}terminate(){this.worker.terminate()}sendQuery(t,...e){if(l.IS_SAFARI)this.worker.postMessage({queryMethod:t,queryMethodArguments:e});else{const s=[];e.forEach(t=>{t instanceof ArrayBuffer&&s.push(t),t.buffer&&t.buffer instanceof ArrayBuffer&&s.push(t.buffer)}),this.worker.postMessage({queryMethod:t,queryMethodArguments:e},s)}}}const f=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]];let m=t=>Math.round(255*Math.min(Math.max(t,0),1));function p(t,e){const s=f[Math.max(e-1,0)],i=t=>{switch(t.ty){case"st":case"fl":(t=>{const e=t.c.k,i=m(e[2])|m(e[1])<<8|m(e[0])<<16,n=s.find(t=>t[0]===i);n&&(e[0]=(n[1]>>16&255)/255,e[1]=(n[1]>>8&255)/255,e[2]=(255&n[1])/255)})(t)}t.hasOwnProperty("it")&&n(t.it)},n=t=>{for(const e of t)i(e)};try{for(const e of t.layers)if(e.shapes)for(const t of e.shapes)t.it?n(t.it):i(t)}catch(s){console.warn("cant apply replacements",s,t,e)}}var g=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};const v=new class{constructor(){this.isWebAssemblySupported="undefined"!=typeof WebAssembly,this.loadPromise=this.isWebAssemblySupported?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=4,this.players={},this.workers=[],this.curWorkerNum=0,this.log=Object(o.b)("LOTTIE",o.a.Error),this.onPlayerLoaded=(t,e,s)=>{const i=this.players[t];i?(this.log.debug("onPlayerLoaded"),i.onLoad(e,s)):this.log.warn("onPlayerLoaded on destroyed player:",t,e)},this.onFrame=(t,e,s)=>{const i=this.players[t];i?(i.clamped=s,i.renderFrame(s,e)):this.log.warn("onFrame on destroyed player:",t,e)},this.onPlayerError=(t,e)=>{const s=this.players[t];if(s){n.a.getAnimations(s.el).forEach(t=>{n.a.checkAnimation(t,!0,!0)})}}}getAnimation(t){for(const e in this.players)if(this.players[e].el===t)return this.players[e];return null}setLoop(t){for(const e in this.players){const s=this.players[e];s.loop=t,s.autoplay=s._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise((t,e)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),r.addEventListener("frame",this.onFrame),r.addEventListener("loaded",this.onPlayerLoaded),r.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),t(),this.loaded=!0)},{once:!0}),r.addEventListener("workerError",t=>{e("rlottie load error: "+t.message),this.loaded=!1},{once:!0})}})}loadAnimationAsAsset(t,e){return t.name=e,this.loadAnimationFromURL(t,"assets/tgs/"+e+".json")}loadAnimationFromURL(t,e){return this.isWebAssemblySupported?(this.loaded||this.loadLottieWorkers(),fetch(e).then(t=>t.headers&&"application/octet-stream"!==t.headers.get("content-type")?t.text():t.arrayBuffer().then(t=>h.a.invokeCrypto("gzipUncompress",t,!0))).then(s=>{const i=Object.assign(t,{animationData:s,needUpscale:!0});return i.name||(i.name=e),this.loadAnimationWorker(i)})):this.loadPromise}waitForFirstFrame(t){return Promise.race([new Promise(e=>{t.addEventListener("firstFrame",e,{once:!0})}),Object(a.a)(2500)]).then(()=>t)}loadAnimationWorker(t,e=t.group||"",s=-1){return g(this,void 0,void 0,(function*(){if(!this.isWebAssemblySupported)return this.loadPromise;if(s>=1&&s<=5){t.toneIndex=s;const e=JSON.parse(t.animationData);p(e,s),t.animationData=JSON.stringify(e)}if(this.loaded||(yield this.loadLottieWorkers()),t.width&&t.height||(t.width=parseInt(t.container.style.width),t.height=parseInt(t.container.style.height)),!t.width||!t.height)throw new Error("No size for sticker!");t.group=e;const i=this.initPlayer(t.container,t);return"none"!==e&&n.a.addAnimation(i,e),i}))}onDestroy(t){delete this.players[t]}destroyWorkers(){this.workers.forEach((t,e)=>{t.terminate(),this.log("worker #"+e+" terminated")}),this.log("workers destroyed"),this.workers.length=0}initPlayer(t,e){const s=new c.a({el:t,worker:this.workers[this.curWorkerNum++],options:e});return this.players[s.reqId]=s,this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),s.loadFromData(e.animationData),s}};r.a.lottieLoader=v;e.a=v},64:function(t,e,s){"use strict";function i(t,e=" "){const s=t.toString().split(".");return s[0]=s[0].replace(/\B(?=(\d{3})+(?!\d))/g,e),s.join(".")}function n(t,e=2){if(0===t)return"0 Bytes";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,i)).toFixed(s))+" "+["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"][i]}function r(t,e=2){if(0===t)return"0";const s=e<0?0:e,i=Math.floor(Math.log(t)/Math.log(1e3));return parseFloat((t/Math.pow(1e3,i)).toFixed(s))+["","K","M","B","T"][i]}function a(t,e,s){return ts?s:t}s.d(e,"d",(function(){return i})),s.d(e,"b",(function(){return n})),s.d(e,"c",(function(){return r})),s.d(e,"a",(function(){return a}))},68:function(t,e,s){"use strict";function i(t){return null==t?void 0:t.isConnected}s.d(e,"a",(function(){return i}))},69:function(t,e,s){"use strict";s.d(e,"a",(function(){return d}));var i=s(54),n=s(131),r=s(29),a=s(83),o=s(89);const h=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=Object(n.a)(null,this.scrollableDiv.querySelector(".tabs-container"),null,()=>{var t;(null===(t=this.page)||void 0===t?void 0:t.onShown)&&this.page.onShown()})}setPage(t){if(t.isAuthPage){this.pagesDiv.style.display="";let e=Object(o.a)(t.pageEl);if(this.pageId===e)return;this.selectTab(e),-1!==this.pageId&&e>1&&i.a.loadLottieWorkers(),this.pageId=e,this.scrollableDiv&&Object(a.b)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",t.pageEl.style.display="",this.pageId=-1;this.page=t}};r.a.pagesManager=h;var c=h,l=function(t,e,s,i){return new(s||(s=Promise))((function(n,r){function a(t){try{h(i.next(t))}catch(t){r(t)}}function o(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?n(t.value):(e=t.value,e instanceof s?e:new s((function(t){t(e)}))).then(a,o)}h((i=i.apply(t,e||[])).next())}))};class d{constructor(t,e,s,i,n){this.isAuthPage=e,this.onFirstMount=s,this.onMount=i,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+t)}mount(...t){return l(this,void 0,void 0,(function*(){if(this.onMount&&this.onMount(...t),!this.installed){if(this.onFirstMount)try{const e=this.onFirstMount(...t);e instanceof Promise&&(yield e)}catch(t){console.error("PAGE MOUNT ERROR:",t)}this.installed=!0}c.setPage(this)}))}}},71:function(t,e,s){"use strict";var i=s(15),n=s(0),r=s(29),a=s(68),o=s(39),h=s(155);const c=new class{constructor(){this.visible=new Set,this.byGroups={},this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,this.observer=new IntersectionObserver(t=>{if(!i.default.idle.isIDLE)for(const e of t){const t=e.target;for(const s in this.byGroups){if(this.intersectionLockedGroups[s])continue;const i=this.byGroups[s].find(e=>e.el===t);if(i){e.isIntersecting?(this.visible.add(i),this.checkAnimation(i,!1)):(this.visible.delete(i),this.checkAnimation(i,!0),i.animation instanceof h.a&&i.animation.clearCache());break}}}}),i.default.addEventListener("media_play",({doc:t})=>{"round"===t.type&&(this.videosLocked=!0,this.checkAnimations())}),i.default.addEventListener("media_pause",()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations())})}getAnimations(t){const e=[];for(const s in this.byGroups)for(const i of this.byGroups[s])i.el===t&&e.push(i);return e}removeAnimation(t){const{el:e,animation:s}=t;s.remove(),s instanceof HTMLVideoElement&&n.IS_SAFARI&&setTimeout(()=>{s.src="",s.load()},1e3);for(const e in this.byGroups)Object(o.e)(this.byGroups[e],t);this.observer.unobserve(e),this.visible.delete(t)}addAnimation(t,e=""){var s;const n={el:t instanceof h.a?t.el:t,animation:t,group:e};t instanceof h.a&&!i.default.settings.stickers.loop&&t.loop&&(t.loop=i.default.settings.stickers.loop),(null!==(s=this.byGroups[e])&&void 0!==s?s:this.byGroups[e]=[]).push(n),this.observer.observe(n.el)}checkAnimations(t,e,s=!1){if(i.default.idle.isIDLE)return;const n=e?[e]:Object.keys(this.byGroups);if(!e||this.byGroups[e])for(const e of n){this.byGroups[e].forEach(e=>{this.checkAnimation(e,t,s)})}else this.byGroups[e]=[]}checkAnimation(t,e=!1,s=!1){const{el:i,animation:n,group:r}=t;s||!Object(a.a)(i)&&!this.lockedGroups[r]?this.removeAnimation(t):e||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==r||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():n.paused&&this.visible.has(t)&&n.autoplay&&(!this.onlyOnePlayableGroup||this.onlyOnePlayableGroup===r)&&n.play()}setOnlyOnePlayableGroup(t){this.onlyOnePlayableGroup=t}lockGroup(t){this.lockedGroups[t]=!0}unlockGroup(t){delete this.lockedGroups[t],this.checkAnimations(void 0,t)}refreshGroup(t){const e=this.byGroups[t];e&&e.length&&(e.forEach(t=>{this.observer.unobserve(t.el)}),window.requestAnimationFrame(()=>{e.forEach(t=>{this.observer.observe(t.el)})}))}lockIntersectionGroup(t){this.intersectionLockedGroups[t]=!0}unlockIntersectionGroup(t){delete this.intersectionLockedGroups[t],this.refreshGroup(t)}};r.a&&(r.a.animationIntersector=c),e.a=c},72:function(t,e,s){"use strict";function i(t,e){if(t.parentElement===e)return t;for(;t.parentElement;)if((t=t.parentElement).parentElement===e)return t;return null}s.d(e,"a",(function(){return i}))},77:function(t,e,s){"use strict";s.d(e,"b",(function(){return d})),s.d(e,"d",(function(){return f})),s.d(e,"c",(function(){return m}));var i=s(45),n=s(15),r=s(29),a=s(81);let o=!1,h=Object(i.a)(),c=0;h.resolve();const l=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function d(t,e){o||(h=Object(i.a)(),n.default.dispatchEvent("event-heavy-animation-start"),o=!0,r.b&&l("start")),++c,r.b&&l("attach promise, length:",c,e);const s=[void 0!==e?Object(a.a)(e):void 0,t.finally(()=>{})].filter(Boolean),d=performance.now(),f=h;return Promise.race(s).then(()=>{h!==f||h.isFulfilled||(--c,r.b&&l("promise end, length:",c,performance.now()-d),c<=0&&u())}),h}function u(){h.isFulfilled||(o=!1,c=0,n.default.dispatchEvent("event-heavy-animation-end"),h.resolve(),r.b&&l("end"))}function f(){u()}function m(){return h}e.a=function(t,e,s){o&&t();const i=s?s.add(n.default):n.default.addEventListener.bind(n.default),r=s?s.removeManual.bind(s,n.default):n.default.removeEventListener.bind(n.default);return i("event-heavy-animation-start",t),i("event-heavy-animation-end",e),()=>{r("event-heavy-animation-end",e),r("event-heavy-animation-start",t)}}},83:function(t,e,s){"use strict";s.d(e,"a",(function(){return h})),s.d(e,"b",(function(){return c}));var i=s(77),n=s(44),r=s(120),a=s(15),o=s(68);var h;function c(t){if(void 0===t.margin&&(t.margin=0),void 0===t.maxDistance&&(t.maxDistance=1500),void 0===t.axis&&(t.axis="y"),a.default.settings.animationsEnabled||(t.forceDirection=h.Static),t.forceDirection===h.Static)return t.forceDuration=0,l(t);const e=new Promise(e=>{Object(n.b)(()=>{l(t).then(e)})});return"y"===t.axis?Object(i.b)(e):e}function l(t){const{element:e,container:s,getNormalSize:i,axis:n,margin:a,position:h,forceDirection:c,maxDistance:f,forceDuration:m}=t;if(!Object(o.a)(e))return Object(r.c)(s),Promise.resolve();const p="y"===n?"top":"left",g="y"===n?"bottom":"right",v="y"===n?"height":"width",y="y"===n?"scrollHeight":"scrollWidth",b="y"===n?"scrollTop":"scrollLeft",w=e.getBoundingClientRect(),k=s.getBoundingClientRect?s.getBoundingClientRect():document.body.getBoundingClientRect(),L=w[p]-k[p],F=e[y],E=i?i({rect:k}):k[v];let S=s[b];const M=s[y];let I;switch(h){case"start":I=L-a;break;case"end":I=w[g]-k[g]+a;break;case"nearest":case"center":if(Ff?(S=s.scrollTop+=I-f,I=f):I<-f&&(S=s.scrollTop+=I+f,I=-f)),I<0){const t=-S;I=Math.max(I,t)}else if(I>0){const t=M-(S+E);I=Math.min(I,t)}const P=s[b]+I,O=Math.abs(I),D=null!=m?m:250+O/1500*350,A=Date.now(),T=O<500?u:d,x=()=>{const t=D?Math.min((Date.now()-A)/D,1):1,e=I*(1-T(t));return s[b]=Math.round(P-e),t<1};return D&&I?Object(r.b)(x,s):(Object(r.c)(s),x(),Promise.resolve())}function d(t){return 1-Math.pow(1-t,5)}function u(t){return 1-Math.pow(1-t,3.5)}!function(t){t[t.Up=0]="Up",t[t.Down=1]="Down",t[t.Static=2]="Static"}(h||(h={}))},89:function(t,e,s){"use strict";function i(t){if(!t.parentNode)return-1;let e=0;for(;null!==(t=t.previousElementSibling);)++e;return e}s.d(e,"a",(function(){return i}))}}]); +//# sourceMappingURL=2.53fa88cb7bccd9cf2f74.chunk.js.map \ No newline at end of file diff --git a/public/2.db718300c1179401e843.chunk.js.map b/public/2.53fa88cb7bccd9cf2f74.chunk.js.map similarity index 99% rename from public/2.db718300c1179401e843.chunk.js.map rename to public/2.53fa88cb7bccd9cf2f74.chunk.js.map index 4925f73d9..b54efd196 100644 --- a/public/2.db718300c1179401e843.chunk.js.map +++ b/public/2.53fa88cb7bccd9cf2f74.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/animation.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/components/transition.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/array.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/applyReplacements.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/number.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/whichChild.ts"],"names":["instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","resolve","animateSingle","tick","set","then","delete","createAnimationInstance","animate","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","target","that","args","id","undefined","el","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","element","parentElement","position","forceDirection","Static","forceDuration","axis","settings","animationsEnabled","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","RLottiePlayer","worker","options","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","Math","round","isMobile","max","noCache","Infinity","canvas","document","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","onDestroy","releaseCache","frame","r","g","b","length","frameNo","applyColor","applyInversing","data","putImageData","err","console","error","dispatchEvent","has","frInterval","delta","Date","now","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","time","compareVersion","v1","v2","split","s1","s2","STATE_VERSION","version","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","recentEmoji","topPeersCache","recentSearch","authState","_","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","emoji","big","themes","background","blur","slug","highlightningColor","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","ALL_KEYS","Object","keys","REFRESH_KEYS","log","logger","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","loadSavedState","rootScope","requestPeerSingle","myId","loaded","Promise","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","arr","state","value","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","forEach","idx","preserve","state_id","s","nightTheme","find","t","missingKey","result","newVersion","timeEnd","catch","first","direct","setKeyValueToStorage","peerId","limit","Set","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","size","appStateManager","accumulate","initialValue","reduce","acc","indexOfAndSplice","array","item","indexOf","spliced","findAndSpliceAll","verify","out","findIndex","forEachReverse","insertInDescendSortedArray","property","pos","sortProperty","next","len","unshift","filterUnique","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","Worker_fn","Worker","onerror","cleanup","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","arg","ArrayBuffer","buffer","COLORREPLACEMENTS","convert","min","applyReplacements","object","replacements","checkSmth","smth","ty","k","c","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","lottieLoader","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","Error","onPlayerLoaded","rlPlayer","debug","onLoad","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","text","arrayBuffer","invokeCrypto","str","newParams","assign","animationData","loadAnimationWorker","race","newAnimationData","JSON","parse","stringify","parseInt","container","initPlayer","addAnimation","loadFromData","numberThousandSplitter","x","joiner","parts","toString","replace","formatBytes","bytes","decimals","dm","floor","parseFloat","pow","toFixed","formatNumber","clamp","v","isInDOM","isConnected","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","fastSmoothScroll","className","onFirstMount","onMount","installed","body","setPage","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","observe","blurred","destroy","removeAnimation","animations","refreshGroup","findUpAsChild","parent","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","FocusDirection","margin","maxDistance","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","scrollTop","remainingPath","absPath","abs","duration","startAt","transition","shortTransition","longTransition","currentPath","elem","previousElementSibling"],"mappings":"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","file":"2.db718300c1179401e843.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { clamp } from \"../../helpers/number\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: string, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(jsonString: string) {\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else if(IS_SAFARI) {\n this.sendQuery('renderFrame', frameNo);\n } else {\n if(!this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as PostMessageOptions);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { pause } from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport applyReplacements from './applyReplacements';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data, true))\r\n } else {\r\n return res.text();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n const newParams = Object.assign(params, {animationData: str as string/* JSON.parse(str) */, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', toneIndex = -1): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n params.toneIndex = toneIndex;\r\n const newAnimationData = JSON.parse(params.animationData);\r\n applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport function numberThousandSplitter(x: number, joiner = ' ') {\r\n const parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n}\r\n\r\nexport function formatNumber(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0';\r\n\r\n const k = 1000;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['', 'K', 'M', 'B', 'T'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\r\n}\r\n\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : ((v > max) ? max : v);\r\n}\r\n\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n indexOfAndSplice(this.byGroups[group], player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(options).then(resolve);\r\n });\r\n });\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/animation.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/components/transition.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/helpers/array.ts","webpack:///./src/helpers/schedulers.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/applyReplacements.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/number.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/whichChild.ts"],"names":["instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","resolve","animateSingle","tick","set","then","delete","createAnimationInstance","animate","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","target","that","args","id","undefined","el","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","element","parentElement","position","forceDirection","Static","forceDuration","axis","settings","animationsEnabled","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","slideNavigation","prevTabContent","toRight","width","getBoundingClientRect","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","RLottiePlayer","worker","options","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","Math","round","isMobile","max","noCache","Infinity","canvas","document","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","onDestroy","releaseCache","frame","r","g","b","length","frameNo","applyColor","applyInversing","data","putImageData","err","console","error","dispatchEvent","has","frInterval","delta","Date","now","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","time","compareVersion","v1","v2","split","s1","s2","STATE_VERSION","version","BUILD","build","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","recentEmoji","topPeersCache","recentSearch","authState","_","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","emoji","big","themes","background","blur","slug","highlightningColor","theme","notifications","sound","timeFormat","toLocaleString","match","keepSigned","chatContextMenuHintWasShown","stateId","ALL_KEYS","Object","keys","REFRESH_KEYS","log","logger","neededPeers","singlePeerMap","storages","users","chats","dialogs","storagesResults","storage","stateStorage","loadSavedState","rootScope","requestPeerSingle","myId","loaded","Promise","storagesKeys","storagesPromises","map","getAll","promises","concat","sessionStorage","all","arr","state","value","pushToState","splice","auth","shift","shiftedWebKAuth","push","values","dcID","baseDcId","date","toPeerId","obj","forEach","idx","preserve","state_id","s","nightTheme","find","t","missingKey","result","newVersion","timeEnd","catch","first","direct","setKeyValueToStorage","peerId","limit","Set","keepPeerSingle","keepPeerIdSingle","requestPeer","existsPeerId","size","appStateManager","accumulate","initialValue","reduce","acc","indexOfAndSplice","array","item","indexOf","spliced","findAndSpliceAll","verify","out","findIndex","forEachReverse","insertInDescendSortedArray","property","pos","sortProperty","next","len","unshift","filterUnique","fastRafCallbacks","fastRaf","currentCallbacks","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","Worker_fn","Worker","onerror","cleanup","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","arg","ArrayBuffer","buffer","COLORREPLACEMENTS","convert","min","applyReplacements","object","replacements","checkSmth","smth","ty","k","c","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","lottieLoader","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","Error","onPlayerLoaded","rlPlayer","debug","onLoad","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","text","arrayBuffer","invokeCrypto","str","newParams","assign","animationData","loadAnimationWorker","race","newAnimationData","JSON","parse","stringify","parseInt","container","initPlayer","addAnimation","loadFromData","numberThousandSplitter","x","joiner","parts","toString","replace","formatBytes","bytes","decimals","dm","floor","parseFloat","pow","toFixed","formatNumber","clamp","v","isInDOM","isConnected","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","fastSmoothScroll","className","onFirstMount","onMount","installed","body","setPage","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","observe","blurred","destroy","removeAnimation","animations","refreshGroup","findUpAsChild","parent","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","FocusDirection","margin","maxDistance","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","containerRect","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","scrollTop","remainingPath","absPath","abs","duration","startAt","transition","shortTransition","longTransition","currentPath","elem","previousElementSibling"],"mappings":"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","file":"2.53fa88cb7bccd9cf2f74.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map = new Map();\r\n let animationDeferred: CancellablePromise;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport { clamp } from \"../../helpers/number\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: string, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map;\nclass RLottieCache {\n private cache: Map;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(jsonString: string) {\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else if(IS_SAFARI) {\n this.sendQuery('renderFrame', frameNo);\n } else {\n if(!this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\nimport type { MyTopPeer, TopPeerType, User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\nimport { IS_MOBILE } from '../../environment/userAgent';\nimport DATABASE_STATE from '../../config/databases/state';\nimport sessionStorage from '../sessionStorage';\nimport { nextRandomUint } from '../../helpers/random';\nimport compareVersion from '../../helpers/compareVersion';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n//const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: UserId[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23'\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32)\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS = ['contactsList', 'stateCreatedTime',\n 'maxSeenMsgId', 'filters', 'topPeers'] as any as Array;\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\n//const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise,\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map = new Map();\n\n public storages = {\n users: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'users'),\n chats: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'chats'),\n dialogs: new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'dialogs')\n };\n\n public storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n\n public storage = stateStorage;\n\n public newVersion: string;\n\n constructor() {\n super();\n this.loadSavedState();\n\n rootScope.addEventListener('user_auth', () => {\n this.requestPeerSingle(rootScope.myId, 'self');\n });\n }\n\n public loadSavedState(): Promise {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises/* : Promise[] */ = ALL_KEYS.map(key => stateStorage.get(key))\n .concat(sessionStorage.get('user_auth'), sessionStorage.get('state_id'))\n .concat(stateStorage.get('user_auth')) // support old webk format\n .concat(storagesPromises);\n\n Promise.all(promises).then(async(arr) => {\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map(key => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n let obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n \n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ? \n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} : \n auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n \n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n \n state = this.state = copy(STATE_INIT);\n \n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n for(const key in this.storagesResults) {\n this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n this.storage.set(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n \n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n };\n \n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(compareVersion(state.version, '0.8.7') === -1) {\n this.state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n this.state.filters = copy(STATE_INIT.filters);\n const result = this.storagesResults.dialogs;\n if(result?.length) {\n result.length = 0;\n }\n }\n \n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n this.newVersion = STATE_VERSION;\n }\n\n this.pushToState('version', STATE_VERSION);\n this.pushToState('build', BUILD);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.dispatchEvent('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key]) {\n this.storage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: PeerId, type: StatePeerType, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public requestPeerSingle(peerId: PeerId, type: StatePeerType, keepPeerIdSingle: PeerId = peerId) {\n return this.requestPeer(peerId, type + '_' + keepPeerIdSingle as any, 1);\n }\n\n public releaseSinglePeer(peerId: PeerId, type: StatePeerType) {\n return this.keepPeerSingle(NULL_PEER_ID, type + '_' + peerId as any);\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: PeerId, type: StatePeerType) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId && this.neededPeers.has(existsPeerId)) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n if(peerId) {\n this.singlePeerMap.set(type, peerId);\n } else {\n this.singlePeerMap.delete(type);\n }\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's schedulers\r\nimport { NoneToVoidFunction } from \"../types\";\r\n\r\n/*\r\nexport function throttleWithTickEnd(fn: F) {\r\n return throttleWith(onTickEnd, fn);\r\n}\r\n\r\nexport function throttleWithNow(fn: F) {\r\n return throttleWith(runNow, fn);\r\n}\r\n\r\nexport function onTickEnd(cb: NoneToVoidFunction) {\r\n Promise.resolve().then(cb);\r\n}\r\n\r\nfunction runNow(fn: NoneToVoidFunction) {\r\n fn();\r\n} */\r\n\r\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\r\nexport function fastRaf(callback: NoneToVoidFunction) {\r\n if(!fastRafCallbacks) {\r\n fastRafCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n const currentCallbacks = fastRafCallbacks!;\r\n fastRafCallbacks = undefined;\r\n currentCallbacks.forEach((cb) => cb());\r\n });\r\n } else {\r\n fastRafCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\r\nexport function fastRafConventional(callback: NoneToVoidFunction) {\r\n if(!fastRafConventionalCallbacks) {\r\n fastRafConventionalCallbacks = [callback];\r\n\r\n requestAnimationFrame(() => {\r\n processing = true;\r\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\r\n fastRafConventionalCallbacks[i]();\r\n }\r\n\r\n fastRafConventionalCallbacks = undefined;\r\n processing = false;\r\n });\r\n } else if(processing) {\r\n callback();\r\n } else {\r\n fastRafConventionalCallbacks.push(callback);\r\n }\r\n}\r\n\r\nlet rafPromise: Promise;\r\nexport function fastRafPromise() {\r\n if(rafPromise) return rafPromise;\r\n\r\n rafPromise = new Promise(requestAnimationFrame);\r\n rafPromise.then(() => {\r\n rafPromise = undefined;\r\n });\r\n\r\n return rafPromise;\r\n}\r\n\r\nexport function doubleRaf() {\r\n return new Promise((resolve) => {\r\n fastRaf(() => {\r\n fastRaf(resolve);\r\n });\r\n });\r\n}\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n }, transfer as PostMessageOptions);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337],\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f],\n ]\n];\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport { pause } from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport applyReplacements from './applyReplacements';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit, url: string): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data, true))\r\n } else {\r\n return res.text();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(str => {\r\n const newParams = Object.assign(params, {animationData: str as string/* JSON.parse(str) */, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', toneIndex = -1): Promise {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(toneIndex >= 1 && toneIndex <= 5) {\r\n /* params.animationData = copy(params.animationData);\r\n this.applyReplacements(params.animationData, toneIndex); */\r\n\r\n params.toneIndex = toneIndex;\r\n const newAnimationData = JSON.parse(params.animationData);\r\n applyReplacements(newAnimationData, toneIndex);\r\n params.animationData = JSON.stringify(newAnimationData);\r\n }\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n rlPlayer.clamped = frame;\r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport function numberThousandSplitter(x: number, joiner = ' ') {\r\n const parts = x.toString().split(\".\");\r\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\r\n return parts.join(\".\");\r\n}\r\n\r\nexport function formatBytes(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n}\r\n\r\nexport function formatNumber(bytes: number, decimals = 2) {\r\n if(bytes === 0) return '0';\r\n\r\n const k = 1000;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['', 'K', 'M', 'B', 'T'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\r\n}\r\n\r\nexport function clamp(v: number, min: number, max: number): number {\r\n return v < min ? min : ((v > max) ? max : v);\r\n}\r\n\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport { indexOfAndSplice } from \"../helpers/array\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n public observer: IntersectionObserver;\r\n private visible: Set = new Set();\r\n\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n\r\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n player.animation.clearCache();\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n for(const group in this.byGroups) {\r\n indexOfAndSplice(this.byGroups[group], player);\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n if(rootScope.idle.isIDLE) return;\r\n \r\n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n if(group && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n this.byGroups[group] = [];\r\n return;\r\n }\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n animations.forEach(player => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport { pause } from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = new Promise((resolve) => {\r\n fastRaf(() => {\r\n scrollWithJs(options).then(resolve);\r\n });\r\n });\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/25.92c7213c63e77acba97b.chunk.js b/public/25.ba804e71a7bf44cd8cd0.chunk.js similarity index 96% rename from public/25.92c7213c63e77acba97b.chunk.js rename to public/25.ba804e71a7bf44cd8cd0.chunk.js index 7c151061f..144bced9f 100644 --- a/public/25.92c7213c63e77acba97b.chunk.js +++ b/public/25.ba804e71a7bf44cd8cd0.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[25],{25:function(e,t,a){"use strict";a.r(t);var n=a(34),i=a(40),s=a(35),r=a(139),c=a(17),l=a(16),u=a(33),o=a(32),p=a(93),d=a(69),m=a(8),h=a(36);let b=null;const v=new d.a("page-signUp",!0,()=>Promise.all([a.e(7),a.e(5)]).then(a.bind(null,73)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=f.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.i18n)("YourName"))};const f=new i.b({label:"FirstName",maxLength:70}),w=new i.b({label:"LastName",maxLength:64}),y=Object(n.a)("btn-primary btn-color-primary"),E=new l.default.IntlElement({key:"StartMessaging"});return y.append(E.element),t.inputWrapper.append(f.container,w.container,y),f.input.addEventListener("input",L),w.input.addEventListener("input",L),y.addEventListener("click",(function(e){if(f.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!f.value.length)return f.input.classList.add("error"),!1;this.disabled=!0;const t=f.value.trim(),n=w.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(4).then(a.bind(null,19)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},93:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(16);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); -//# sourceMappingURL=25.92c7213c63e77acba97b.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[25],{25:function(e,t,a){"use strict";a.r(t);var n=a(34),i=a(40),s=a(35),r=a(139),c=a(17),l=a(16),u=a(33),o=a(32),p=a(93),d=a(69),m=a(8),h=a(36);let b=null;const v=new d.a("page-signUp",!0,()=>Promise.all([a.e(7),a.e(5)]).then(a.bind(null,74)).then(e=>{const t=new p.a({className:"page-signUp",withInputWrapper:!0,titleLangKey:"YourName",subtitleLangKey:"Login.Register.Subtitle"});t.imageDiv.classList.add("avatar-edit"),t.title.classList.add("fullName");const c=document.createElement("canvas");c.id="canvas-avatar",c.className="avatar-edit-canvas";const d=document.createElement("span");d.className="tgico tgico-cameraadd",t.imageDiv.append(c,d);const v=e.default;let g;t.imageDiv.addEventListener("click",()=>{(new r.a).open(c,e=>{g=e})});const L=e=>{const a=f.value||"",n=w.value||"",i=a||n?(a+" "+n).trim():"";i?Object(h.a)(t.title,o.b.wrapEmojiText(i)):Object(h.a)(t.title,Object(l.i18n)("YourName"))};const f=new i.b({label:"FirstName",maxLength:70}),w=new i.b({label:"LastName",maxLength:64}),y=Object(n.a)("btn-primary btn-color-primary"),E=new l.default.IntlElement({key:"StartMessaging"});return y.append(E.element),t.inputWrapper.append(f.container,w.container,y),f.input.addEventListener("input",L),w.input.addEventListener("input",L),y.addEventListener("click",(function(e){if(f.input.classList.contains("error")||w.input.classList.contains("error"))return!1;if(!f.value.length)return f.input.classList.add("error"),!1;this.disabled=!0;const t=f.value.trim(),n=w.value.trim(),i={phone_number:b.phone_number,phone_code_hash:b.phone_code_hash,first_name:t,last_name:n};E.update({key:"PleaseWait"});const r=Object(s.f)(this);u.a.invokeApi("auth.signUp",i).then(e=>{switch(e._){case"auth.authorization":u.a.setUser(e.user),new Promise((e,t)=>{if(!g)return e();g().then(a=>{v.uploadProfilePhoto(a).then(e,t)},t)}).finally(()=>{a.e(4).then(a.bind(null,19)).then(e=>{e.default.mount()})});break;default:E.update({key:e._}),this.removeAttribute("disabled"),r.remove()}}).catch(e=>{this.removeAttribute("disabled"),r.remove(),e.type,E.update({key:e.type})})})),Object(m.a)(),new Promise(e=>{window.requestAnimationFrame(e)})}),e=>{b=e,c.default.pushToState("authState",{_:"authStateSignUp",authCode:e})});t.default=v},93:function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var n=a(16);class i{constructor(e){this.element=document.body.querySelector("."+e.className),this.container=document.createElement("div"),this.container.className="container center-align",this.imageDiv=document.createElement("div"),this.imageDiv.className="auth-image",this.title=document.createElement("h4"),e.titleLangKey&&this.title.append(Object(n.i18n)(e.titleLangKey)),this.subtitle=document.createElement("p"),this.subtitle.className="subtitle",e.subtitleLangKey&&this.subtitle.append(Object(n.i18n)(e.subtitleLangKey)),this.container.append(this.imageDiv,this.title,this.subtitle),e.withInputWrapper&&(this.inputWrapper=document.createElement("div"),this.inputWrapper.className="input-wrapper",this.container.append(this.inputWrapper)),this.element.append(this.container)}}}}]); +//# sourceMappingURL=25.ba804e71a7bf44cd8cd0.chunk.js.map \ No newline at end of file diff --git a/public/25.92c7213c63e77acba97b.chunk.js.map b/public/25.ba804e71a7bf44cd8cd0.chunk.js.map similarity index 99% rename from public/25.92c7213c63e77acba97b.chunk.js.map rename to public/25.ba804e71a7bf44cd8cd0.chunk.js.map index c8e3f8adc..dec6b944a 100644 --- a/public/25.92c7213c63e77acba97b.chunk.js.map +++ b/public/25.ba804e71a7bf44cd8cd0.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"25.92c7213c63e77acba97b.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/pages/pageSignUp.ts","webpack:///./src/pages/loginPage.ts"],"names":["authCode","page","then","imported","className","withInputWrapper","titleLangKey","subtitleLangKey","imageDiv","classList","add","title","avatarPreview","document","createElement","id","addIco","append","appProfileManager","default","uploadAvatar","addEventListener","open","_uploadAvatar","handleInput","e","name","nameInputField","value","lastName","lastNameInputField","fullName","trim","wrapEmojiText","label","maxLength","btnSignUp","btnI18n","IntlElement","key","element","inputWrapper","container","input","contains","length","this","disabled","params","phone_number","phone_code_hash","first_name","last_name","update","preloader","invokeApi","response","_","setUser","user","Promise","resolve","reject","inputFile","uploadProfilePhoto","finally","m","mount","removeAttribute","remove","catch","err","type","window","requestAnimationFrame","_authCode","pushToState","LoginPage","options","body","querySelector","subtitle"],"mappings":"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","file":"25.ba804e71a7bf44cd8cd0.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport type { InputFile } from '../layer';\r\nimport type { AuthState } from '../types';\r\nimport Button from '../components/button';\r\nimport InputField from '../components/inputField';\r\nimport { putPreloader } from '../components/misc';\r\nimport PopupAvatar from '../components/popups/avatar';\r\nimport appStateManager from '../lib/appManagers/appStateManager';\r\nimport I18n, { i18n } from '../lib/langPack';\r\n//import apiManager from '../lib/mtproto/apiManager';\r\nimport apiManager from '../lib/mtproto/mtprotoworker';\r\nimport RichTextProcessor from '../lib/richtextprocessor';\r\nimport LoginPage from './loginPage';\r\nimport Page from './page';\r\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\r\nimport replaceContent from '../helpers/dom/replaceContent';\r\n\r\nlet authCode: AuthState.signUp['authCode'] = null;\r\n\r\nconst onFirstMount = () => import('../lib/appManagers/appProfileManager').then(imported => {\r\n const page = new LoginPage({\r\n className: 'page-signUp',\r\n withInputWrapper: true,\r\n titleLangKey: 'YourName',\r\n subtitleLangKey: 'Login.Register.Subtitle'\r\n });\r\n\r\n page.imageDiv.classList.add('avatar-edit');\r\n\r\n page.title.classList.add('fullName');\r\n\r\n const avatarPreview = document.createElement('canvas');\r\n avatarPreview.id = 'canvas-avatar';\r\n avatarPreview.className = 'avatar-edit-canvas';\r\n\r\n const addIco = document.createElement('span');\r\n addIco.className = 'tgico tgico-cameraadd';\r\n\r\n page.imageDiv.append(avatarPreview, addIco);\r\n \r\n const appProfileManager = imported.default;\r\n\r\n let uploadAvatar: () => CancellablePromise;\r\n page.imageDiv.addEventListener('click', () => {\r\n new PopupAvatar().open(avatarPreview, (_uploadAvatar) => {\r\n uploadAvatar = _uploadAvatar;\r\n });\r\n });\r\n\r\n const handleInput = (e: Event) => {\r\n const name = nameInputField.value || '';\r\n const lastName = lastNameInputField.value || '';\r\n\r\n const fullName = name || lastName \r\n ? (name + ' ' + lastName).trim() \r\n : '';\r\n \r\n if(fullName) replaceContent(page.title, RichTextProcessor.wrapEmojiText(fullName));\r\n else replaceContent(page.title, i18n('YourName'));\r\n };\r\n\r\n let sendAvatar = () => new Promise((resolve, reject) => {\r\n if(!uploadAvatar) {\r\n //console.log('User has not selected avatar');\r\n return resolve();\r\n }\r\n\r\n //console.log('invoking uploadFile...');\r\n uploadAvatar().then((inputFile) => {\r\n //console.log('uploaded smthn', inputFile);\r\n \r\n appProfileManager.uploadProfilePhoto(inputFile).then(resolve, reject);\r\n }, reject);\r\n });\r\n\r\n const nameInputField = new InputField({\r\n label: 'FirstName',\r\n maxLength: 70\r\n });\r\n\r\n const lastNameInputField = new InputField({\r\n label: 'LastName',\r\n maxLength: 64\r\n });\r\n\r\n const btnSignUp = Button('btn-primary btn-color-primary');\r\n const btnI18n = new I18n.IntlElement({key: 'StartMessaging'});\r\n btnSignUp.append(btnI18n.element);\r\n\r\n page.inputWrapper.append(nameInputField.container, lastNameInputField.container, btnSignUp);\r\n\r\n nameInputField.input.addEventListener('input', handleInput);\r\n lastNameInputField.input.addEventListener('input', handleInput);\r\n\r\n btnSignUp.addEventListener('click', function(this: typeof btnSignUp, e) {\r\n if(nameInputField.input.classList.contains('error') || lastNameInputField.input.classList.contains('error')) {\r\n return false;\r\n }\r\n\r\n if(!nameInputField.value.length) {\r\n nameInputField.input.classList.add('error');\r\n return false;\r\n }\r\n\r\n this.disabled = true;\r\n\r\n const name = nameInputField.value.trim();\r\n const lastName = lastNameInputField.value.trim();\r\n\r\n const params = {\r\n phone_number: authCode.phone_number,\r\n phone_code_hash: authCode.phone_code_hash,\r\n first_name: name,\r\n last_name: lastName\r\n };\r\n\r\n //console.log('invoking auth.signUp with params:', params);\r\n\r\n btnI18n.update({key: 'PleaseWait'});\r\n const preloader = putPreloader(this);\r\n\r\n apiManager.invokeApi('auth.signUp', params)\r\n .then((response) => {\r\n //console.log('auth.signUp response:', response);\r\n \r\n switch(response._) {\r\n case 'auth.authorization': // success\r\n apiManager.setUser(response.user);\r\n\r\n sendAvatar().finally(() => {\r\n import('./pageIm').then(m => {\r\n m.default.mount();\r\n });\r\n });\r\n \r\n break;\r\n default:\r\n btnI18n.update({key: response._ as any});\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n break;\r\n }\r\n\r\n /* (document.body.getElementsByClassName('page-sign')[0] as HTMLDivElement).style.display = 'none';\r\n pageAuthCode(Object.assign(code, {phoneNumber})); */\r\n }).catch(err => {\r\n this.removeAttribute('disabled');\r\n preloader.remove();\r\n\r\n switch(err.type) {\r\n default:\r\n btnI18n.update({key: err.type});\r\n break;\r\n }\r\n });\r\n });\r\n\r\n blurActiveElement();\r\n return new Promise((resolve) => {\r\n window.requestAnimationFrame(resolve);\r\n });\r\n});\r\n\r\nconst page = new Page('page-signUp', true, onFirstMount, (_authCode: typeof authCode) => {\r\n authCode = _authCode;\r\n\r\n appStateManager.pushToState('authState', {_: 'authStateSignUp', authCode: _authCode});\r\n});\r\n\r\nexport default page;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { LangPackKey, i18n } from \"../lib/langPack\";\r\n\r\nexport default class LoginPage {\r\n public element: HTMLElement;\r\n public container: HTMLElement;\r\n public imageDiv: HTMLElement;\r\n public inputWrapper: HTMLElement;\r\n public title: HTMLElement;\r\n public subtitle: HTMLParagraphElement;\r\n\r\n constructor(options: {\r\n className: string,\r\n withInputWrapper?: boolean,\r\n titleLangKey?: LangPackKey,\r\n subtitleLangKey?: LangPackKey,\r\n }) {\r\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\r\n //this.element = document.createElement('div');\r\n //this.element.className = 'page-' + options.className;\r\n\r\n this.container = document.createElement('div');\r\n this.container.className = 'container center-align';\r\n\r\n this.imageDiv = document.createElement('div');\r\n this.imageDiv.className = 'auth-image';\r\n\r\n this.title = document.createElement('h4');\r\n if(options.titleLangKey) {\r\n this.title.append(i18n(options.titleLangKey));\r\n }\r\n\r\n this.subtitle = document.createElement('p');\r\n this.subtitle.className = 'subtitle';\r\n if(options.subtitleLangKey) {\r\n this.subtitle.append(i18n(options.subtitleLangKey));\r\n }\r\n \r\n this.container.append(this.imageDiv, this.title, this.subtitle);\r\n\r\n if(options.withInputWrapper) {\r\n this.inputWrapper = document.createElement('div');\r\n this.inputWrapper.className = 'input-wrapper';\r\n this.container.append(this.inputWrapper);\r\n }\r\n\r\n this.element.append(this.container);\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/5.65a3414c4ad3195165a3.chunk.js b/public/5.4c631eb421e5df7ab421.chunk.js similarity index 95% rename from public/5.65a3414c4ad3195165a3.chunk.js rename to public/5.4c631eb421e5df7ab421.chunk.js index a6100f806..aeb9a45d7 100644 --- a/public/5.65a3414c4ad3195165a3.chunk.js +++ b/public/5.4c631eb421e5df7ab421.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[5],Array(41).concat([function(e,t,a){"use strict";var s=a(29),n=a(39),i=a(45),r=a(134);function o(e){return e&&e.toLowerCase()||""}var p=a(59),d=a(85),c=a(31),l=a(16),m=a(33),g=a(47),h=a(78),u=a(32),y=a(15),f=a(123),_=a(74),v=a(51),P=a(43),b=a(17);const I=new class{constructor(){this.storage=b.default.storages.users,this.updateUsersStatuses=()=>{const e=Object(p.h)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),y.default.addEventListener("state_synchronized",this.updateUsersStatuses),y.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=h.a.serverTimeOffset),"was_online"in a.status&&(a.status.was_online-=h.a.serverTimeOffset)),y.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserPhoto:e=>{var t;const a=e.user_id,s=this.users[a];if(s){if((null===(t=s.photo)||void 0===t?void 0:t.photo_id)===e.photo.photo_id)return;this.forceUserOnline(a,e.date),"userProfilePhotoEmpty"===e.photo._?delete s.photo:s.photo=Object(c.i)(s.photo,e.photo),this.setUserToStateIfNeeded(s),y.default.dispatchEvent("user_update",a),y.default.dispatchEvent("avatar_update",a.toPeerId())}else console.warn("No user by id:",a)},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign({},a,{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),y.default.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),b.default.getState().then(e=>{const t=b.default.storagesResults.users;if(t.length)for(let e=0,a=t.length;e{this.pushContact(e)}),a.length&&(this.contactsFillPromise=Object(i.a)(),this.contactsFillPromise.resolve(this.contactsList))),b.default.addEventListener("peerNeeded",e=>{if(!P.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),b.default.addEventListener("peerUnneeded",e=>{if(!P.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=b.default.storagesResults.users;for(const t in this.users){if(!t)continue;const a=t.toPeerId();if(!b.default.isPeerNeeded(a)){const a=this.users[t];a.username&&delete this.usernames[o(a.username)],e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];b.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(i.a)();return m.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):m.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>(this.saveApiUsers(e.users),v.a.saveApiChats(e.chats),P.a.getPeer(P.a.getPeerId(e.peer))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),b.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),b.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?l.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then(s=>{let i=[...s];if(e){const t=this.contactsIndex.search(e);i=[...i].filter(e=>t.has(e))}"name"===a?i.sort((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)}):"online"===a&&i.sort((e,t)=>{const a=I.getUserStatusForSort(I.getUser(e).status);return I.getUserStatusForSort(I.getUser(t).status)-a});const r=y.default.myId.toUserId();return Object(n.e)(i,r),t&&this.testSelfSearch(e)&&i.unshift(r),i})}getContactsPeerIds(e,t,a){return this.getContacts(e,t,a).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return m.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:P.a.getInputPeerById(e)}).then(a=>(a&&_.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:P.a.getOutputPeer(e),blocked:t}),a))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new f.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=o(t.username);delete this.usernames[e]}if(e.username){const t=o(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;if(this.setUserNameToCache(e,i),i&&void 0!==i.initials&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName,e.initials=i.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(r.b)(t,!1),e.initials=u.a.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=h.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=h.a.serverTimeOffset));let o=!1,p=!1;if(void 0===i)this.users[n]=e;else{e.first_name===i.first_name&&e.last_name===i.last_name&&e.username===i.username||(p=!0);(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(o=!0);const t=!!i.pFlags.contact,r=!!e.pFlags.contact;Object(c.i)(i,e),y.default.dispatchEvent("user_update",n),t!==r&&this.onContactUpdated(n,r,t)}o&&y.default.dispatchEvent("avatar_update",e.id.toPeerId()),p&&y.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){b.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(d.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(c.f)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(y.default.myId)}getUserStatusString(e){var t;let a,s;switch(e){case g.d:a="Peer.RepliesNotifications";break;case g.e:a="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){a="Bot";break}const n=this.getUser(e);if(!n){a="";break}if(n.pFlags.support){a="SupportStatus";break}switch(null===(t=n.status)||void 0===t?void 0:t._){case"userStatusRecently":a="Lately";break;case"userStatusLastWeek":a="WithinAWeek";break;case"userStatusLastMonth":a="WithinAMonth";break;case"userStatusOffline":{const e=n.status.was_online,t=new Date,i=(t.getTime()/1e3|0)-e;if(i<60)a="Peer.Status.justNow";else if(i<3600){a="Peer.Status.minAgo";s=[i/60|0]}else if(i<86400&&t.getDate()===new Date(1e3*e).getDate()){a="LastSeen.HoursAgo";s=[i/3600|0]}else{a="Peer.Status.LastSeenAt";const{dateEl:t,timeEl:n}=Object(p.e)(e);s=[t,n]}break}case"userStatusOnline":a="Online";break;default:a="ALongTimeAgo"}break}}return Object(l.i18n)(a,s)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==y.default.myId}hasUser(e,t){const a=this.users[e];return Object(c.f)(a)&&(t||!a.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==g.d}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(p.h)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(_.a.updatesState.syncLoading)return;const s=this.getUser(e);s&&s.status&&"userStatusOnline"!==s.status._&&"userStatusEmpty"!==s.status._&&!s.pFlags.support&&!s.pFlags.deleted&&(s.status={_:"userStatusOnline",expires:a+60},y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let a=0;a{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=b.default.getState().then(t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:m.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),v.a.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map(e=>{const t=P.a.getPeerId(e.peer);return b.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},b.default.pushToState("topPeersCache",t.topPeersCache),s})})}getBlocked(e=0,t=0){return m.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),v.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return m.a.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then(e=>(_.a.processUpdateMessage(e),e))}searchContacts(e,t=20){return m.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),v.a.saveApiChats(e.chats);return{my_results:Object(n.b)(e.my_results.map(e=>P.a.getPeerId(e))),results:e.results.map(e=>P.a.getPeerId(e))}})}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),y.default.dispatchEvent("contacts_update",e))}updateUsername(e){return m.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:Object(p.h)(!0)}:{_:"userStatusOnline",expires:Object(p.h)(!0)+50};a.status=s,y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}addContact(e,t,a,s,n){return m.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return m.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}};s.a.appUsersManager=I;t.a=I},function(e,t,a){"use strict";var s=a(84),n=a(112),i=a(45),r=a(59),o=a(113),p=a(31),d=a(61),c=a(88),l=a(16),m=a(37),g=a(33),h=a(145),u=a(78),y=a(32),f=a(15),_=a(123),v=a(39),P=a(135),b=a(47),I=a(2),S=a(92);class C{constructor(e,t,a,s,n,i,r,o,p,d){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=a,this.appUsersManager=s,this.appDraftsManager=n,this.appNotificationsManager=i,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=p,this.appMessagesIdsManager=d,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog(i)),this.appMessagesManager.scheduleHandleNewDialogs(n,i)})},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=e=>{this.pinnedOrders[a].length=0,e.reverse(),e.forEach(e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):g.a.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then(e=>{this.applyDialogs(e),s(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),f.default.addEventListener("language_change",()=>{const e=s.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=a.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const c=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a="index_"+e.orderIndex;for(let e=0;e{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)}),f.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;t.length&&S.a.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{}})}setDialogsFromState(e){for(let t=0,a=e.length;tvoid 0===e.migratedTo):a.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,a){var s;let n;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);n=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinned_peers.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=n}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):s.push(this.getFolderDialogs(t,!1));for(let t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId),i=s[n],r=i&&i[a],o=this.setDialogIndexInFilter(e,a,t);r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&Object(v.f)(s,e,a,n))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.appMessagesManager.filtersStorage.filters;for(const s in a){const n=a[s];this.appMessagesManager.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=a-s,i=a&&!s||!a&&s?s?-1:1:0;this.modifyFolderUnreadCount(e,n,i)};this.modifyFolderUnreadCount(e,a?s:-s,s?a?1:-1:0)}modifyFolderUnreadCount(e,t,a){if(!t&&!a)return;const s=this.getFolder(e);t&&(s.unreadMessagesCount=Math.max(0,s.unreadMessagesCount+t)),a&&(s.unreadDialogsCount=Math.max(0,s.unreadDialogsCount+a)),void 0===s.dispatchUnreadTimeout&&(s.dispatchUnreadTimeout=I.a.setTimeout(()=>{s.dispatchUnreadTimeout=void 0,f.default.dispatchEvent("folder_unread",s)},0))}generateIndexForDialog(e,t=!1,a){var s;let n,i=0;if(e.pFlags.pinned&&!t)i=this.generateDialogPinnedDate(e),n=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),i=a.date||i;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!i||e.date&&e.date>i)&&(i=e.date)}"draftMessage"===(null===(s=e.draft)||void 0===s?void 0:s._)&&e.draft.date>i&&(i=e.draft.date)}i||(i=Object(r.h)(!0));const o=this.generateDialogIndex(i,n);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],a=t.indexOf(e.peerId);let s=a;return-1===a&&(s=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(s)}setDialogToState(e){const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;ee.peerId===i);if(-1!==o&&r.splice(o,1),this.dialogs[i]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(s){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(a,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const a=this.appPeersManager.getPeerId(e.peer);let s=e.top_message;const n=this.appMessagesManager.pendingTopMsgs[a];n&&(!s||this.appMessagesManager.getMessageByPeer(a,n).date>this.appMessagesManager.getMessageByPeer(a,s).date)&&(e.top_message=s=n,this.appMessagesManager.getHistoryStorage(a).maxId=n),s||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[a]=e):this.dropDialogWithEvent(a);const i=this.appMessagesManager.newUpdatesAfterReloadToHandle[a];if(void 0!==i){for(const e of i)i.delete(e),this.apiUpdatesManager.saveUpdate(e);i.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[a]}}),Object.keys(t).length&&f.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():b.c;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const c=this.getDialogOnly(r);let l,m;if(e.top_message){l=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==c?void 0:c.top_message)&&this.appMessagesManager.getMessageByPeer(r,c.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&c.top_message>=l&&(l=c.top_message),m=this.appMessagesManager.getMessageByPeer(r,l)}else l=this.appMessagesManager.generateTempMessageId(r),m={_:"message",id:l,mid:l,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([m],{isOutgoing:!0});if((null==m?void 0:m.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,m),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=l,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_inbox_max_id?c.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_outbox_max_id?c.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=c?c.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,m.pFlags.is_outgoing){const t=m.pFlags.out;l>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(m.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete m.pFlags.unread}const g=this.appMessagesManager.getHistoryStorage(r),h=g.history.slice;if(h.length){if(!h.isEnd(P.a.Bottom)){g.history.insertSlice([l]).setEnd(P.a.Bottom),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,m)&&f.default.dispatchEvent("history_reply_markup",{peerId:r})}}else g.history.unshift(l),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,m)&&f.default.dispatchEvent("history_reply_markup",{peerId:r});g.maxId=l,g.readMaxId=e.read_inbox_max_id,g.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(p.c)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),c&&Object(p.i)(c,e),this.pushDialog(e,m.date,a,s)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,a=20,s=0,n=!1){const i={};if(s>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const p=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(s);if(p&&r.push(p),r.length)return i.cached=!1,i.promise=Promise.all(r).then(()=>this.getDialogs(e,t,a,s,n).promise),i}const r=s>1||this.getOffsetDate(s)?void 0:s;let o=this.getFolderDialogs(s,n);const p=this.getDialogIndexKey(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort((e,t)=>t[p]-e[p]),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let d=0;if(t>0)for(let e=o.length;do[d][p]);++d);const c=this.isDialogsLoaded(r),l=o.length>=d+a;if(e||c||l){const s=o.slice(d,d+a);return i.cached=!0,i.promise=Promise.resolve({dialogs:s,count:c?o.length:null,isTopEnd:o.length&&(s[0]&&s[0]===o[0]||o[0][p]=o.length}),i}return i.cached=!1,i.promise=this.appMessagesManager.getTopMessages(a,r).then(e=>{if(n&&(o=this.getFolderDialogs(s,n)),d=0,t>0)for(let e=o.length;do[d][p]);++d);const i=o.slice(d,d+a);return{dialogs:i,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][p]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const a=this.filters[e];delete a.orderIndex,this.setOrderIndex(a)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(!0),this.filters={},this.appStateManager.getState().then(e=>{Object(p.i)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(p.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const a in t){const t=+a;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e?(this.filters={},this.reloadedPeerIds=new Set):(Object(p.i)(this.filters,{}),this.reloadedPeerIds.clear()),this.orderIndex=1}testDialogForFilter(e,t){const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&1===e.folder_id)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(a)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(p.a)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return g.a.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.orderIndex,t.push(a)}e.orderIndex=1;const a=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s})}getOutputDialogFilter(e){const t=Object(p.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(v.d)(e.includePeerIds,(t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))})}reloadMissingPeerIds(e,t="pinned_peers"){const a=[],s=this.getFilter(e),n=s&&s[t];if(null==n?void 0:n.length){const e=n.filter((e,t)=>{const a=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(a)&&!this.appMessagesManager.getDialogOnly(a)});if(e.length){const t=e.map(e=>{const t=this.appPeersManager.getPeerId(e),a=this.appMessagesManager.reloadConversation(e);return a.then(()=>{this.reloadedPeerIds.add(t)}),a}),s=Promise.all(t);a.push(s)}}return a.length?Promise.all(a):void 0}getDialogFilters(e=!1){return M(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const a=yield g.a.invokeApiSingle("messages.getDialogFilters");for(const t of a)this.saveDialogFilter(t,e);return a}))}saveDialogFilter(e,t=!0){w.forEach(([t,a])=>{e[a]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const a=this.filters[e.id];a?Object.assign(a,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):a||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var A=a(74),E=a(51),T=a(75),D=a(72),U=a(43),x=a(55),O=a(136),F=a(17),R=a(41),B=a(160),V=a(125),j=a(115),L=a(73),N=a(29),q=a(105),G=a(52),H=a(146),z=a(94),W=a(168),K=a(116),$=a(24),J=a(117),Q=a(91),X=a(104),Y=a(161),Z=a(169),ee=a(126),te=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ae=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new s.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(m.b)("MESSAGES",m.a.Error|m.a.Debug|m.a.Log|m.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,f.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const a in t){const s=t[a];s?(this.dialogsStorage.pushDialog(s),U.a.isChannel(a.toPeerId())||(e=Math.max(e,s.top_message||0))):(this.reloadConversation(a.toPeerId()),delete t[a])}0!==e&&this.incrementMaxSeenId(e),f.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(f.default.peerId===t&&!f.default.idle.isIDLE)continue;const a=this.notificationsToHandle[t];Promise.all([q.a.getNotifyPeerTypeSettings(),q.a.getNotifySettings(U.a.getInputNotifyPeerById(t,!0))]).then(([e,s])=>{const n=a.topMessage;!q.a.isPeerLocalMuted(t,!0)&&n.pFlags.unread&&n.pFlags.unread&&this.notifyAboutMessage(n,{fwdCount:a.fwdCount,peerTypeNotifySettings:s})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=X.a.generateMessageId(e.id),p=this.getMessageFromStorage(r,o);p.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach(e=>{e.history.delete(n)}),this.finalizePendingMessageCallbacks(r,n,p))}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:new Map});const o=this.getThreadKey(a),p=o?+o.split("_")[1]:void 0;if(p&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][p]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if(!i&&!r){let a=!0;if(s.isAnyChat()&&(a=E.a.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n});const d=this.checkPendingMessage(a),c=this.getHistoryStorage(s,r?p:void 0);r||this.updateMessageRepliesIfNeeded(a);const l=e.ignoreExisting;if(!!c.history.findSlice(a.mid)){if(!l)return!1}else{const e=c.history.first;if(e.isEnd(P.a.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else c.history.unshift(a.mid);null!==c.count&&c.count++}this.mergeReplyKeyboard(c,a)&&f.default.dispatchEvent("history_reply_markup",{peerId:s});const m=a.fromId;if(m.isUser()&&!a.pFlags.out&&a.from_id){R.a.forceUserOnline(m,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:m}:U.a.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:U.a.getOutputPeer(m),top_msg_id:p?X.a.getServerMessageId(p):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:U.a.getOutputPeer(m)},A.a.processLocalUpdate(t)}if(d||this.handleNewMessage(s,a.mid),r)return;const g=!a.pFlags.out&&a.pFlags.unread;if(i){if(g&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(g){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:b.c}),t.fromId!==m&&(t.fromId=m,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateDialogUnreadMark=e=>{const t=U.a.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),f.default.dispatchEvent("dialogs_multiupdate",{[t]:a}),this.dialogsStorage.setDialogToState(a)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=X.a.generateMessageId(t.id),n=this.getMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&f.default.dispatchEvent("dialog_flush",{peerId:a});else if(f.default.dispatchEvent("message_edit",{storage:n,peerId:a,mid:s}),p||t.grouped_id){const e={};e[a]=o,f.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=X.a.generateMessageId(e.max_id||e.read_max_id),s=X.a.generateMessageId(e.top_msg_id),n=t?t.toPeerId(!0):U.a.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(n),o=Object(p.e)(r,"desc"),d=this.getDialogOnly(n),c=e.still_unread_count;let l=0,m=0,g=!1;const h=this.getHistoryStorage(n,s);if(n.isUser()&&i&&R.a.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const u=!s&&d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);for(let e=0,t=o.length;ea)continue;const p=r.get(t);if(p.pFlags.out===i){if(!p.pFlags.unread)break;if(s){const e=p.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}p.pFlags.unread&&(delete p.pFlags.unread,g||(g=!0),p.pFlags.out||s||!d||(void 0===c&&(l=--d.unread_count),p.pFlags.mentioned&&(m=--d.unread_mentions_count,this.modifyCachedMentions(n,p.mid,!1))),q.a.cancel("msg"+t))}}if(i?h.readOutboxMaxId=a:h.readMaxId=a,!s&&d){if(i?d.read_outbox_max_id=a:d.read_inbox_max_id=a,!i){let e;void 0!==c?e=c:l<0||!this.getReadMaxIdIfUnread(n)?e=0:l&&d.top_message>a&&(e=l),void 0!==e&&(d.unread_count=e),(m<0||!d.unread_count)&&(d.unread_mentions_count=0)}u&&u(),this.dialogsStorage.processDialogForFilters(d),f.default.dispatchEvent("dialog_unread",{peerId:n}),this.dialogsStorage.setDialogToState(d)}if(g&&f.default.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");f.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.messages.map(e=>X.a.generateMessageId(e)),s=t?t.toPeerId(!0):this.getMessageById(a[0]).peerId;for(let e=0,t=a.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=X.a.generateMessageId(e.available_min_id),n=a.filter(e=>e<=s);e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,a=e.messages.map(e=>X.a.generateMessageId(e)),s=t?t.toPeerId(!0):this.getMessageById(a[0]).peerId;if(!s)return;g.a.clearCache("messages.getSearchCounters",e=>U.a.getPeerId(e.peer)===s);const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getMessagesStorage(s),a),r=Array.from(n).map(e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}),o=this.getHistoryStorage(s);[o].concat(r).forEach(e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))}),f.default.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),f.default.dispatchEvent("dialog_unread",{peerId:s})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(P.a.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=E.a.getChat(t),n=E.a.isInChat(t);(!!s.username||!s.pFlags.left)!==(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],f.default.dispatchEvent("history_forbidden",a));!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a))},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{f.default.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=X.a.generateMessageId(e.id),n=this.getMessageByPeer(a,s);!n.deleted&&void 0!==n.views&&n.views{const t=b.e,a=t,s=this.generateTempMessageId(a),n={_:"message",id:s,from_id:U.a.getOutputPeer(t),peer_id:U.a.getOutputPeer(a),pFlags:{unread:!0},date:(e.inbox_date||Object(r.h)(!0))+u.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};R.a.hasUser(t)||R.a.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([n],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[a]=s,this.onUpdateNewMessage({_:"updateNewMessage",message:n,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):U.a.getPeerId(e.peer),s=e.messages.map(e=>X.a.generateMessageId(e)),n=this.getMessagesStorage(a),i=s.filter(e=>!n.has(e));(i.length?Promise.all(i.map(e=>this.wrapSingleMessage(a,e))):Promise.resolve()).finally(()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s){n.get(e).pFlags.pinned=!0}else for(const e of s){delete n.get(e).pFlags.pinned}delete this.pinnedMessages[a],F.default.getState().then(e=>{delete e.hiddenPinnedMessages[a],f.default.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e;if("notifyPeer"===t._){const e=U.a.getPeerId(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,f.default.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(s){const e=X.a.generateMessageId(t.id),n=this.getMessageFromStorage(s,e);this.saveMessages([t],{storage:s,isScheduled:!0});const i=this.getMessageFromStorage(s,e);if(n.deleted){this.checkPendingMessage(t)||f.default.dispatchEvent("scheduled_new",{peerId:a,mid:t.mid})}else this.handleEditedMessage(n,i),f.default.dispatchEvent("message_edit",{storage:s,peerId:a,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=U.a.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map(e=>X.a.generateMessageId(e));this.handleDeletedMessages(t,a,s),f.default.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.clear(),f.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),f.default.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>U.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach(e=>{f.default.dispatchEvent("dialog_notify_settings",e)})}),f.default.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:B.a.getWebPage(e)},f.default.dispatchEvent("message_edit",{storage:n,peerId:t,mid:a}))})}),f.default.addEventListener("draft_updated",({peerId:e,threadId:t,draft:a})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||X.a.getServerMessageId(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),f.default.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a,index:s.index})}}else this.reloadConversation(e)}),f.default.addEventListener("poll_update",({poll:e})=>{const t=O.a.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);this.setDialogToStateIfMessageIsTop(s)}}),F.default.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)})}clear(){this.middleware?this.middleware.clean():this.middleware=Object(J.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new k(this,U.a,R.a,q.a,F.default,A.a,f.default),this.dialogsStorage=new C(this,E.a,U.a,R.a,V.a,q.a,F.default,A.a,u.a,X.a)}getInputEntities(e){const t=Object(p.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=R.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,a){var s,n;const r=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:Object(i.a)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",e=>this.editMessage(e,t,a));let i=a.entities||[];t&&(t=y.a.parseMarkdown(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return g.a.invokeApi("messages.editMessage",{peer:U.a.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then(e=>{A.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,a={}){if(!t.trim())return Promise.resolve();a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const s=f.default.config.message_length_max;if(t.length>s){const n=Object(c.g)(t,s);t=n[0],n.length>1&&delete a.webPage;for(let t=1;t{this.sendText(e,n[t],a)},t)}e=U.a.getPeerMigratedTo(e)||e;let n=a.entities||[];a.viaBotId||(t=y.a.parseMarkdown(t,n));let i=this.getInputEntities(n);i.length||(i=void 0);const r=this.generateOutgoingMessage(e,a);r.entities=n,r.message=t;const o=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0,d=U.a.isChannel(e);a.webPage&&(r.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{e?r.error=!0:delete r.error,f.default.dispatchEvent("messages_pending")};return r.send=()=>{l(!1);const s={};let n;return this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId),n=a.viaBotId?g.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft},s):g.a.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:U.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:i,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent},s),this.pendingAfterMsgs[e]=s,n.then(e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const s=Object(p.a)(r);r.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":d?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});A.a.processUpdateMessage(e),r.promise.resolve()},e=>{l(!0),r.promise.reject(e)}).finally(()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),r.promise}sendFile(e,t,a={}){e=U.a.getPeerMigratedTo(e)||e;const s=this.generateOutgoingMessage(e,a),r=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let p,d;const c="mime_type"in t?t.mime_type:t.type,l=t instanceof File?t.name:"",m=!(t instanceof File||t instanceof Blob);let h=a.caption||"";this.log("sendFile",t,c);const u=a.entities||[];h&&(h=y.a.parseMarkdown(h,u));const _=[],v=Y.a.has(c);let P,b,I;if(m)p="document",d="";else if(0===c.indexOf("audio/")||["video/ogg"].indexOf(c)>=0){p="audio",d="audio."+("ogg"===c.split("/")[1]?"ogg":"mp3"),I="sendMessageUploadAudioAction",a.isVoiceMessage&&(p="voice",s.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};_.push(e)}else if(a.isMedia)if(v){p="photo",d="photo."+c.split("/")[1],I="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:"full",location:null,size:t.size};P={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=D.a.getCacheContext(P,e.type);n.downloaded=t.size,n.url=a.objectURL||"",P=x.a.savePhoto(P)}else if(Z.a.has(c)){p="video",d="video.mp4",I="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};_.push(e),a.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else p="document",d="document."+c.split("/")[1],I="sendMessageUploadDocumentAction";else p="document",d="document."+c.split("/")[1],I="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:l||d}),-1!==["document","video","audio","voice"].indexOf(p)&&!m){const e=[];b={_:"document",id:""+s.id,duration:a.duration,attributes:_,w:a.width,h:a.height,thumbs:e,mime_type:c,size:t.size};const n=D.a.getCacheContext(b);let i;if(n.downloaded=t.size,n.url=a.objectURL||"",v)_.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),i={_:"photoSize",w:a.width,h:a.height,type:"full",size:t.size};else if("video"===p&&a.thumb){i={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=D.a.getCacheContext(b,i.type);e.downloaded=i.size,e.url=a.thumb.url}i&&e.push(i),b=T.a.saveDoc(b)}this.log("sendFile",p,d,t.type,a);const S=m?void 0:new n.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),C=Object(i.a)();S&&(S.attachPromise(C),C.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",C.reject(e)},C.catch(t=>{"AbortError"!==t.name||k||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==E?void 0:E.cancel)&&E.cancel())}));const M=m?void 0:{_:P?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:S,photo:P,document:b,promise:C};s.entities=u,s.message=h,s.media=m?{_:"messageMediaDocument",pFlags:{},document:t}:M;const w=e=>{e?s.error=!0:delete s.error,f.default.dispatchEvent("messages_pending")};let k=!1,E=null;return s.send=()=>{if(m){const{id:e,access_hash:a,file_reference:s}=t,n={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:a,file_reference:s}};C.resolve(n)}else if(t instanceof File||t instanceof Blob){const n=()=>{let n;return k&&!s.error||(k=!1,E=D.a.upload(t),C.notifyAll({done:0,total:t.size})),"video"===p&&a.objectURL&&(n=new Promise((e,t)=>{(a.thumb&&a.thumb.blob?Promise.resolve(a.thumb):Object(o.a)(a.objectURL)).then(a=>{a?D.a.upload(a.blob).then(e,t):e(null)},t)})),E&&E.then(e=>te(this,void 0,void 0,(function*(){let t;switch(delete s.media.preloader,e.name=d,k=!0,p){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:c,pFlags:{force_file:"sendMessageUploadDocumentAction"===I||void 0},attributes:_}}if(n)try{const e=yield n;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}C.resolve(t)})),()=>{w(!0)}),E.addNotifyListener(t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));I&&this.setTyping(e,{_:I,progress:0|a}),C.notifyAll(t)}),C};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return C},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),a.isGroupedItem||(C.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),g.a.invokeApi("messages.sendMedia",{background:a.background,peer:U.a.getInputPeerById(e),media:t,message:h,random_id:s.random_id,reply_to_msg_id:r,schedule_date:a.scheduleDate,silent:a.silent,entities:u,clear_draft:a.clearDraft}).then(e=>{A.a.processUpdateMessage(e)},e=>{if("photo"===p&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,p="document",void s.send();throw w(!0),e}))),C.then(s.promise.resolve,s.promise.reject)),{message:s,promise:C}}sendAlbum(e,t,a={}){return te(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=U.a.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let n=a.caption||"",r=a.entities||[];n&&(n=y.a.parseMarkdown(n,r)),this.log("sendAlbum",t,a);const o=""+ ++this.groupedTempId,p=t.map((t,i)=>{const p=a.sendFileDetails[i],d=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,groupId:o},p);return 0===i&&(d.caption=n,d.entities=r),this.sendFile(e,t,d).message});a.clearDraft&&setTimeout(()=>{V.a.clearDraft(e,a.threadId)},0);const d=(e,t)=>{t?e.error=!0:delete e.error,f.default.dispatchEvent("messages_pending")},c=U.a.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=Object(i.a)();return this.sendSmthLazyLoadQueue.push({load:()=>g.a.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft}).then(e=>{A.a.processUpdateMessage(e),n.resolve()},e=>{p.forEach(e=>d(e,!0)),n.reject(e)})}),n},m=p.map(e=>e.send().then(e=>g.a.invokeApi("messages.uploadMedia",{peer:c,media:e})).then(t=>{let a;if("messageMediaPhoto"===t._){const e=x.a.savePhoto(t.photo);a=x.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=T.a.saveDoc(t.document);a=T.a.getMediaInput(e)}const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:r};return n&&(n="",r=[]),s}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),d(e,!0),t}));return Promise.all(m).then(e=>l(e.filter(Boolean)))}))}sendContact(e,t){return this.sendOther(e,R.a.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=U.a.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,O.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=O.a.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:x.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:T.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}n.media=r;return n.send=()=>{const s={};let r;return this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId),r=a.viaBotId?g.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent},s):g.a.invokeApiAfter("messages.sendMedia",{peer:U.a.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent},s),this.pendingAfterMsgs[e]=s,r.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),A.a.processUpdateMessage(e)},e=>{f.default.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getMessagesStorage(s);if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{f.default.dispatchEvent("scheduled_new",{peerId:s,mid:a})},0);else{const i=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of i)e&&e.history.unshift(a);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{f.default.dispatchEvent("history_append",{storage:n,peerId:s,mid:a})},0)}this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&V.a.clearDraft(s,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=U.a.isBroadcast(e);if(s){if(U.a.getPeer(e).pFlags.signatures){const e=R.a.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:this.generateFromId(e),peer_id:U.a.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.h)(!0)+u.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(d.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0,promise:void 0===t.groupId?Object(i.a)():void 0}}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}generateReplies(e){let t;if(U.a.isBroadcast(e)){const a=L.default.chatsFull[e.toChatId()];(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:U.a.getOutputPeer(R.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==R.a.getSelf().id&&(t.out=!0,U.a.isChannel(e)||R.a.isBot(e)||(t.unread=!0)),U.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=R.a.getSelf().id.toPeerId();if(t.fromId===a&&t.peerId===a&&!t.fwd_from)return;const s={_:"messageFwdHeader",flags:0,date:t.date};return t.fwd_from?(s.from_id=t.fwd_from.from_id,s.from_name=t.fwd_from.from_name,s.post_author=t.fwd_from.post_author):(s.from_id=U.a.getOutputPeer(t.fromId),s.post_author=t.post_author),U.a.isBroadcast(t.peerId)&&(t.post_author&&(s.post_author=t.post_author),s.channel_post=t.id),e===a&&(s.saved_from_msg_id=t.id,s.saved_from_peer=U.a.getOutputPeer(t.peerId)),s}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",action:{_:"messageActionChannelEditPhoto",photo:t},mid:a,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(a,s),s}isAnonymousSending(e){var t,a;return e.isAnyChat()&&(null===(a=null===(t=U.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return A.a.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return te(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a;const s=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,s.readMaxId);return!this.getMessageByPeer(e,s.maxId).pFlags.out&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;N.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),a||void 0===t||this.dialogsStorage.resetPinnedOrder(t),a||$.default.setAuthorized(!0),R.a.saveApiUsers(r.users),E.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!a,p=!1;const d={},c=void 0===t?0:t,l=void 0===t;Object(v.d)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,l),o||U.a.isChannel(e.peerId||U.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(s&&e.index>s&&(this.scheduleHandleNewDialogs(e.peerId,e),p=!0),X.a.getServerMessageId(e.read_inbox_max_id)||X.a.getServerMessageId(e.read_outbox_max_id)||(d[e.peerId]=e,this.log.error("noIdsDialogs",e,i)))});const m=Object.keys(d);if(m.length){const e=m.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{f.default.dispatchEvent("dialogs_multiupdate",d);for(let t=0;t=g||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),p?this.scheduleHandleNewDialogs():f.default.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,P=100===e?_:_.slice(0,e);return{isEnd:y&&P[P.length-1]===_[_.length-1],count:g,dialogs:P}})}forwardMessages(e,t,a,s={}){e=U.a.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort((e,t)=>e-t)).length;n{var i,r;const o=this.getMessageByPeer(t,a),p=this.generateOutgoingMessage(e,s),d=["entities","media"];s.dropAuthor||(p.fwd_from=this.generateForwardHeader(e,o),d.push("views","forwards")),s.dropCaptions&&o.media||d.push("message"),d.forEach(e=>{p[e]=o[e]});const c=null===(i=p.media)||void 0===i?void 0:i.document;if(c){["round","voice"].includes(c.type)&&(p.pFlags.media_unread=!0)}if(o.grouped_id){(null!==(r=n[o.grouped_id])&&void 0!==r?r:n[o.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(p)}return p});for(const e in n){const t=n[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}i.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=g.a.invokeApiAfter("messages.forwardMessages",{from_peer:U.a.getInputPeerById(t),id:a.map(e=>X.a.getServerMessageId(e)),random_id:i.map(e=>e.random_id),to_peer:U.a.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions},r).then(e=>{this.log("forwardMessages updates:",e),A.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:X.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(U.a.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&U.a.getPeerId(e.peer_id)||b.c}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const a=U.a.getPeerId(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=Object(i.a)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:U.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const a=[],s={};for(const[e,{inputDialogPeer:t,promise:n}]of this.reloadConversationsPeers)a.push(t),s[e]=n;this.reloadConversationsPeers.clear();const n=()=>{for(const e in s)s[e].resolve(void 0)};g.a.invokeApi("messages.getPeerDialogs",{peers:a}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(s[t].resolve(e),delete s[t])}),n(),e()},e=>{n(),t(e)}).finally(()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return g.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then(s=>(A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a)))}flushHistory(e,t,a){return te(this,void 0,void 0,(function*(){if(U.a.isChannel(e)){const t=this.getHistory(e,0,1),a=t instanceof Promise?yield t:t,s=e.toChatId(),n=a.history[0]||0;return g.a.invokeApiSingle("channels.deleteHistory",{channel:E.a.getChannelInput(s),max_id:X.a.getServerMessageId(n)}).then(e=>(e&&A.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e))}return this.doFlushHistory(U.a.getInputPeerById(e),t,a).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const a=this.needSingleMessages.get(e);if(a&&a.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const a=t[e];a&&a.clear()}),t)f.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([F.default.getState(),this.getPinnedMessage(e)]).then(([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,f.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})})}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a}).finally(()=>{delete a.promise})}updatePinnedMessage(e,t,a,s,n){return g.a.invokeApi("messages.updatePinnedMessage",{peer:U.a.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:X.a.getServerMessageId(t)}).then(e=>{A.a.processUpdateMessage(e)})}unpinAllMessages(e){return g.a.invokeApiSingle("messages.unpinAllMessages",{peer:U.a.getInputPeerById(e)}).then(t=>{if(A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),f.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let a,s,n,i=0;for(const[e,r]of t)if(r.message){if(++i>1)break;a=r.message,s=r.totalEntities,n=r.entities}return i>1&&(a=void 0,s=void 0,n=void 0),{message:a,entities:n,totalEntities:s}}getMidsByAlbum(e){return Object(p.e)(this.groupedMessagesStorage[e],"asc")}getMidsByMessage(e){var t;return(null===(t=e)||void 0===t?void 0:t.grouped_id)?this.getMidsByAlbum(e.grouped_id):[e.mid]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return X.a.generateMessageId((null==t?void 0:t.top_message)||0,!0)}saveMessage(e,t={}){var a,s;if(void 0===e.pFlags&&(e.pFlags={}),"messageEmpty"===e._)return void(e.deleted=!0);const n=this.getMessagePeer(e),i=t.storage||this.getMessagesStorage(n),r="peerChannel"===e.peer_id._,o=r&&E.a.isBroadcast(n.toChatId()),p="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const d=X.a.generateMessageId(e.id);if(e.mid=d,p){if(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id){(null!==(a=this.groupedMessagesStorage[e.grouped_id])&&void 0!==a?a:this.groupedMessagesStorage[e.grouped_id]=new Map).set(d,e)}e.via_bot_id&&(e.viaBotId=e.via_bot_id)}const c=this.getDialogOnly(n);c&&d&&d>c[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=X.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=X.a.generateMessageId(e.reply_to.reply_to_top_id))),p&&e.replies&&(e.replies.max_id&&(e.replies.max_id=X.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=X.a.generateMessageId(e.replies.read_max_id)));const l=!!n;l||(e.date-=u.a.serverTimeOffset);const m=R.a.getSelf().id.toPeerId(),g=p&&e.fwd_from;if(e.peerId=n,e.fromId=n===m?g?g.from_id?U.a.getPeerId(g.from_id):b.c:m:e.pFlags.post||!e.from_id?n:U.a.getPeerId(e.from_id),g){g.saved_from_msg_id&&(g.saved_from_msg_id=X.a.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=X.a.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,a=g.saved_from_msg_id||g.channel_post;if(t&&a){const s=U.a.getPeerId(t),n=X.a.generateMessageId(a);e.savedFrom=s+"_"+n}e.fwdFromId=U.a.getPeerId(g.from_id),l||(g.date-=u.a.serverTimeOffset)}const h={type:"message",peerId:n,messageId:d};if(p&&e.media)switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?e.media={_:"messageMediaUnsupported"}:e.media.photo=x.a.savePhoto(e.media.photo,h),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=O.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":e.media.ttl_seconds?e.media={_:"messageMediaUnsupported"}:e.media.document=T.a.saveDoc(e.media.document,h);break;case"messageMediaWebPage":{const a=B.a.getMessageKeyForPendingWebPage(n,d,t.isScheduled);e.media.webpage=B.a.saveWebPage(e.media.webpage,a,h);break}case"messageMediaInvoice":e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":e.message="",delete e.entities,delete e.totalEntities}if(!p&&e.action){const t=e.action;let a,i;const p=e.fromId===R.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=x.a.savePhoto(t.photo,h)),t.document&&(t.document=T.a.saveDoc(t.photo,h)),t._){case"messageActionChatEditPhoto":(null===(s=t.photo)||void 0===s?void 0:s.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ee.a.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+p),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+p:"messageActionChatReturn"+p)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+p);break;case"messageActionChannelMigrateFrom":a=t.chat_id.toPeerId(!0),i=n;break;case"messageActionChatMigrateTo":a=n,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}a&&i&&!this.migratedFromTo[a]&&!this.migratedToFrom[i]&&this.migrateChecks(a,i)}p&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),i.set(d,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=y.a.fixEmoji(e.message,t);const a=y.a.parseEntities(e.message);e.totalEntities=y.a.mergeEntities(t,a)}wrapMessageForReply(e,t=e.message,a,s,n,i){const r=[];let o=!1;const p=(e,t)=>{if(e){if(void 0===t&&o)return;t=s?l.default.format(e,!0):Object(l.i18n)(e)}if(s)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}};let d=e.totalEntities;if(e.media){Object(Q.a)(e);let n=!0;if(e.grouped_id){if(a){const t=this.getMidsByMessage(e);if(a.length===t.length){for(const e of t)if(!a.includes(e)){n=!1;break}}else n=!1}if(n){const a=this.getAlbumText(e.grouped_id);t=a.message,d=a.totalEntities,i||(p("AttachAlbum"),o=!0)}}else n=!1;if(!n&&!i||!t){const a=e.media;switch(a._){case"messageMediaPhoto":p("AttachPhoto");break;case"messageMediaDice":p(void 0,s?a.emoticon:y.a.wrapEmojiText(a.emoticon));break;case"messageMediaVenue":t=a.title,p("AttachLocation");break;case"messageMediaGeo":p("AttachLocation");break;case"messageMediaGeoLive":p("AttachLiveLocation");break;case"messageMediaPoll":p(void 0,s?"📊 "+(a.poll.question||"poll"):a.poll.rReply);break;case"messageMediaContact":p("AttachContact");break;case"messageMediaGame":{const e="🎮 "+a.game.title;p(void 0,s?e:y.a.wrapEmojiText(e));break}case"messageMediaDocument":{const e=a.document;if("video"===e.type)p("AttachVideo");else if("voice"===e.type)p("AttachAudio");else if("gif"===e.type)p("AttachGif");else if("round"===e.type)p("AttachRound");else if("sticker"===e.type)e.stickerEmojiRaw&&p(void 0,(s?e.stickerEmojiRaw:e.stickerEmoji)+" "),p("AttachSticker"),t="";else if("audio"===e.type){const t=e.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),a="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);p(void 0,s?a:y.a.wrapEmojiText(a))}else p(void 0,s?e.file_name:y.a.wrapEmojiText(e.file_name));break}case"messageMediaUnsupported":p(l.UNSUPPORTED_LANG_PACK_KEY)}}const c=r.length;t&&c&&r.push(", ")}if(e.action){const t=this.wrapMessageActionTextNew(e,s);t&&p(void 0,t)}if(t)if(t=Object(c.f)(t,100),d||(d=[]),s)r.push(y.a.wrapPlainText(t,d));else{if(n){n=n.trim();let e,a=!1,s=new RegExp(Object(c.e)(n),"gi");for(;null!==(e=s.exec(t));)d.push({_:"messageEntityHighlight",length:n.length,offset:e.index}),a=!0;a&&y.a.sortEntities(d)}const e=y.a.wrapRichText(t,{noLinebreaks:!0,entities:d,noLinks:!0,noTextFormat:!0});r.push(Object(H.a)(e))}if(s)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const a=e.fromId===f.default.myId&&e.peerId!==f.default.myId;if(t.append(a?Object(l.i18n)("FromYou"):new G.a(Object.assign(Object.assign({},this.getMessageSenderPeerIdOrName(e)),{dialog:e.peerId===f.default.myId})).element),U.a.isAnyGroup(e.peerId)||a){const a=new G.a({peerId:e.peerId}).element;t.append(" ➝ ",a)}return t}getMessageSenderPeerIdOrName(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(Object(r.c)(new Date(1e3*e.date))),t}wrapJoinVoiceChatAnchor(e){const t=e.action,{onclick:a,url:s}=y.a.wrapUrl(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!a)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",a+"(this)"),n}wrapMessageActionTextNewUnsafe(e,t){const a=t?void 0:document.createElement("span"),s="action"in e&&e.action;if(s.message){const e=s.message;return t?y.a.wrapPlainText(e):(a.innerHTML=y.a.wrapRichText(e,{noLinebreaks:!0}),a)}{let n,i,o=s._;const p=(e,t)=>t?U.a.getPeerTitle(e,t):new G.a({peerId:e}).element;switch(s._){case"messageActionPhoneCall":o+="."+s.type,i=[Object(W.a)(s.duration,t)];break;case"messageActionGroupCall":o+="."+s.type,i=[],o.endsWith("You")||e.pFlags.post||i.push(p(e.fromId,t)),void 0!==s.duration?i.push(Object(W.a)(s.duration,t)):i.push(this.wrapJoinVoiceChatAnchor(e));break;case"messageActionInviteToGroupCall":{const a=[e.fromId,s.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const o=R.a.getSelf().id;a[0]===o?r+="ByYou":a[1]===o&&(r+="ForYou"),Object(v.e)(a,o),n=r,i=a.map(e=>p(e,t)),i.push(this.wrapJoinVoiceChatAnchor(e));break}case"messageActionGroupCallScheduled":{const a=new Date,o=new Date(1e3*s.schedule_date),d=(o.getTime()-a.getTime())/864e5,c=new Date(a);c.setDate(c.getDate()+1);const m=U.a.isBroadcast(e.peerId);n=m?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",i=[];const g=R.a.getSelf().id;e.fromId===g?n+="You":m||i.push(p(e.fromId,t));let h,u=[];d<1&&o.getDate()===a.getDate()?h="TodayAtFormattedWithToday":d<2&&o.getDate()===c.getDate()?h="Time.TomorrowAt":(h="formatDateAtTime",u.push(new l.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),u.push(Object(r.f)(o));const y=Object(l.i18n)(h,u);i.push(y);break}case"messageActionChatCreate":{const a=R.a.getSelf().id;e.fromId===a?o+="You":i=[p(e.fromId,t)];break}case"messageActionPinMessage":{const a=e.peerId,s=this.getMessageByPeer(a,e.reply_to_mid);if(i=[p(e.fromId,t)],s.deleted)n="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(f.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(a),peerId:a,mid:e.mid}),this.isMessageIsTopMessage(e)&&f.default.dispatchEvent("dialogs_multiupdate",{[a]:this.getDialogOnly(a)}))});else{const e=document.createElement("i");e.dataset.savedFrom=s.peerId+"_"+s.mid,e.dir="auto",e.append(this.wrapMessageForReply(s,void 0,void 0,t)),i.push(e)}break}case"messageActionChatJoinedByRequest":{const a=U.a.isBroadcast(e.peerId);e.pFlags.out?n=a?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(n=a?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",i=[p(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":i=[p(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":i=[],"messageActionChatEditTitle"===s._&&i.push(p(e.fromId,t)),i.push(t?s.title:Object(z.a)(y.a.wrapEmojiText(s.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const a=s.users||[s.user_id];if(i=[p(e.fromId,t)],a.length>1){const e=Object(l.join)(a.map(e=>p(e.toPeerId(),t)),!1,t);if(t)i.push(...e);else{const t=document.createElement("span");t.append(...e),i.push(t)}}else i.push(p(a[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=y.a.wrapRichText(s.domain,{entities:[{_:"messageEntityUrl",length:s.domain.length,offset:0}]});i=[Object(z.a)(e)];break}default:n=l.langPack[o]||`[${s._}]`}return n||(n=l.langPack[o],void 0===n&&(n="["+o+"]")),t?l.default.format(n,!0,i):Object(l._i18n)(a,n,i)}}wrapMessageActionTextNew(e,t){try{return this.wrapMessageActionTextNewUnsafe(e,t)}catch(e){return this.log.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}}reportMessages(e,t,a,s){return g.a.invokeApiSingle("messages.report",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e)),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=Object(d.b)();return g.a.invokeApi("messages.startBot",{bot:R.a.getUserInput(e),peer:U.a.getInputPeerById(s),random_id:t,start_param:a}).then(e=>{A.a.processUpdateMessage(e)})}if(t){let a;return a=E.a.isChannel(t)?E.a.inviteToChannel(t,[e]):E.a.addChatUser(t,e,0),a.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=R.a.getUser(e);return this.sendText(s,"/start@"+t.username)})}return this.sendText(s,"/start")}editPeerFolders(e,t){g.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:U.a.getInputPeerById(e),folder_id:t}))}).then(e=>{A.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var a;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=1===t?f.default.config.pinned_infolder_count_max:f.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return g.a.invokeApi("messages.toggleDialogPin",{peer:U.a.getInputDialogPeerById(e),pinned:n}).then(a=>{if(a){const a=n?{pinned:n}:{};A.a.saveUpdate({_:"updateDialogPinned",peer:U.a.getDialogPeer(e),folder_id:t,pFlags:a})}})}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return g.a.invokeApi("messages.markDialogUnread",{peer:U.a.getInputDialogPeerById(e),unread:n}).then(t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:U.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&E.a.hasChat(t.toChatId())){const a=E.a.getChat(e.toChatId());a&&a.migrated_to&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,f.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const a=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&a.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===a.indexOf(e.media._)||e.fromId&&R.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var a;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===R.a.getSelf().id||!(!e.pFlags.out||e.peerId.isUser()&&e.date=t.mid)&&(!n.pFlags.selective&&(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(Q.a)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:R.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0){return(a?g.a.invokeApiCacheable:g.a.invokeApi).bind(g.a)("messages.getSearchCounters",{peer:U.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,a,s){const n=[];if(!t.length)return n;let i=!0;const r={},o=[],p=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,p.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:i=!1}if(!i)return n;for(let e=0,i=t.length;ee.includes(t._))||y.a.matchUrl(i.message))&&(d=!0)}}else r.avatar&&i.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(i.action._)&&(d=!0);if(d&&(n.push(i),n.length>=s))break}return n}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:d,maxDate:c}){t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),d=d?d/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilter(a._,m.history.slice,this.getMessagesStorage(e),n)),l.length){if(!(l.length{R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages),N.b&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=E.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}})}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=X.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:X.a.generateMessageId(a,!0),date:e.date,from_id:{_:"peerUser",user_id:b.c},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getDiscussionMessage(e,t){return g.a.invokeApiSingle("messages.getDiscussionMessage",{peer:U.a.getInputPeerById(e),msg_id:X.a.getServerMessageId(t)}).then(a=>{var s;E.a.saveApiChats(a.chats),R.a.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.filterMessages(a.messages[0],e=>!!e.replies)[0],i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid);return a.max_id=r.maxId=X.a.generateMessageId(a.max_id)||0,a.read_inbox_max_id=r.readMaxId=X.a.generateMessageId(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=X.a.generateMessageId(a.read_outbox_max_id)||0,this.threadsToReplies[i]=e+"_"+t,n})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,a){var s,n;let i;const r=t.map(e=>X.a.getServerMessageId(e));if(e.isAnyChat()&&U.a.isChannel(e)){const a=e.toChatId(),o=E.a.getChat(a);if(!o.pFlags.creator&&!(null===(n=null===(s=o.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;i=g.a.invokeApi("channels.deleteMessages",{channel:E.a.getChannelInput(a),id:r}).then(e=>{A.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})})}else i=g.a.invokeApi("messages.deleteMessages",{revoke:a,id:r}).then(e=>{A.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return i}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)&&!s)return this.log("readHistory: isn't unread"),Promise.resolve();const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=g.a.invokeApi("messages.readDiscussion",{peer:U.a.getInputPeerById(e),msg_id:X.a.getServerMessageId(a),read_max_id:X.a.getServerMessageId(t)})),A.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):U.a.isChannel(e)?(n.readPromise||(i=g.a.invokeApi("channels.readHistory",{channel:E.a.getChannelInput(e.toChatId()),max_id:X.a.getServerMessageId(t)})),A.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=g.a.invokeApi("messages.readHistory",{peer:U.a.getInputPeerById(e),max_id:X.a.getServerMessageId(t)}).then(e=>{A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),A.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:U.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),q.a.soundReset(U.a.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally(()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)}),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(P.a.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new P.b,n=s.length,i=s.first.isEnd(P.a.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=s.last,a=t&&t[t.length-1];a?(s.delete(a),f.default.dispatchEvent("history_focus",{peerId:e,mid:a})):this.fixUnreadMentionsCountIfNeeded(e,s)}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)})}getUnreadMentions(e,t,a,s,n=0,i=0){return g.a.invokeApiSingle("messages.getUnreadMentions",{peer:U.a.getInputPeerById(e),offset_id:X.a.getServerMessageId(t),add_offset:a,limit:s,max_id:X.a.getServerMessageId(n),min_id:X.a.getServerMessageId(i)}).then(e=>(Object(Q.a)(e),R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map(e=>X.a.getServerMessageId(e)),e.isAnyChat()&&U.a.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=g.a.invokeApi("channels.readMessageContents",{channel:E.a.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=g.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{s.pts=e.pts,s.pts_count=e.pts_count,A.a.processLocalUpdate(s)});return A.a.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new P.b}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new P.b}}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.wrapSingleMessage(e,t,!0).then(()=>{const s=this.getMessageByPeer(e,t);return a&&f.default.dispatchEvent(a,s),s})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&f.default.dispatchEvent("history_update",{storage:s.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e,t){const a={_:"inputPeerNotifySettings"};return void 0===t&&(t=!q.a.isPeerLocalMuted(e,!1)),a.mute_until=t?b.b:0,q.a.updateNotifySettings({_:"inputNotifyPeer",peer:U.a.getInputPeerById(e)},a)}canSendToPeer(e,t,a="send_messages"){if(e.isAnyChat()){const s=E.a.getChat(e.toChatId());return E.a.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return R.a.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach(e=>{e.history.delete(n)});const o=this.getMessageFromStorage(r,n);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),f.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){Object(Q.a)(a);const{photo:e,document:s}=a.media;if(e){const a=x.a.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=D.a.getCacheContext(e,t.type),n=D.a.getCacheContext(a,"full");Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=x.a.getPhotoDownloadOptions(e,i),o=Object(j.a)(r.location);D.a.fakeDownload(o,n.url)}}else if(s){const e=T.a.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=D.a.getCacheContext(s),a=D.a.getCacheContext(e);Object.assign(t,a);const n=T.a.getInputFileName(s);D.a.fakeDownload(n,a.url)}}else a.media.poll&&(delete O.a.polls[t],delete O.a.results[t])}const n=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(n,e),f.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:n,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,F.default.pushToState("maxSeenMsgId",e),g.a.invokeApi("messages.receivedMessages",{max_id:X.a.getServerMessageId(e)})}incrementMessageViews(e,t){if(t.length)return g.a.invokeApiSingle("messages.getMessagesViews",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e)),increment:!0}).then(a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{f.default.dispatchEvent("history_focus",{peerId:a,mid:e.mid})},s.message=i,s.key="msg"+e.mid,s.tag=n,s.silent=!0;const r=U.a.getPeerPhoto(a);r?K.a.loadAvatar(a,r,"photo_small").loadPromise.then(t=>{e.pFlags.unread&&(s.image=t,q.a.notify(s))}):q.a.notify(s)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):g.a.invokeApiSingle("messages.getScheduledHistory",{peer:U.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){R.a.saveApiUsers(t.users),E.a.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]})}sendScheduledMessages(e,t){return g.a.invokeApi("messages.sendScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e))}).then(e=>{A.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return g.a.invokeApi("messages.deleteScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e))}).then(e=>{A.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===b.d||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!E.a.isInChat(e.toChatId())}getNewHistory(e,t){var a;return te(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(P.a.Bottom))return;delete s.maxId,n.unsetEnd(P.a.Bottom);let i=this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);i instanceof Promise&&(i=yield i);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a);return{count:i.count,history:(null==e?void 0:e.slice)||i.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}}):{count:i.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid);if(a&&X.a.getServerMessageId(a)&&!l.includes(a)&&pl[e]);++e);l.splice(e,0,a)}const m=e.insertSlice(l)||e.slice;return d&&m.setEnd(P.a.Top),c&&m.setEnd(P.a.Bottom),Object.assign({slice:m,mids:l,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){return this.requestHistory(e,t,a,s,void 0,i).then(i=>{const{count:r,isBottomEnd:o,slice:p,messages:d}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=r;for(let t=0,a=d.length;t{N.b&&this.log("requestHistory result:",e,r,t,a,s),R.a.saveApiUsers(r.users),E.a.saveApiChats(r.chats),this.saveMessages(r.messages),U.a.isChannel(e)&&A.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,p--);const d=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=d.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=E.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},A.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map(e=>({_:"inputMessageID",id:X.a.getServerMessageId(e)}));let i;i=e.isAnyChat()&&U.a.isChannel(e)?g.a.invokeApiSingle("channels.getMessages",{channel:E.a.getChannelInput(e.toChatId()),id:n}):g.a.invokeApiSingle("messages.getMessages",{id:n});const r=i.then(e=>{Object(Q.a)(e),R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:s})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,a=!1){const s=this.getMessageByPeer(e,t);if(s.deleted||a){let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=Object(i.a)(),a.set(t,s),this.fetchSingleMessages(),s)}return f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?U.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t,a){var s;let n=this.typings[e];return f.default.myId&&e&&this.canSendToPeer(e)&&e!==f.default.myId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},g.a.invokeApi("messages.setTyping",{peer:U.a.getInputPeerById(e),action:t}).finally(()=>{n===this.typings[e]&&(n.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&h.a.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=B.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);B.a.deleteWebPageFromPending(a.webpage,n)}a.poll&&O.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(a.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,q.a.cancel("msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n);const r=this.newMessagesToHandle[e];r&&r.has(n)&&r.delete(n)}if(s.albums)for(const t in s.albums)f.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...s.albums[t]]});return s}handleEditedMessage(e,t){var a;if("message"===e._&&(null===(a=e.media)||void 0===a?void 0:a.webpage)){const t=B.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);B.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const a=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!a||!["voice","round"].includes(a.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return!e.pFlags.noforwards&&!U.a.noForwards(e.peerId)}};N.a.appMessagesManager=ae;t.a=ae},function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(32),r=a(15),o=a(51),p=a(41),d=a(16),c=a(47);const l=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],m=["red","green","yellow","blue","violet","pink","cyan","orange"],g=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,a=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return h[a](this.toString())},Number.prototype[t]=function(){return h[a](this)}});const h=new class{canPinMessage(e){return e.isUser()||o.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=e.isUser()?p.a.getUserPhoto(e.toUserId()):o.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:null}getPeerMigratedTo(e){if(e.isUser())return!1;const t=o.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,a=!1){e||(e=r.default.myId);let s="";if(e.isUser()){const t=p.a.getUser(e.toUserId());t.first_name&&(s+=t.first_name),!t.last_name||a&&s||(s+=" "+t.last_name),s=s?s.trim():t.pFlags.deleted?d.default.format("HiddenName",!0):t.username}else{s=o.a.getChat(e.toChatId()).title,a&&(s=s.split(" ")[0])}return t?s:i.a.wrapEmojiText(s)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return o.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?p.a.getUserString(e.toUserId()):o.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?p.a.getUser(e.toUserId()):o.a.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(n.f)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):r.default.myId}if(!e)return c.c;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&o.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&o.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!o.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&p.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&p.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return o.a.getInputPeer(t)}const t=e.toUserId();return p.a.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(n.f)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const a=g[Math.abs(+e)%7];return(t?m:l)[a]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+p.a.getUserSearchText(e.toUserId());else{t="%pg "+(o.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===r.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return o.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return o.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;if(e.isUser())return!1;return!!(null===(t=o.a.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}};s.a.appPeersManager=h,t.a=h},,,,,,,,function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(33),r=a(32),o=a(15),p=a(74),d=a(43),c=a(17),l=a(41);const m=new class{constructor(){this.storage=c.default.storages.chats,this.onChatUpdated=(e,t)=>{var a;p.a.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&o.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),o.default.addMultipleEventsListeners({updateChannelParticipant:e=>{i.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=d.a.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,o.default.dispatchEvent("chat_update",t))}}),c.default.getState().then(e=>{const t=c.default.storagesResults.chats;if(t.length)for(let e=0,a=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),c.default.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=c.default.storagesResults.chats;for(const t in this.chats)t&&(c.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var a,s;if("chatEmpty"===e._)return;const i=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;e.initials=r.a.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==i&&i.participants_count&&(e.participants_count=i.participants_count);let p=!1,d=!1;if(void 0===i)this.chats[e.id]=e;else{(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(p=!0),i.title!==e.title&&(d=!0),Object(n.i)(i,e),o.default.dispatchEvent("chat_update",e.id)}const l=e.id.toPeerId(!0);p&&o.default.dispatchEvent("avatar_update",l),d&&o.default.dispatchEvent("peer_title_edit",l),c.default.isPeerNeeded(l)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const a=this.getChat(e);if(a.default_banned_rights){t=Object(n.a)(t);const e=a.default_banned_rights.pFlags;for(let a in e)t.pFlags[a]=e[a]}return t}hasRights(e,t,a,s){const n=this.getChat(e);if("chatEmpty"===n._)return!1;if(n.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===a;if(n.pFlags.creator&&i)return!0;if("chatForbidden"===n._||"channelForbidden"===n._||n.pFlags.kicked||n.pFlags.left&&!n.pFlags.megagroup)return!1;if(!a&&!(a=n.admin_rights||n.banned_rights||n.default_banned_rights))return!1;let r={};switch(a&&(r=a.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!s&&n.pFlags.left)return!1;if("chatBannedRights"===a._&&r[t])return!1;if("channel"===n._&&!n.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===a._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===a._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===a._&&!!r.ban_users;case"view_participants":return!("chat"!==n._&&n.pFlags.broadcast&&!n.pFlags.creator&&!n.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&Object(n.b)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():i.a.invokeApi("messages.editChatDefaultBannedRights",{peer:d.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.kicked||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return Object(n.f)(a)&&(t||!a.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return i.a.invokeApi("channels.createChannel",e).then(e=>{p.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map(e=>l.a.getUserInput(e));return i.a.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return i.a.invokeApi("messages.createChat",{users:t.map(e=>l.a.getUserInput(e)),title:e}).then(e=>{p.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return i.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return i.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return i.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:l.a.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return i.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:l.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,l.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return i.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return i.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):i.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return i.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(a=>{if(a){this.getChat(e).username=t}return a})}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?i.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):i.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(e=>{p.a.processUpdateMessage(e)})}editTitle(e,t){let a;return a=this.isChannel(e)?i.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):i.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(e=>{p.a.processUpdateMessage(e)})}editAbout(e,t){const a=e.toPeerId(!0);return i.a.invokeApi("messages.editChatAbout",{peer:d.a.getInputPeerById(a),about:t}).then(e=>(e&&o.default.dispatchEvent("peer_bio_edit",a),e))}getParticipantPeerId(e){return e.peer?d.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,a){const s="object"!=typeof t?t:this.getParticipantPeerId(t);return i.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:d.a.getInputPeerById(s),banned_rights:a}).then(n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;p.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:l.a.getSelf().id,peer:d.a.getOutputPeer(s),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return i.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>i.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{p.a.processUpdateMessage(e)})}toggleSignatures(e,t){return i.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{p.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return i.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{p.a.processUpdateMessage(e)})}};s.a.appChatsManager=m,t.a=m},function(e,t,a){"use strict";a.d(t,"a",(function(){return m}));var s=a(29),n=a(43),i=a(15),r=a(16),o=a(36),p=a(41),d=a(32),c=a(47);const l=new WeakMap;s.a.peerTitleWeakMap=l,i.default.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=l.get(e);t&&t.update()})});class m{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),l.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];void 0===this.fromName?(void 0===this.peerId&&(this.peerId=c.c),this.peerId===i.default.myId&&this.dialog?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&p.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=n.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName)):this.element.innerHTML=d.b.wrapEmojiText(this.fromName)}}},,,function(e,t,a){"use strict";var s=a(56),n=a(115),i=a(31),r=a(0),o=a(33),p=a(145),d=a(72),c=a(41),l=a(140),m=a(29),g=a(106),h=a(130),u=a(38),y=a(96);class f{constructor(){this.photos={}}savePhoto(e,t){var a;if("photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(Object(i.h)("file_reference",s,e),p.a.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,a=0,s=!1,n=!1){window.devicePixelRatio>1&&(t*=2,a*=2);let i={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(n&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,s=r.length;e=t||n.height>=a)break}s&&"photoSizeEmpty"===i._&&"photoStrippedSize"===r[0]._&&(i=r[0])}return i}getUserPhotos(e,t="0",a=20){const s=c.a.getUserInput(e);return o.a.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then(a=>{c.a.saveApiUsers(a.users);const s=a.photos.map((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}})}getPreviewURLFromBytes(e,t=!1){let a,s;t?a=e instanceof Uint8Array?e:new Uint8Array(e):(a=new Uint8Array(f.jpegHeader.concat(Array.from(e.slice(3)),f.jpegTail)),a[164]=e[1],a[166]=e[2]),s=t?r.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const n=new Blob([a],{type:s});return URL.createObjectURL(n)}getPathFromPhotoPathSize(e){const t=e.bytes;let a="M";for(let e=0,s=t.length;e=192?a+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?a+=",":s>=64&&(a+="-"),a+=""+(63&s))}return a+="z",a}getPreviewURLFromThumb(e,t,a=!1){const s=d.a.getCacheContext(e,t.type);return s.url||(s.url=this.getPreviewURLFromBytes(t.bytes,a))}getImageFromStrippedThumb(e,t,a){const s=this.getPreviewURLFromThumb(e,t,!1),n=new Image;n.classList.add("thumbnail");const i=(a?Object(l.a)(s):Promise.resolve(s)).then(e=>Object(g.b)(n,e));return{image:n,loadPromise:i}}setAttachmentSize(e,t,a,s,n=!0,i,r,o){let p;o||(o=this.choosePhotoSize(e,a,s,void 0,r));const d="document"===e._;p=d?Object(u.c)(e.w||o.w||512,e.h||o.h||512):Object(u.c)(o.w||100,o.h||100);let c=Object(u.c)(a,s);c=p=p.aspect(c,n);let l=!0;return d&&!["video","gif"].includes(e.type)||(c.width<200&&c.height<200&&(c=p=p.aspectCovered(Object(u.c)(200,200))),i&&(i.message||i.reply_to_mid||i.media.webpage||i.replies&&i.replies.pFlags.comments&&777!==i.replies.channel_id)&&c.width<320&&(c=Object(u.c)(320,c.height),l=!1),l&&c.width<120&&i&&(c=Object(u.c)(120,c.height),l=!1)),t.style.width=c.width+"px",t.style.height=c.height+"px",{photoSize:o,size:p,isFit:l}}getStrippedThumbIfNeeded(e,t,a,s=!1){if(!t.downloaded||["video","gif"].includes(e.type)||s){if("document"===e._&&t.downloaded&&!s)return null;const n=e.sizes||e.thumbs,i=(null==n?void 0:n.length)?n.find(e=>"photoStrippedSize"===e._):null;if(i&&"bytes"in i)return this.getImageFromStrippedThumb(e,i,a)}return null}getPhotoDownloadOptions(e,t,a,s){const n="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const i=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:n?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:i?t.size:void 0,queueId:a,onlyCache:s}}preloadPhoto(e,t,a,s){const i=this.getPhoto(e);if(!i||"photoEmpty"===i._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=y.a.width,a=y.a.height;t=this.choosePhotoSize(i,e,a)}const r=d.a.getCacheContext(i,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const o=this.getPhotoDownloadOptions(i,t,a,s),p=Object(n.a)(o.location);let c=d.a.getDownload(p);return c||(c=d.a.download(o),c.then(e=>{if(!r.downloaded||r.downloaded{}),c)}getPhoto(e){return Object(i.f)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const a=this.choosePhotoSize(e,65535,65535);if("photoSize"!==a._&&"photoSizeProgressive"!==a._)return;const s=this.getPhotoDownloadOptions(e,a,t);s.fileName="photo"+e.id+".jpg",d.a.downloadToDisc(s,s.fileName)}}f.jpegHeader=Object(s.c)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),f.jpegTail=Object(s.c)("ffd9");const _=new f;m.a&&(m.a.appPhotosManager=_),t.a=_},function(e,t,a){"use strict";function s(e){const t=e.length,a=new Array(t);for(let s=0;s>>t&24),2!==t&&s-i!=1||(a+=String.fromCharCode(r(n>>>18&63),r(n>>>12&63),r(n>>>6&63),r(63&n)),n=0);return a.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function o(e,t){const a=e.length;if(a!==t.length)return!1;for(let s=0;se+(t.byteLength||t.length),0),a=new Uint8Array(t);let s=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,s),s+=e.byteLength||e.length}),a}function l(e){const t=new Uint8Array(e.byteLength);for(let a=0,s=4*e.length;a>>2]>>>24-a%4*8&255;return t}function m(e){const t=d(e),a=[];for(let e=0,s=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.d(t,"f",(function(){return s})),a.d(t,"c",(function(){return n})),a.d(t,"e",(function(){return i})),a.d(t,"b",(function(){return o})),a.d(t,"h",(function(){return p})),a.d(t,"i",(function(){return d})),a.d(t,"a",(function(){return c})),a.d(t,"d",(function(){return l})),a.d(t,"g",(function(){return m}))},,,,,,,,,,,function(e,t,a){"use strict";var s=a(33),n=a(15),i=a(75),r=a(92),o=a(29),p=a(39),d=a(128),c=a(98),l=a(54),m=a(38),g=a(99),h=a(32),u=a(91),y=a(108),f=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const _=new Set(["emoji","emojiAnimations"]);const v=new class{constructor(){this.storage=new r.a(d.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.getAnimatedEmojiStickerSet(),n.default.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),n.default.dispatchEvent("stickers_installed",t.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),i.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(p.d)(e,(t,a)=>{(t=i.a.saveDoc(t))?e[a]=t:e.splice(a,1)})}getStickerSet(e,t={}){return f(this,void 0,void 0,(function*(){const a=e.id;return this.getStickerSetPromises[a]?this.getStickerSetPromises[a]:this.getStickerSetPromises[a]=new Promise(n=>f(this,void 0,void 0,(function*(){var i;if(!t.overwrite){const e=yield this.storage.get(a);if(e&&(null===(i=e.documents)||void 0===i?void 0:i.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),n(e),void delete this.getStickerSetPromises[a]}try{const i=yield s.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),r=t.saveById?a:i.set.id;this.saveStickerSet(i,r),n(i)}catch(e){n(null)}delete this.getStickerSetPromises[a]})))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:"emoji"},{saveById:!0}),this.getStickerSet({id:"emojiAnimations"},{saveById:!0}),this.getAnimatedEmojiSounds()]).then(([e,t])=>({emoji:e,animations:t}))}getAnimatedEmojiSounds(e){return this.getAnimatedEmojiSoundsPromise&&!e?this.getAnimatedEmojiSoundsPromise:this.getAnimatedEmojiSoundsPromise=s.a.getAppConfig(e).then(e=>{for(const t in e.emojies_sounds){const a=e.emojies_sounds[t],s=atob(Object(y.a)(a.file_reference_base64,!1)),r=new Uint8Array(s.length);for(let e=0,t=r.length;e(Object(u.a)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=this.storage.getFromCache(t?"emojiAnimations":"emoji");if(!a||!a.documents)return;e=this.cleanEmoji(e);const s=a.packs.find(t=>t.emoticon===e);return s?i.a.getDoc(s.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e,t,a){const s=this.getAnimatedEmojiStickerSet().then(()=>{const s=this.getAnimatedEmojiSticker(e);if(s)return i.a.downloadDoc(s).then(c.c).then(n=>f(this,void 0,void 0,(function*(){const r=m.b.active.emojiSticker,o=Object(g.d)(e),p=yield l.a.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:r.width,height:null!=a?a:r.height,name:"doc"+s.id,autoplay:!1,loop:!1},"none",o);p.addEventListener("firstFrame",()=>{i.a.saveLottiePreview(s,p.canvas,o),p.remove()},{once:!0})})))});return Promise.all([s,this.preloadAnimatedEmojiStickerAnimation(e)])}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then(()=>{const t=this.getAnimatedEmojiSticker(e,!0);if(t){const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([i.a.downloadDoc(t),a?i.a.downloadDoc(a):void 0])}})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),this.saveStickers(e.documents);const n=s.set.installed_date||_.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find(e=>"photoSize"===e._),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:"emojiAnimations"===e.id?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return f(this,void 0,void 0,(function*(){return(yield s.a.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>(Object(u.a)(e),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)})).sets}))}toggleStickerSet(e){return f(this,void 0,void 0,(function*(){if(e.installed_date){if(yield s.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,n.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield s.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,n.default.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return f(this,void 0,void 0,(function*(){const a=t?1:0,n=yield s.a.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>(Object(u.a)(e),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)}),i=[],r=this.storage.getCache();for(let t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!n.sets.find(e=>e.set.id===a.id)&&i.push({_:"stickerSetCovered",set:a,cover:null})}return n.sets.concat(i)}))}getAllStickers(){return s.a.invokeApiHashable({method:"messages.getAllStickers"})}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=h.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([s.a.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e}}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,a,s])=>{const n=t.stickers.map(e=>i.a.saveDoc(e)),r=[],o=[],p=t=>{for(const a of t){if(h.b.fixEmoji(a.emoticon).includes(e))for(const e of a.documents){const t=i.a.getDoc(e);(t.animated?r:o).push(t)}}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach(t=>{t.sort((t,a)=>e.indexOf(t)-e.indexOf(a))})}for(const e of a)p(e.packs);return[...new Set(r.concat(o,n))]})}pushRecentSticker(e){const t=h.b.fixEmoji(e.stickerEmojiRaw);for(const a in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[a].then(s=>{const n=s.findAndSplice(t=>t.id===e.id);n?s.unshift(n):a.includes(t)&&s.unshift(e)})}}};o.a.appStickersManager=v,t.a=v},,,,,,function(e,t,a){"use strict";a.r(t),a.d(t,"AppProfileManager",(function(){return v}));var s=a(29),n=a(59),i=a(64),r=a(16),o=a(33),p=a(32),d=a(15),c=a(123),l=a(74),m=a(51),g=a(104),h=a(105),u=a(43),y=a(55),f=a(41),_=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class v{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():u.a.getPeerId(e.from_id);if(d.default.myId===a||"speakingInGroupCallAction"===e.action._)return;const s=u.a.getPeerId(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find(e=>e.userId===a);const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),d.default.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=f.a.hasUser(a);o?f.a.forceUserOnline(a):"updateChatUserTyping"===e._&&e.chat_id&&m.a.hasChat(e.chat_id)&&!m.a.isChannel(e.chat_id)&&P.getChatFull(e.chat_id).then(()=>{void 0!==i.timeout&&f.a.hasUser(a)&&d.default.dispatchEvent("peer_typings",{peerId:s,typings:n})}),i.timeout=window.setTimeout(r,6e3),o&&d.default.dispatchEvent("peer_typings",{peerId:s,typings:n})},this.onUpdatePeerBlocked=e=>{const t=u.a.getPeerId(e.peer_id);if(u.a.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),d.default.dispatchEvent("user_full_update",a)}d.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},d.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,d.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a,s;const n=this.chatsFull[e],i=m.a.getChat(e);if(!n||!i)return;let r=!1;!!n.call!=!!(null===(t=i.pFlags)||void 0===t?void 0:t.call_active)&&(r=!0);const{photo:o}=i;if(o){"chatPhotoEmpty"!==o._===("photoEmpty"!==(null===(a=n.chat_photo)||void 0===a?void 0:a._))&&o.photo_id===(null===(s=n.chat_photo)||void 0===s?void 0:s.id)||(r=!0)}r&&this.refreshFullPeer(e.toPeerId(!0))}),d.default.addEventListener("chat_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!0))}),d.default.addEventListener("user_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!1))}),d.default.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?Promise.resolve(this.usersFull[e]):o.a.invokeApiSingleProcess({method:"users.getFullUser",params:{id:f.a.getUserInput(e)},processResult:t=>{m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);return a.profile_photo&&(a.profile_photo=y.a.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s})),void 0!==a.about&&(a.rAbout=p.a.wrapRichText(a.about,{noLinebreaks:!0})),h.a.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,d.default.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return u.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return this.getProfileByPeerId(e).then(e=>{switch(e._){case"userFull":return e.profile_photo;case"channelFull":case"chatFull":return e.chat_photo}})}getChatFull(e,t){if(m.a.isChannel(e))return this.getChannelFull(e,t);const a=this.chatsFull[e];if(a&&!t){const t=m.a.getChat(e);if(t.version===a.participants.version||t.pFlags.left)return Promise.resolve(a)}return o.a.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const a=t.full_chat,s=e.toPeerId(!0);return a&&a.chat_photo&&a.chat_photo.id&&(a.chat_photo=y.a.savePhoto(a.chat_photo,{type:"profilePhoto",peerId:s})),h.a.savePeerSettings({peerId:s,settings:a.notify_settings}),this.chatsFull[e]=a,d.default.dispatchEvent("chat_full_update",e),a}})}getChatInviteLink(e,t){return this.getChatFull(e).then(a=>!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:u.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=m.a.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:m.a.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then(e=>(f.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:m.a.getChannelInput(e),participant:u.a.getInputPeerById(t)}).then(e=>(f.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.a.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:m.a.getChannelInput(e)},processResult:t=>{const a=e.toPeerId(!0);m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=y.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),h.a.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,d.default.dispatchEvent("chat_full_update",e),s},processError:t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=m.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},l.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):Promise.resolve(this.chatsFull[e])}getMentions(e,t,a){let s;return s=m.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:g.a.getServerMessageId(a)},50,0).then(e=>e.participants.map(e=>m.a.getParticipantPeerId(e))):e?this.getChatFull(e).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([f.a.getTopPeers("bots_inline").catch(()=>[]),s]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new c.a({ignoreCase:!0}),s=new Map;e.forEach(e=>{a.indexObject(e.id,f.a.getUserSearchText(e.id)),s.set(e.id,e.rating)});const n=Array.from(a.search(t));return n.sort((e,t)=>s.get(t)-s.get(e)),n})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){e.isUser()?delete this.usersFull[e.toUserId()]:delete this.chatsFull[e.toChatId()],d.default.dispatchEvent("peer_full_update",e)}updateProfile(e,t,a){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then(e=>(f.a.saveApiUser(e),this.getProfile(d.default.myId,!0)))}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{f.a.saveApiUsers(e.users);const t=d.default.myId;y.a.savePhoto(e.photo,{type:"profilePhoto",peerId:t});const a=t.toUserId();l.a.processLocalUpdate({_:"updateUserPhoto",user_id:a,date:Object(n.h)(!0),photo:f.a.getUser(a).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=y.a.getPhoto(e);return y.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,a;const s=m.a.getChat(e);if("chatForbidden"===s._)return Object(r.i18n)("YouWereKicked");const n=this.chatsFull[e];let o;o=n?"channelFull"===n._?n.participants_count:null===(t=n.participants.participants)||void 0===t?void 0:t.length:s.participants_count||(null===(a=s.participants)||void 0===a?void 0:a.participants.length);o=o||1;let p=m.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.i18n)(p,[Object(i.d)(o)])}verifyParticipantForOnlineCount(e){const t=f.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return _(this,void 0,void 0,(function*(){if(m.a.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(m.a.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:m.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const P=new v;s.a.appProfileManager=P,t.default=P},function(e,t,a){"use strict";var s=a(29),n=a(37),i=a(33),r=a(15),o=a(41),p=a(51),d=a(43),c=a(17),l=a(78),m=a(91),g=a(76),h=a(32),u=a(7);const y=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(n.b)("UPDATES",n.a.Error|n.a.Warn|n.a.Log),this.debug=s.b,this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{Object(m.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?r.default.myId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:d.a.getOutputPeer(s.toPeerId()),peer_id:d.a.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),p.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,a)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;c.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=i.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){o.a.saveApiUsers(a.users),p.a.saveApiChats(a.chats),a.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),a.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+l.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return a||this.justAName(t,s),s}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=i.a.invokeApi("updates.getChannelDifference",{channel:p.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(a=>{if(this.debug&&this.log.debug("Get channel diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return this.debug&&this.log.debug("channel diff too long",a),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(a.users),p.a.saveApiChats(a.chats),this.debug&&this.log.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",a)});return a||this.justAName(t,s,e),s}justAName(e,t,a){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",a),t.then(()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",a)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=d.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,c=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=c.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{i.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),i.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t.split(" ")[0]+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${u.a.suffix} was updated to version alpha ${t}**\n\n`+e;const a=[],s={_:"updateServiceNotification",entities:a,message:h.b.parseMarkdown(e,a),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(s)}).catch(g.a)})}))}};s.a.apiUpdatesManager=y,t.a=y},function(e,t,a){"use strict";var s=a(115),n=a(31),i=a(145),r=a(159),o=a(32),p=a(72),d=a(55),c=a(140),l=a(33),m=a(29),g=a(59),h=a(15),u=a(129),y=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const f={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const _=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete p.a.getCacheContext(t).url}}},l.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const a=this.docs[e.id];if(e.file_reference&&(Object(n.h)("file_reference",a,e),i.a.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e),e.attributes.forEach(t=>{switch(t._){case"documentAttributeFilename":e.file_name=o.a.wrapPlainText(t.file_name),e.fileName=o.a.wrapEmojiText(t.file_name);break;case"documentAttributeAudio":e.duration=t.duration,e.audioTitle=o.a.wrapEmojiText(t.title),e.audioPerformer=o.a.wrapEmojiText(t.performer),e.type=t.pFlags.voice&&"audio/ogg"===e.mime_type?"voice":"audio";break;case"documentAttributeVideo":e.duration=t.duration,e.w=t.w,e.h=t.h,t.pFlags.round_message?e.type="round":e.type="video";break;case"documentAttributeSticker":void 0!==t.alt&&(e.stickerEmojiRaw=t.alt,e.stickerEmoji=o.a.wrapRichText(e.stickerEmojiRaw,{noLinks:!0,noLinebreaks:!0})),t.stickerset&&("inputStickerSetEmpty"===t.stickerset._?delete t.stickerset:"inputStickerSetID"===t.stickerset._&&(e.stickerSetInput=t.stickerset)),"image/webp"===e.mime_type&&(e.thumbs||u.a)&&(e.type="sticker",e.sticker=1);break;case"documentAttributeImageSize":e.type="photo",e.w=t.w,e.h=t.h;break;case"documentAttributeAnimated":"image/gif"!==e.mime_type&&"video/mp4"!==e.mime_type||(e.type="gif"),e.animated=!0}}),e.mime_type)e.mime_type===f.pdf?e.type="pdf":e.mime_type===f.gif&&(e.type="gif");else{const t=(e.file_name||"").split(".").pop(),a=t&&f[t.toLowerCase()];if(a)e.mime_type=a;else switch(e.type){case"gif":case"video":case"round":e.mime_type="video/mp4";break;case"sticker":e.mime_type="image/webp";break;case"audio":e.mime_type="audio/mpeg";break;case"voice":e.mime_type="audio/ogg";break;default:e.mime_type="application/octet-stream"}}if("voice"!==e.type&&"round"!==e.type||(e.file_name=e.fileName=e.type+"_"+Object(g.g)(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_")),l.a.isServiceWorkerOnline()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=p.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return Object(n.f)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,a,s){const n=this.getInput(e,null==t?void 0:t.type);let i;return i=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:n,size:t?t.size:e.size,mimeType:i,fileName:e.file_name,queueId:a,onlyCache:s}}getFileURL(e,t=!1,a){let n;return n=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",Object(s.b)(n,this.getFileDownloadOptions(e,a))}getThumbURL(e,t){let a=Promise.resolve();const s=p.a.getCacheContext(e,t.type);return s.url||(a="bytes"in t?Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{s.url=e}):d.a.preloadPhoto(e,t)),{thumb:t,cacheContext:s,promise:a}}getThumb(e,t=!0){const a=d.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===a._?null:this.getThumbURL(e,a)}getInputFileName(e,t){return Object(s.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,a){const s=this.getInputFileName(e);let n=p.a.getDownload(s);if(n)return n;const i=this.getFileDownloadOptions(e,void 0,t,a);n=p.a.download(i),this.downloading.set(e.id,n),h.default.dispatchEvent("download_start",e.id);const o=p.a.getCacheContext(e),d=n;return d.then(e=>{o.url=URL.createObjectURL(e),o.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||r.a.isPlaySupported()||(n=d.then(e=>y(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((a,s)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);r.a.decode(t).then(e=>{o.url=e.url,a()},e=>{delete o.downloaded,s(e)})},t.readAsArrayBuffer(e)}),e})))),n.then(()=>{h.default.dispatchEvent("document_downloaded",e)}),n}saveLottiePreview(e,t,a){const s=e.id+"-"+a;if(this.savingLottiePreview[s])return;e.stickerCachedThumbs||(Object(n.c)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const i=e.stickerCachedThumbs[a];i&&i.w>=t.width&&i.h>=t.height||(this.savingLottiePreview[s]=!0,t.toBlob(n=>{const i={url:URL.createObjectURL(n),w:t.width,h:t.height};e.stickerCachedThumbs[a]=i,delete this.savingLottiePreview[s]}))}saveDocFile(e,t){const a=this.downloadDoc(e,t);return a.then(()=>{const t=p.a.getCacheContext(e);p.a.createDownloadAnchor(t.url,e.file_name)}),a}};m.a.appDocsManager=_,t.a=_},,,function(e,t,a){"use strict";var s=a(29),n=a(62),i=a(33);const r=new class{constructor(){this.serverTimeOffset=0,n.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),i.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};s.a&&(s.a.serverTimeManager=r),t.a=r},,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"d",(function(){return c})),a.d(t,"b",(function(){return l})),a.d(t,"c",(function(){return m}));var s=a(37);class n{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const a=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),a[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),a.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,a)=>{t&&e.push(a)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var i=a(39),r=a(97),o=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class p{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(s.b)("LL",s.a.Error),this.processQueue=Object(r.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return o(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(i.e)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){Object(i.c)(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class c extends d{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(Object(i.c)(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new n(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice(e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return o(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class l extends d{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new n((e,t)=>{const a=Object(i.c)(this.queue,t=>t.div===e);if(t){(a.length?a:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class m extends d{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new n((e,t)=>{const a=Object(i.c)(this.queue,t=>t.div===e);t&&a.length&&a.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},function(e,t,a){"use strict";a.d(t,"a",(function(){return o}));var s=a(16);const n=new Map;let i=0;const r=(e,t,a="")=>{a=t.country_code+a,i=Math.max(i,a.length),n.set(a,{country:e,code:t})};function o(e){e=e||"",n.size||s.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(a=>{r(e,t,a)}):r(e,t)})});let t,a=e.replace(/\D/g,""),o=a.slice(0,i);for(let e=o.length-1;e>=0&&(t=n.get(o.slice(0,e+1)),!t);--e);if(!t)return{formatted:a,country:void 0,code:void 0,leftPattern:""};const p=t.country,d=t.code.patterns||[],c=a.slice(t.code.country_code.length);let l="",m=0,g="";for(let e=d.length-1;e>=0;--e){l=d[e];const t=l.replace(/ /g,"");let a=0;for(let e=0,s=Math.min(c.length,t.length);em&&(m=a,g=l)}l=g||l,l=l.replace(/\d/g,"X"),l=t.code.country_code+" "+l,l.split("").forEach((e,t)=>{" "===e&&" "!==a[t]&&a.length>t&&(a=a.slice(0,t)+" "+a.slice(t))});let h=l&&l.length>a.length?l.slice(a.length):"";return h&&(h=h.replace(/X/g,"‒")),{formatted:a,country:p,code:t.code,leftPattern:h}}},,,,,,function(e,t,a){"use strict";function s(e){}a.d(t,"a",(function(){return s}))},,,function(e,t,a){"use strict";function s(e){const t=document.createElement("span");return t.innerHTML=e,t}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"b",(function(){return i})),a.d(t,"c",(function(){return o})),a.d(t,"d",(function(){return p})),a.d(t,"a",(function(){return d}));var s=a(56),n=a(114);function i(e){return"object"==typeof e&&null!==e}function r(e){return e>>>0}function o(e,t){e=r(e),t=r(t);const a=Object(n.x)(e.toString(16),16,32);Object(n.p)(a,32),Object(n.b)(a,Object(n.x)(t.toString(16),16,32));return Object(n.d)(a,10)}function p(e){return e.map(e=>Object(n.x)(e,10)).sort((e,t)=>Object(n.g)(e,t)).map(e=>Object(n.d)(e,10))}function d(e,t=16,a,n=!1,i=!1){const r=e.byteLength||e.length,o=n?t-r:t-r%t;if(o>0&&o{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=s},,,,,,,,function(e,t,a){"use strict";var s=a(29);class n{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const a=n.MESSAGE_ID_OFFSET,s=t?++this.tempNum:0;return e>=a?t?e+(s&n.MESSAGE_ID_INCREMENT-1):e:a+(e*n.MESSAGE_ID_INCREMENT+(s&n.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const a=n.MESSAGE_ID_OFFSET;if(e{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>h.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&m.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?m.default.subscribe():m.default.unsubscribe())}m.default.setSettings(this.settings)}),v.default.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(i.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),g.default.addEventListener("instance_deactivated",()=>{this.stop()}),g.default.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),g.default.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),g.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&f.a.getPeerId(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,settings:e.notify_settings}),g.default.dispatchEvent("notify_settings",e)}}),g.default.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):m.default.subscribe()}),g.default.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),g.default.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),g.default.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),g.default.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void l.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!y.a.hasChat(e.custom.channel_id)||t.isUser()&&!P.a.hasUser(t)||g.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=g.default.idle.isIDLE){if(d.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=c.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const a=t.getContext("2d");a.beginPath(),a.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),a.fillStyle="#3390ec",a.fill();let n=24,i=""+e;e<10?n=22:e<100?n=20:(i="99+",n=16),n*=window.devicePixelRatio,a.font=`700 ${n}px ${s.b}`,a.textBaseline="middle",a.textAlign="center",a.fillStyle="white",a.fillText(i,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,a=Object(p.b)(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=f.a.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=l.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return l.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(a=>{a&&u.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(p.b)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){l.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{u.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=l.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){l.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t||g.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:a})}isMuted(e){return"peerNotifySettings"===e._&&(1e3*e.mute_until>Object(r.h)()||e.silent)}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:f.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=f.a.getInputNotifyPeerById(e,!0),s=Object(p.b)(t._),n=this.peerSettings[s];if(n&&!(n instanceof Promise))for(let e in n)void 0===a[e]&&(a[e]=n[e])}return a}isPeerLocalMuted(e,t=!0){if(e===g.default.myId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}start(){if(this.updateLocalSettings(),g.default.addEventListener("settings_updated",this.updateLocalSettings),m.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,a=e.key||"k"+t;this.notificationsShown[a]=!0;const s=Object(r.h)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const a=this.notificationsShown[t];"boolean"!=typeof a&&a.tag===e.tag&&(a.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void m.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),_.a.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[a],this.clear())},n.show&&n.show(),this.notificationsShown[a]=n,d.IS_MOBILE||setTimeout(()=>{this.hide(a)},8e3)}}testSound(e){const t=Object(r.h)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",()=>{s.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,m.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(o.b)(this.registeredDevice,e))return!1;l.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;l.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};n.a.appNotificationsManager=I,t.a=I},function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return r}));const s={},n=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function i(e,t,a,i=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(a&&a());if(s[t]&&i||e instanceof HTMLVideoElement)e&&n(e,t),a&&a();else{const i=e instanceof HTMLImageElement,r=i?e:new Image;r.src=t,r.addEventListener("load",()=>{!i&&e&&n(e,t),s[t]=!0,a&&a()},{once:!0}),a&&r.addEventListener("error",a)}}function r(e,t,a){return new Promise(s=>{i(e,t,s,a)})}},,function(e,t,a){"use strict";function s(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}a.d(t,"a",(function(){return s}))},,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var s=a(65),n=a(44),i=a(31),r=a(5),o=a(30),p=a(68);class d{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&Object(r.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(i.g)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(o.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,a=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const i=Date.now()-a;if(!s&&this.cancelable){this.setProgress(100);const e=150;i{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(n.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>s(null)).catch(e=>s(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const a=e.done/e.total*100;this.setProgress(a)})}attach(e,t=!1,a){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,a&&this.attachPromise(a),this.detached||this.preloader.parentElement!==e){const t=Object(p.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(s.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(s.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(p.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},function(e,t,a){"use strict";a.d(t,"b",(function(){return o})),a.d(t,"c",(function(){return p})),a.d(t,"a",(function(){return d})),a.d(t,"e",(function(){return c})),a.d(t,"d",(function(){return l})),a.d(t,"f",(function(){return m}));var s=a(38),n=a(81),i=a(0),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function o(e){let t,a;return e instanceof HTMLVideoElement?(t=e.videoWidth,a=e.videoHeight):(t=e.naturalWidth,a=e.naturalHeight),n={media:e,mediaSize:Object(s.c)(t,a),boxSize:Object(s.c)(320,240),quality:.9},new Promise(e=>{var t,a;const s=document.createElement("canvas"),i=n.mediaSize.aspectFitted(n.boxSize);s.width=i.width*window.devicePixelRatio,s.height=i.height*window.devicePixelRatio,s.getContext("2d").drawImage(n.media,0,0,s.width,s.height),s.toBlob(t=>{e({blob:t,size:i})},null!==(t=n.mimeType)&&void 0!==t?t:"image/jpeg",null!==(a=n.quality)&&void 0!==a?a:1)});var n}function p(e){return new Promise((t,a)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=a,e.currentTime=Math.min(e.duration,1)})}function d(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,a)=>{const s=document.createElement("video");s.volume=0,s.addEventListener("loadedmetadata",()=>t(s),{once:!0}),s.addEventListener("error",a,{once:!0}),s.src=e})}(e);return Promise.race([Object(n.a)(2e3),p(t)])}))}function c(e,t=e.HAVE_METADATA,a){return new Promise(s=>{e.readyState>=t?s():e.addEventListener(i.IS_APPLE_MOBILE&&!a?"loadeddata":"canplay",()=>s(),{once:!0})})}function l(e,t=!1){return r(this,void 0,void 0,(function*(){const a=[],s=(e,n)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,a)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()})))})}else if(e)if(t)a.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((a,s)=>e.file(a,e=>a(t)));if(!s)return;a.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{t.addEventListener("change",t=>{const s=t.target.files[0];s?e(s):a("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),a}},function(e,t,a){"use strict";a.d(t,"f",(function(){return n})),a.d(t,"t",(function(){return d})),a.d(t,"e",(function(){return C})),a.d(t,"q",(function(){return w})),a.d(t,"r",(function(){return k})),a.d(t,"v",(function(){return A})),a.d(t,"u",(function(){return E})),a.d(t,"y",(function(){return T})),a.d(t,"a",(function(){return D})),a.d(t,"k",(function(){return U})),a.d(t,"s",(function(){return x})),a.d(t,"m",(function(){return F})),a.d(t,"j",(function(){return R})),a.d(t,"n",(function(){return V})),a.d(t,"x",(function(){return j})),a.d(t,"l",(function(){return L})),a.d(t,"o",(function(){return q})),a.d(t,"d",(function(){return G})),a.d(t,"c",(function(){return H})),a.d(t,"g",(function(){return z})),a.d(t,"i",(function(){return K})),a.d(t,"h",(function(){return $})),a.d(t,"w",(function(){return Q})),a.d(t,"p",(function(){return Y})),a.d(t,"z",(function(){return ne})),a.d(t,"b",(function(){return ie}));var s,n=0,i=0,r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(n=0;1<1<>=1))-1)+1;var o,p,d=V(1,1,1),c=(V(0,1,1),new Array(0)),l=c,m=c,g=c,h=c,u=c,y=c,f=c,_=c,v=c,P=c,b=c,I=c,S=c;function C(e){var t,a,s;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,s=e[t];s;s>>=1,a++);return a+=n*t}function M(e,t){var a=V(0,(e.length>t?e.length:t)*n,0);return K(a,e),a}function w(e,t){var a=W(e);return re(a,t),de(a,1)}function k(e,t){var a=M(e,e.length+t.length);return function(e,t){var a;l.length!=2*e.length&&(l=new Array(2*e.length));for($(l,0),a=0;at.length?e.length+1:t.length+1);return ne(a,t),de(a,1)}function D(e,t){var a=M(e,e.length>t.length?e.length+1:t.length+1);return ie(a,t),de(a,1)}function U(e,t,a,s,n){var i=0,r=Math.max(e.length,t.length);for(v.length!=r&&(v=new Array(r),P=new Array(r),b=new Array(r),I=new Array(r),S=new Array(r));!(1&e[0]||1&t[0]);)X(e),X(t),i++;for(K(v,e),K(a,t),$(P,1),$(b,0),$(I,0),$(S,1);;){for(;!(1&v[0]);)X(v),1&P[0]||1&b[0]?(ie(P,t),X(P),ne(b,e),X(b)):(X(P),X(b));for(;!(1&a[0]);)X(a),1&I[0]||1&S[0]?(ie(I,t),X(I),ne(S,e),X(S)):(X(I),X(S));if(F(a,v)?(ne(a,v),ne(I,P),ne(S,b)):(ne(v,a),ne(P,I),ne(b,S)),L(v,0)){for(;x(I);)ie(I,t),ne(S,e);return Z(S,-1),K(s,I),K(n,S),void Y(a,i)}}}function x(e){return e[e.length-1]>>n-1&1}function O(e,t,a){var s,n=e.length,i=t.length;for(o=n+a=0;s++)if(e[s]>0)return 1;for(s=n-1+a;s0)return 0;for(s=o-1;s>=a;s--){if(e[s-a]>t[s])return 1;if(e[s-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(Y(t,g=n-g),Y(r,g),o=r.length;0===r[o-1]&&o>p;o--);for($(a,0);!O(t,r,o-p);)se(r,t,o-p),a[o-p]++;for(d=o-1;d>=p;d--){for(r[d]==t[p-1]?a[d-p]=i:a[d-p]=Math.floor((r[d]*s+r[d-1])/t[p-1]);m=(l=(p>1?t[p-2]:0)*a[d-p])>>n,l&=i,m=(c=m+a[d-p]*t[p-1])>>n,c&=i,m==r[d]?c==r[d-1]?l>(d>1?r[d-2]:0):c>r[d-1]:m>r[d];)a[d-p]--;te(r,t,-a[d-p],d-p),x(r)&&(ae(r,t,d-p),a[d-p]--)}Q(t,g),Q(r,g)}function B(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*s+e[a])%t;return n}function V(e,t,a){var s;s=a>(s=Math.ceil(t/n)+1)?a:s;var i=new Array(s);return $(i,e),i}function j(e,t,a){var s,n,i,o,p,d=e.length;if(-1===t){for(i=new Array(0);;){for(o=new Array(i.length+1),n=0;n=36&&(s-=26),!(s>=t||s<0));n++)Z(i,t),J(i,s);for(d=i.length;d>0&&!i[d-1];d--);for(d=a>d+1?a:d+1,o=new Array(d),p=dt.length){for(;a0;a--)n+=e[a]+",";n+=e[0]}else for(;!q(y);)s=ee(y,t),n=r.substring(s,s+1)+n;return 0===n.length&&(n="0"),n}function H(e,t=!0){y.length!==e.length?y=W(e):K(y,e);const a=[];for(;!q(y);)c=ee(y,256),a.push(c);return t&&a.reverse(),a}function z(e,t){return F(e,t)?1:N(e,t)?0:-1}function W(e){return K(p=Array(e.length),e),p}function K(e,t){var a,s=e.length>=n}function J(e,t){var a,r,o,p;for(e[0]+=t,r=e.length,o=0,a=0;a>n))*s),e[a]=o&i,!(o=(o>>n)-p))return}function Q(e,t){var a,s=Math.floor(t/n);if(s){for(a=0;a>t);e[a]>>=t}function X(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&s>>1}function Y(e,t){var a,s=Math.floor(t/n);if(s){for(a=e.length;a>=s;a--)e[a]=e[a-s];for(;a>=0;a--)e[a]=0;t%=n}if(t){for(a=e.length-1;a>0;a--)e[a]=i&(e[a]<>n-t);e[a]=i&e[a]<>n))*s),e[a]=o&i,o=(o>>n)-p}function ee(e,t){var a,n,i=0;for(a=e.length-1;a>=0;a--)n=i*s+e[a],e[a]=Math.floor(n/t),i=n%t;return i}function te(e,t,a,s){var r,o,p,d;for(p=e.length>=n;for(r=p;o&&r>=n}function ae(e,t,a){var s,r,o,p;for(o=e.length>=n;for(s=o;r&&s>=n}function se(e,t,a){var s,r,o,p;for(o=e.length>=n;for(s=o;r&&s>=n}function ne(e,t){var a,s,r;for(r=e.length>=n;for(a=r;s&&a>=n}function ie(e,t){var a,s,r;for(r=e.length>=n;for(a=r;s&&a>=n}function re(e,t){h.length!==e.length?h=W(e):K(h,e),u.length!==e.length&&(u=W(e)),R(h,t,u,e)}function oe(e,t,a){var s;for(m.length!=2*e.length&&(m=new Array(2*e.length)),$(m,0),s=0;s0&&!e[o-1];o--);for(p=o>t.length?2*o:2*t.length,m.length!=p&&(m=new Array(p)),$(m,0),a=0;a>=n,s=a+1;s>=n;m[a+o]=r}re(m,t),K(e,m)}function de(e,t){var a,s;for(a=e.length;a>0&&!e[a-1];a--);return K(s=new Array(a+t),e),s}function ce(e,t,a){var i,r,o,p;if(f.length!=a.length&&(f=W(a)),0!=(1&a[0])){for($(f,0),o=a.length;o>0&&!a[o-1];o--);for(p=s-function(e,t){for(var a=1,s=0;;){if(1===e)return a;if(0===e)return 0;if(s-=a*Math.floor(t/e),1===(t%=e))return s;if(0===t)return 0;a-=s*Math.floor(e/t),e%=t}}(B(a,s),s),f[o]=1,oe(e,f,a),g.length!=e.length?g=W(e):K(g,e),i=t.length-1;i>0&!t[i];i--);if(0!=t[i]){for(r=1<>=1);for(;;){if(!(r>>=1)){if(--i<0)return void le(e,d,a,p);r=1<0&&0==a[m-1];m--);for(;g>0&&0==t[g-1];g--);for(l=_.length-1,r=0;r>n,c=e[r],o=1;o>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++;for(;o>=n,o++;for(;o>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++;for(;o>=n,o++;for(;o>=n,o++;_[o-1]=p&i}F(a,_)||ne(_,a),K(e,_)}},,function(e,t,a){"use strict";var s=a(106),n=a(36),i=a(66),r=a(47),o=a(32),p=a(15),d=a(72),c=a(43),l=a(55),m=a(41);const g=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){const s=c.a.getInputPeerById(e);let n,i=!1,r=this.savedAvatarURLs[e];if(r&&r[a])"string"!=typeof r[a]?n=r[a]:(n=Promise.resolve(r[a]),i=!0);else{r||(r=this.savedAvatarURLs[e]={});const i={_:"inputPeerPhotoFileLocation",pFlags:{},peer:s,photo_id:t.photo_id};"photo_big"===a&&(i.pFlags.big=!0);const o={dcId:t.dc_id,location:i},p=d.a.download(o);n=r[a]=p.then(e=>r[a]=URL.createObjectURL(e))}return{cached:i,loadPromise:n}}putAvatar(e,t,a,r,o=new Image,d=!1){let c,m,g,{cached:h,loadPromise:u}=this.loadAvatar(t,a,r);if(o.classList.add("avatar-photo"),h)m=()=>{Object(n.a)(e,o),e.dataset.color=""};else{const d=p.default.settings.animationsEnabled;if(d&&o.classList.add("fade-in"),"photo_big"===r){const s=this.putAvatar(e,t,a,"photo_small");c=s.loadPromise,g=s.thumbImage}else if(a.stripped_thumb){g=new Image,e.classList.add("avatar-relative"),g.classList.add("avatar-photo","avatar-photo-thumbnail");const t=l.a.getPreviewURLFromBytes(a.stripped_thumb);c=Object(s.b)(g,t).then(()=>{Object(n.a)(e,g)})}m=()=>{g?e.append(o):Object(n.a)(e,o),setTimeout(()=>{e.childElementCount&&i.a.mutateElement(o,()=>{e.dataset.color="",d&&o.classList.remove("fade-in"),g&&g.remove()})},d?200:0)}}const y=u.then(e=>Object(s.b)(o,e)).then(m);return{cached:h,loadPromise:c||y,thumbImage:g}}s(e,t,a,s){e.innerHTML=t,e.dataset.color=a,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}putPhoto(e,t,a=!1,s="",n=!1){var i;const d=p.default.myId;if(t===d&&a)return void this.s(e,"","","tgico-saved");if(t!==r.c&&t.isUser()){const a=m.a.getUser(t);if(a&&a.pFlags&&a.pFlags.deleted)return void this.s(e,"",c.a.getPeerColorById(t),"tgico-deletedaccount")}const l=c.a.getPeerPhoto(t),g=!!l,h=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!h||!this.savedAvatarURLs[t]){let n,p="";if(!t||t===d&&a||(p=c.a.getPeerColorById(t)),t===r.d)return void this.s(e,"",p,"tgico-reply_filled");if(s)n=o.b.getAbbreviation(s);else{n=null!==(i=c.a.getPeer(t).initials)&&void 0!==i?i:""}this.s(e,n,p,"")}if(g){const a="photo_small";return this.putAvatar(e,t,l,a,void 0,n)}}};t.a=g},function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));const s=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const a=e;return()=>!a.cleaned&&(!t||t())}}}},function(e,t,a){"use strict";var s;!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={})),t.a=s},,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=a(134);class n{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(s.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=Object(s.c)(e,this.options));const a=[],n=e.split(" "),i=n.length;t.forEach((e,t)=>{let s=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(a.map(e=>e.what))}}},function(e,t,a){"use strict";a.d(t,"b",(function(){return r})),a.d(t,"a",(function(){return g}));var s=a(64);const n=new Map,i=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const p=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(d)},d=()=>{i.forEach(c),i.clear()};window.addEventListener("resize",()=>{for(const[e]of n)i.add(e);p()},{capture:!0,passive:!0});const c=e=>{let t=n.get(e);const a=!t;let{text:i,textLength:o,from:p,multiplier:d,font:c,textWidth:l,elementWidth:g}=t||{};a&&(i=e.textContent,o=i.length,p=50,d=p>0&&p/100,c=`${e.dataset.fontWeight||400} 16px ${r}`,l=m(i,c),g=e.getBoundingClientRect().width,t={text:i,textLength:o,from:p,multiplier:d,font:c,textWidth:l,elementWidth:g},n.set(e,t));const h=e.getBoundingClientRect().width,u=a||g!==h;if(!a&&u&&(t.elementWidth=g=h),u)if(l>g){e.setAttribute("title",i);let a=i,n=g;for(;a.length>3;){let t=a.length;const i=d&&Object(s.a)(d*t<<0,1,t-2)||Math.max(t+p-1,1),r=a.substr(0,i).replace(/\s*$/,""),o=a.substr(i+1).replace(/^\s*/,"");if(a=r+o,n=m(a+"…",c),n{this.drafts=e||{}}),s.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=n.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();i.a.getDialogOnly(t)||i.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=d.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,a,n={}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.a.set({drafts:this.drafts}),n.notify&&s.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n.force}),i}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(m.b)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(l.b)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),a=e.entities||[],s=o.b.mergeEntities(a.slice(),t);return e.rMessage=o.b.wrapDraftText(e.message,{entities:s}),e.reply_to_msg_id&&(e.reply_to_msg_id=u.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,r=!1){return f(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,a))return!0;let l,m={peer:n.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(a))l={_:"draftMessageEmpty"};else{Object(y.a)(a);let e=a.message,t=a.entities;a.reply_to_msg_id&&(m.reply_to_msg_id=u.a.getServerMessageId(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(m.entities=i.a.getInputEntities(t)),a.pFlags.no_webpage&&(m.no_webpage=a.pFlags.no_webpage),m.message=e}const g=l||a;return g.date=Object(c.h)(!0)+p.a.serverTimeOffset,this.saveDraft(e,t,g,{notify:!0,force:r}),!(s&&!t)||d.a.invokeApi("messages.saveDraft",m)}))}clearAllDrafts(){return d.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");s.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}})}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft(e,t,n,{notify:!0,force:!0})}};g.a.appDraftsManager=_,t.a=_},function(e,t,a){"use strict";var s=a(29);class n{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId;try{const a=this.createAudio();a.autoplay=!0,a.src="assets/audio/"+e,a.loop=t,a.play()}catch(t){console.error("playSound",e,t)}}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){var e;null===(e=this.audio)||void 0===e||e.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,a){const s=++this.tempId;setTimeout(()=>{this.tempId===s&&this.playSound(e,t)},a)}}var i=a(31),r=a(61),o=a(142),p=a(166),d=a(118),c=a(163),l=a(150),m=a(170),g=a(148),h=a(149),u=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};var y=a(138),f=a(37),_=a(33),v=a(47),P=a(15),b=a(74),I=a(51),S=a(43),C=a(41),M=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const w=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,a;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(a=e.presentation)||void 0===a?void 0:a.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=Object(f.b)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,P.default.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),P.default.addEventListener("group_call_update",e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}}),this.audioAsset=new n(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"])}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const{currentGroupCall:s}=this,n=this.getCachedParticipants(e),r=S.a.getPeerId(t.peer),o=n.get(r),p=t.pFlags.left;if(!o&&p)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const d=(null==s?void 0:s.id)===e;o?(Object(i.i)(o,t),t=o):n.set(r,t),d&&s.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const c=this.getGroupCall(e);if("groupCall"===(null==c?void 0:c._)){let e=!1;p?(--c.participants_count,e=!0):!t.pFlags.just_joined||o||t.pFlags.self||(++c.participants_count,e=!0),e&&P.default.dispatchEvent("group_call_update",c)}p&&n.delete(r),o&&this.doNotDispatchParticipantUpdate!==r&&P.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach(t=>this.saveApiParticipant(e,t,a)))}editParticipant(e,t,a){return M(this,void 0,void 0,(function*(){if(!Object.keys(a).length)return;if(t){const{currentGroupCall:s}=this,n=(null==s?void 0:s.id)===e&&t.pFlags.self;if(n&&void 0!==a.muted&&!s.isSharingAudio&&(delete a.muted,!Object.keys(a).length))return;const i=a.muted;void 0!==i&&t.pFlags.self&&(i?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==a.raiseHand&&(a.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),n&&(void 0!==a.videoStopped&&(a.videoStopped?delete t.video:t.video=this.generateSelfVideo(s.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&s.setMuted(!1),s.dispatchEvent("state",s.state)),P.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const s=t.pFlags.self?v.c:S.a.getPeerId(t.peer),n=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:w.getGroupCallInput(e),participant:s===v.c?S.a.getInputPeerSelf():S.a.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});b.a.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return M(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return _.a.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{C.a.saveApiUsers(t.users),I.a.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&Object(i.i)(a,e),e=a):this.groupCalls.set(e.id,e),s&&P.default.dispatchEvent("group_call_update",e),e}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}setCurrentGroupCall(e){this.currentGroupCall=e,e&&P.default.dispatchEvent("group_call_instance",e)}createGroupCall(e,t,a){return M(this,void 0,void 0,(function*(){const s=yield _.a.invokeApi("phone.createGroupCall",{peer:S.a.getInputPeerById(e.toPeerId(!0)),random_id:Object(r.a)(32),schedule_date:t,title:a});b.a.processUpdateMessage(s);return s.updates.find(e=>"updateGroupCall"===e._).call}))}joinGroupCall(e,t,a=!0,s,n){return M(this,void 0,void 0,(function*(){let i;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${a} rejoin=${s}`),i=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return u(this,void 0,void 0,(function*(){const a={audio:Object(m.a)(),video:t&&Object(h.a)()},s=new l.a(c.b);try{const t=yield Object(g.a)(a,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,a),s.inputStream=new MediaStream}return s}))}(a,n),this.joinGroupCallInternal(e,t,i,a,s,n)}))}joinGroupCallInternal(e,t,a,s,n=!1,i){return M(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);let{currentGroupCall:o}=this;if(!o||!n){o=new p.a({chatId:e,id:t}),o.fixSafariAudio(),o.addEventListener("state",e=>{this.currentGroupCall===o&&e===d.a.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),P.default.dispatchEvent("chat_update",o.chatId))}),o.groupCall=yield this.getGroupCallFull(t);const c=o.createConnectionInstance({streamManager:a,type:"main",options:{type:"main",isMuted:s,joinVideo:i,rejoin:n}}),l=c.createPeerConnection();return l.addEventListener("negotiationneeded",()=>{c.negotiate()}),l.addEventListener("track",e=>{r("ontrack",e),o.onTrack(e)}),l.addEventListener("iceconnectionstatechange",()=>{o.dispatchEvent("state",o.state);const{iceConnectionState:e}=l;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":break;case"closed":o.hangUp();break;case"completed":break;case"connected":o.joined||(o.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then(({participants:e})=>{this.saveApiParticipants(t,[...e.values()])}));break;case"disconnected":break;case"failed":o.hangUp()}}),c.createDescription(),c.createDataChannel(),c.appendStreamToConference(),this.setCurrentGroupCall(o),r("set currentGroupCall",t,o),this.startConnectingSound(),c.negotiate()}o.handleUpdateGroupCallParticipants=!1,o.updatingSdp=!1,r("update currentGroupCall",t,o)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const a=this.currentGroupCall.connections.main.sources,s=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:a.audio.source,video:this.generateSelfVideo(a.video),presentation:s&&this.generateSelfVideo(s.video,null===(t=s.audio)||void 0===t?void 0:t.source),date:Object(o.a)(!0),peer:S.a.getOutputPeer(P.default.myId)}}makeSsrcFromParticipant(e,t,a,s){return Object(y.c)(t,a,s)}getGroupCallParticipants(e){return M(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield _.a.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;I.a.saveApiChats(t.chats),C.a.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,a=!1){return M(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${a}`);const{currentGroupCall:s}=this;(null==s?void 0:s.id)===e&&s.hangUp(t,a)}))}toggleMuted(e){return this.changeUserMuted(v.c,e)}changeUserMuted(e,t){const{currentGroupCall:a}=this;if(!a)return;const s=a.getParticipantByPeerId(e);return v.c===e&&s.pFlags.can_self_unmute&&(t=void 0===t?!s.pFlags.muted:t),this.editParticipant(a.id,s,{muted:t})}};s.a&&(s.a.appGroupCallsManager=w);t.a=w},,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return r})),a.d(t,"b",(function(){return p})),a.d(t,"c",(function(){return d}));var s=a(143);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g;function r(e){return e.replace(n,"").replace(i,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=s.a.LatinizeMap[e];return void 0!==t?t:e})}function p(e,t=!0){const a="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),a&&(e="%"+e),e}function d(e,t={}){const a=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),e}},function(e,t,a){"use strict";a.d(t,"a",(function(){return s})),a.d(t,"b",(function(){return i}));var s,n=a(29);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(s||(s={}));class i{constructor(){this.sliceConstructor=i.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=s.None}isEnd(t){if((this.end&t)===t)return!0;let a=!1;if(t===s.Top){const s=e.last;a=!!(s.end&t)&&this.includes(s[s.length-1])}else if(t===s.Bottom){const s=e.first;a=!!(s.end&t)&&this.includes(s[0])}else if(t===s.Both)return this.isEnd(s.Top)&&this.isEnd(s.Bottom);return a&&this.setEnd(t),a}setEnd(e){this.end|=e}unsetEnd(e){this.end^=e}splice(t,a,...n){const i=super.splice(t,a,...n);if(!this.length){const t=e.slices,a=t.indexOf(this);-1!==a&&(1===t.length?this.unsetEnd(s.Both):t.splice(a,1))}return i}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let a=0,s=e.length;aa[0])break}this.slices.splice(t,0,this.constructSlice(...e)),p=t}return t?this.flatten(p):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,a=this.slices.length;t=t[s])return{slice:t,offset:e===t[s]?s:s-1}}if(t&&t.isEnd(s.Top))return{slice:t,offset:t.length}}sliceMe(e,t,a){let n=this.slice,i=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;n=t.slice,i=r=t.offset,n.includes(e)&&(r+=1)}let o=Math.max(r+t,0),p=r+t+a;const d=n.slice(o,p),c=t<0?a+t:a,l=Math.abs(t),m=n.length-r>=c||!!n.isEnd(s.Top)&&(d.setEnd(s.Top),!0),g=r-l>=0||!!n.isEnd(s.Bottom)&&(d.setEnd(s.Bottom),!0);return{slice:d,offsetIdOffset:i,fulfilled:s.None|(m&&g?s.Both:(m?s.Top:s.None)|(g?s.Bottom:s.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(s.Bottom)||(t=this.constructSlice(),t.setEnd(s.Bottom),this.slices.unshift(t)):t.setEnd(s.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(s.Top)||(t=this.constructSlice(),t.setEnd(s.Top),this.slices.push(t)):t.setEnd(s.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}n.a&&(n.a.SlicedArray=i)},function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(37),r=a(33),o=a(32),p=a(15),d=a(74),c=a(104),l=a(42),m=a(43),g=a(41);const h=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(i.b)("POLLS",i.a.Error),p.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,p.default.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=o.a.parseMarkdown(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map(e=>a.answers[e].option),n=e.mid,i=e.peerId,o=m.a.getInputPeerById(i);return e.pFlags.is_outgoing?l.a.invokeAfterMessageIsSent(n,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:c.a.getServerMessageId(e.mid),options:s}).then(e=>{this.log("sendVote updates:",e),d.a.processUpdateMessage(e)})}getResults(e){const t=m.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:c.a.getServerMessageId(e.mid)}).then(e=>{d.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,a,s=20){return r.a.invokeApi("messages.getPollVotes",{peer:m.a.getInputPeerById(e.peerId),id:c.a.getServerMessageId(e.mid),option:t,offset:a,limit:s}).then(e=>(this.log("getPollVotes messages:",e),g.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=Object(n.a)(t);return a.pFlags.closed=!0,l.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};s.a.appPollsManager=h,t.a=h},function(e,t,a){"use strict";function s(e){return e<<0}function n(e){return e>>>0}function i(e,t=3){if(!e)return 0;const{length:a}=e;let s=0;for(let t=0;t"sendrecv"===a.direction&&a.type===e&&!(t?a.sendEntry:a.recvEntry));return a||(a=this.createEntry(e),a.setDirection("sendrecv")),a}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return i.a.fromConference(Object.assign({conference:this},e))}}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return u}));var s=a(45),n=a(77),i=a(44),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const o=[];let p=!1;function d(e,t="push"){return e.items.length?(e.promise=Object(s.a)(),o[t](e),function e(){if(!p){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),a=[];return new Promise((s,o)=>{const p=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(n.c)();const s=e.process.apply(e.context,t.shift());let i;if(s instanceof Promise)try{i=yield s}catch(e){return void o(e)}else i=s;a.push(i)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(i.b)(p):s(a)}));Object(i.b)(p)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{p=!1,o.length&&e()})}}(),e.promise):Promise.resolve([])}const c="filter"in(document.createElement("canvas").getContext("2d")||{});let l,m;function g(e,t,a){return new Promise(s=>{const n=document.createElement("canvas");n.width=e.width,n.height=e.height;const i=n.getContext("2d",{alpha:!1});c?(i.filter=`blur(${t}px)`,i.drawImage(e,2*-t,2*-t,n.width+4*t,n.height+4*t)):(i.drawImage(e,0,0),m(i,0,0,n.width,n.height,t,a)),s(n.toDataURL())})}l=c?Promise.resolve():a.e(31).then(a.bind(null,176)).then(e=>{m=e.default});const h=new Map;function u(e,t=2,a=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(h.size>1e3&&h.clear(),h.has(e))return h.get(e);const s=new Promise(s=>{l.then(()=>{const n=new Image;n.onload=()=>{c?g(n,t,a).then(s):d({items:[[n,t,a]],context:null,process:g},"unshift").then(e=>{s(e[0])})},n.src=e})});return h.set(e,s),s}},,,,,function(e,t,a){"use strict";var s=a(42),n=a(67),i=a(56),r=a(31),o=a(29),p=a(33),d=a(91),c=a(37);const l=new class{constructor(){this.contexts=new Map,this.links={},this.log=Object(c.b)("RD",void 0,!0),p.a.addTaskListener("refreshReference",e=>{const t=e.payload;Object(d.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>p.a.postMessage(e))})}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[Object(i.f)(e)]=e;for(const e of a)if(Object(r.b)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[Object(i.f)(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if(Object(r.b)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[Object(i.f)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=s.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||n.a.getAnimatedEmojiSounds(!0).then(()=>{this.refreshEmojiesSoundsPromise=void 0});break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const r=Object(i.f)(e);return this.log("refreshReference: refreshing reference:",r),a.then(()=>{const a=Object(i.f)(e);if(this.log("refreshReference: refreshed, reference before:",r,"after:",a),r!==a)return e;this.deleteContext(e,t);const s=this.getContext(e);if(s)return this.refreshReference(e,s[0]);throw this.log.error("refreshReference: no new context, reference before:",r,"after:",a,t),"NO_NEW_CONTEXT"})}};o.a.referenceDatabase=l,t.a=l},function(e,t,a){"use strict";function s(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";var s;a.d(t,"a",(function(){return s})),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(s||(s={}))},function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const a=yield navigator.mediaDevices.getUserMedia(e);return a.getTracks().forEach(e=>{e.enabled=!t}),a}))}window.getStream=n},function(e,t,a){"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var s=a(37),n=a(15),i=a(163),r=a(164),o=a(137);class p{constructor(e,t){const a=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain();s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,a.connect(s)}}class d{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:a,track:s,source:n,type:i}=e,r=t.analyser;if(!r)return;const p=new Uint8Array(r.frequencyBinCount);r.getByteFrequencyData(p);return{type:i,source:n,stream:a,track:s,value:Object(o.b)(p)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter(e=>"input"===e.type)).filter(e=>"audio"===e.kind).slice(0,i.a).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),n.default.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=Object(s.b)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0}addStream(e,t){e.getTracks().forEach(a=>{this.addTrack(e,a,t)})}addTrack(e,t,a){this.log("addTrack",a,t,e);const{context:s,items:n,inputStream:i,outputStream:r}=this,o=t.kind,c=d.getSource(e,a);switch(a){case"input":i?i.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)},{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find(t=>"input"===t.type&&t.kind===e)}static getSource(e,t){return"input"===t?e.source||e.id:""+Object(o.c)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let a=!1;for(let s=0,n=t.length;!a&&se.direction===a&&e.type===t);if(!i){if(!s)continue;i=e.createEntry(t)}let{transceiver:o}=i;o||(o=i.createTransceiver(e.connection,n)),i.direction!==o.direction&&(o.direction=i.direction);const p=r.find(e=>e.kind===t),d=o.sender;d.track!==p&&d.replaceTrack(p).catch(e=>{this.log.error(e)})}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach(e=>{Object(r.a)(e)})}catch(e){this.log.error(e)}}}},,,,,,,,function(e,t,a){"use strict";const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate);t.a=s},function(e,t,a){"use strict";var s=a(29),n=a(0),i=a(37),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(i.b)("OPUS",i.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},n.IS_SAFARI?void 0:t.map(e=>e.buffer))}))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},n.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout(()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())},1e4)}pushDecodeTask(e,t){return new Promise((a,s)=>{const n={pages:e,withWaveform:t,callback:{resolve:a,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(n)&&this.executeNewTask(n)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};s.a.opusDecodeController=o,t.a=o},function(e,t,a){"use strict";var s=a(55),n=a(75),i=a(32),r=a(15),o=a(31),p=a(88),d=a(29);const c=new Set(["photo","video","gif","document"]);const l=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var d,l;if("webPageNotModified"===e._)return;const{id:m}=e,g=this.webpages[m],h=g&&g._===e._&&g.hash==g.hash;if("webPage"===e._){"photo"===(null===(d=e.photo)||void 0===d?void 0:d._)?e.photo=s.a.savePhoto(e.photo,a):delete e.photo,"document"===(null===(l=e.document)||void 0===l?void 0:l._)?e.document=n.a.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=Object(p.f)(r,80,100),e.rTitle=i.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let o="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(o=t[0]+"/issues/{1}")}const m=Object(p.f)(e.description||"",150,180);e.rDescription=i.a.wrapRichText(m,{contextSite:t||"external",contextHashtag:o}),c.has(e.type)||e.description||!e.photo||(e.type="photo")}let u=this.pendingWebPages[m];if(t&&(u||(u=this.pendingWebPages[m]=new Set),u.add(t)),void 0===g?this.webpages[m]=e:Object(o.i)(g,e),!t&&void 0!==u&&h){const e=[];u.forEach(t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})}),r.default.dispatchEvent("webpage_updated",{id:m,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getWebPage(e){return this.webpages[e]}};d.a&&(d.a.appWebPagesManager=l),t.a=l},function(e,t,a){"use strict";var s=a(129);const n=new Set(["image/jpeg","image/png","image/bmp"]);s.a&&n.add("image/webp"),t.a=n},,function(e,t,a){"use strict";a.d(t,"a",(function(){return s})),a.d(t,"b",(function(){return n}));const s=50,n=100},function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=a(57);function n(e){e.stop(),Object(s.a)(e,"ended")}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return aa}));var s=a(0),n=a(39),i=a(31),r=a(97),o=a(74),p=a(126),d=a(43),c=a(37),l=a(62),m=a(95),g=a(56),h=a(29),u=a(114),y={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:739712882,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:142306870,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactons",type:"flags.1?Vector"}],type:"MessageReactions"},{id:-1826077446,predicate:"messageUserReaction",params:[{name:"user_id",type:"long"},{name:"reaction",type:"string"}],type:"MessageUserReaction"},{id:-1553558980,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"}]},layer:137},f=a(162),_=a(174),v=a.n(_),P=a(61),b=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const I="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function S(e){return I.digest("SHA-1",Object(g.i)(e)).then(e=>new Uint8Array(e))}function C(e){return I.digest("SHA-256",Object(g.i)(e)).then(e=>new Uint8Array(e))}function M(e,t,a){e=Object(m.a)(e);const s=new f.a(Object(g.g)(t),Object(g.g)(a)).encrypt(Object(g.g)(e));return Object(g.d)(s)}function w(e,t,a){const s=new f.a(Object(g.g)(t),Object(g.g)(a)).decrypt(Object(g.g)(e));return Object(g.d)(s)}function k(e,t){const a=Object(u.x)(t.modulus,16),s=Object(u.x)(t.exponent,16),n=Object(u.x)(Object(g.f)(e),16),i=Object(u.v)(n,s,a);return Object(g.c)(Object(u.d)(i,16))}function A(e,t,a){return b(this,void 0,void 0,(function*(){const s=yield I.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return I.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},s,512).then(e=>new Uint8Array(e))}))}function E(e){let t;try{t=function(e){var t,a,s,n,i,r,o=Math.ceil(64/u.f)+1,p=0,d=new Array(o),c=new Array(o),l=new Array(o),m=new Array(o),g=new Array(o),h=new Array(o),y=new Array(o);for(t=0;t<3;++t){for(a=17+(15&Object(P.a)(8)),Object(u.i)(h,Object(u.q)(Object(u.n)(Object(P.a)(32),32,0),e)),Object(u.i)(y,h),n=1<"boolFalse"===e.predicate).id,x=+y.API.constructors.find(e=>"boolTrue"===e.predicate).id,O=+y.API.constructors.find(e=>"vector"===e.predicate).id,F=+y.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class R{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(x,(t||"")+":bool"):this.writeInt(U,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);let a;"string"!=typeof e&&(e=e?e.toString():"0"),"-"===e[0]?(a=Object(u.n)(0,64,8),Object(u.z)(a,Object(u.x)(e.slice(1),10,64))):a=Object(u.x)(e,10,64);const s=Object(u.d)(a,16).slice(-16),n=Object(m.a)(Object(g.c)(s).reverse(),8,!0,!0,!1);this.storeRawBytes(n)}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",Object(g.f)(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",Object(g.f)(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",Object(g.f)(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?y.MTProto:y.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(let e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(O,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(let t in p)this.intView[p[t]]=e[t];return r.type}}class B{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=this.readInt((e||"")+":long[high]"),s=Object(m.c)(a,t);if(!this.mtproto){const e=+s;if(Number.isSafeInteger(e))return e}return s}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===x||t!==U&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t),!s)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===F){const a=D(this.fetchBytes(t+"[packed_string]"));return new B(a).fetchObject(e,t)}if(i===O)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e{const t=new Uint8Array(e.length);for(let a=0;a{const a=Object(u.y)(t,e);return!(Object(u.s)(a)||Object(u.e)(a)<1984||Object(u.e)(e)<1984||Math.floor((Object(u.e)(e)+7)/8)>256)},{a:I,a_for_hash:S,u:C}=yield(()=>j(this,void 0,void 0,(function*(){for(;;){const e=Object(u.x)(Object(g.f)(c(t.secure_random)),16),a=Object(u.v)(i,e,n);if(b(a,n)){const t=Object(g.c)(Object(u.d)(a,16)),s=yield q.invokeCrypto("sha256-hash",Object(g.a)(t,f)),n=Object(u.x)(s.hex,16);if(!Object(u.o)(n)&&!Object(u.s)(n))return{a:e,a_for_hash:t,u:n}}}})))();let M;M=Object(u.m)(l,P)?l:Object(u.a)(l,n),M=Object(u.q)(Object(u.y)(M,P),n);const w=Object(u.r)(C,o),k=Object(u.a)(I,w),A=Object(u.v)(M,k,n),E=yield q.invokeCrypto("sha256-hash",p(Object(g.c)(Object(u.d)(A,16)),256));let T=yield q.invokeCrypto("sha256-hash",h);const D=yield q.invokeCrypto("sha256-hash",y);T=Object(g.h)(T,D);const U=Object(g.a)(T,yield q.invokeCrypto("sha256-hash",s.salt1),yield q.invokeCrypto("sha256-hash",s.salt2),S,f,E),x=yield q.invokeCrypto("sha256-hash",U);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(S),M1:x}}))}class N extends V.a{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":S,"sha256-hash":C,pbkdf2:A,"aes-encrypt":M,"aes-decrypt":w,"rsa-encrypt":k,factorize:E,"mod-pow":T,gzipUncompress:D,computeSRP:L}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}}var q=new N,G=a(119);const H=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,l.a.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|Object(P.a)(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Object(m.c)(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;l.a.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;const n={type:"applyServerTimeOffset",payload:a};return Object(G.e)(n),s}};h.a.timeManager=H;var z=H,W=a(7),K=a(63),$=a(76),J=a(81),Q=a(45),X=a(48),Y=a(153);class Z{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class ee{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new Z(t),this._aes=new f.b(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0,ge.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(se.a.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(se.a.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=c.a.Error|c.a.Log;this.debug&&(i|=c.a.Debug),this.log=Object(c.b)("TCP-"+t+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&ge.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",s.length),i||(i=a.encoded=this.encodeBody(s)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ie=0;class re extends X.a{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ie,oe.set(this.id,this);const s={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};Object(G.d)(s)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};Object(G.d)(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};Object(G.d)(e)}}const oe=new Map,pe=K.a.test?"_test":"";class de{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=K.a.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+pe,i=`wss://${W.a.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`,r="upload"===t?"-U":"download"===t?"-D":"",o=s.IS_SAFARI&&G.b&&void 0!==re?re:Y.a;return new ne(o,e,i,r,1e4)},this.transportHTTP=(e,t,a)=>{let s;if(K.a.ssl||!K.a.http){s="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(K.a.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new ue(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=K.a.transport,s=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const n=this.chosenServers[a][t];e in n||(n[e]=[]);const i=n[e];if(!i.length||!s){let n;const r="client"===t?"":"-1";return n=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),n?(s&&i.push(n),n):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const i in e[a][s]){const r=e[a][s][i];Object(n.e)(r,t)}}}var ce=new de,le=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class me extends X.a{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return le(this,void 0,void 0,(function*(){const e=this.transports={https:ce.chooseServer(W.a.baseDcId,"client","https",!1),websocket:ce.chooseServer(W.a.baseDcId,"client","websocket",!1)},t=Object(Q.a)();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=Object(Q.a)(),s=e.websocket;s.setAutoReconnect(!1),s.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),s.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>a.resolve(!1),2e3);const[n,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:n||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return le(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield Object(J.a)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}var ge=new me,he=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class ue{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=K.a.debug&&!1;let s=c.a.Error|c.a.Log;this.debug&&(s|=c.a.Debug),this.log=Object(c.b)("HTTP-"+e+a,s),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,ge.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return he(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new R({mtproto:!0}),a=Object(P.b)();t.storeMethod("ping",{ping_id:a});const s={msg_id:z.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(se.a.Connecting),this.sendEncryptedRequest(s).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=ye.a.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=Object(g.i)(this.authKey),this.serverSalt=Object(g.i)(s),this.isFileUpload=!!n.fileUpload,this.isFileDownload=!!n.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=Object(c.b)(this.name,c.a.Log|c.a.Debug|c.a.Error|c.a.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&Object(n.d)(t.inner,(e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)}),t.msg_id=z.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new R({mtproto:!0});s.storeMethod(e,t);const n=z.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return K.a.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new R({mtproto:!0});a.storeObject(e,"Object");const s=z.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return K.a.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new R(a);if(!this.connectionInited){const e=y.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(y.layer,"layer");const t=y.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(W.a.id,"api_id"),s.storeString(be.userAgent||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(W.a.version+(W.a.isMainDomain?" "+W.a.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(W.a.langPack,"lang_pack"),s.storeString(be.language,"lang_code")}if(a.afterMessageId){if(void 0===_e){const e=y.API.methods.find(e=>"invokeAfterMsg"===e.method);_e=e?+e.id:0}_e?(s.storeInt(_e,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:z.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return K.a.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),de.removeTransport(ce.chosenServers,this.transport),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof ue&&(this.longPollInterval=ye.a.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(se.a.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(se.a.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=ye.a.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(se.a.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?se.a.Closed:se.a.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{a.forEach(t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}})})}pushMessage(e,t){const a=new Promise((a,s)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:s}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),Object(m.b)(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(se.a.TimedOut))},5e3);a.catch($.a).finally(()=>{clearTimeout(t),this.setConnectionStatus(se.a.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=ye.a.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===se.a.Connected,s=this.status!==e;this.isOnline=a,this.status=e,s&&(be.onConnectionStatusChange&&be.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return fe(this,void 0,void 0,(function*(){const a=t?0:8,s=Object(g.a)(this.authKeyUint8.subarray(88+a,88+a+32),e),n=yield q.invokeCrypto("sha256-hash",s);return new Uint8Array(n).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,s=new Uint8Array(52),n=new Uint8Array(52),i=[];return s.set(e,0),s.set(this.authKeyUint8.subarray(a,a+36),16),i.push(q.invokeCrypto("sha256-hash",s)),n.set(this.authKeyUint8.subarray(40+a,40+a+36),0),n.set(e,36),i.push(q.invokeCrypto("sha256-hash",n)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]})}isStopped(){return be.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,s=!1,n=!1,i=!1;const r=Object(m.d)(Object.keys(this.pendingMessages));for(const o of r){const r=this.sentMessages[o];if(r&&r.body){const o=r.body.length+32;if(a+o>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=o,r.isAPI?s=!0:r.longPoll&&(n=!0),e=r}delete this.pendingMessages[o]}if(this.transport instanceof ue&&s&&!n){const e=new R({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:z.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const o=t.filter(e=>e.noResponse).map(e=>e.msg_id);if(t.length>1){const s=this.generateContainerMessage(a,t);e=s.messageWithBody,this.sentMessages[e.msg_id]=s.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const p=this.sendEncryptedRequest(e);this.transport instanceof ue&&this.handleSentEncryptedRequestHTTP(p,e,o),this.transport instanceof ue||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new R({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const n={msg_id:z.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return K.a.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return fe(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield q.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>q.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new R({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+Object(P.a)(8)%5),n=new Uint8Array(s).randomize(),i=Object(g.a)(a,n);return this.getEncryptedMessage(i).then(e=>{const t=new R({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof ue))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw s;return e},e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})})}parseResponse(e){this.lastResponseTime=Date.now();const t=new B(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!Object(g.b)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then(e=>this.getMsgKey(e,!1).then(t=>{if(!Object(g.b)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new B(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!(Object(g.b)(n,this.sessionId)||this.prevSessionId&&Object(g.b)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+Object(g.f)(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const c=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const l=o-d;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new B(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))}applyServerSalt(e){const t=function(e){const t=new Uint8Array(Object(u.c)(Object(u.x)(e,10),!1));return Object(m.a)(t,8,!0,!1,!1)}(e);l.a.set({["dc"+this.dcId+"_server_salt"]:Object(g.f)(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof ue&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof ue&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof ue&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=Object(u.x)(t,10);Object(u.w)(a,32);const s=z.applyServerTime(+Object(u.d)(a,10));(17===e.error_code||s)&&(this.log("Update session"),this.updateSession());const n=this.updateSentMessage(e.bad_msg_id);n&&this.pushResend(n.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),l.a.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&be.updatesProcessor&&be.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==be.updatesProcessor&&be.updatesProcessor(e)}}}const Pe=new class{constructor(){this.networkers=[],this.language=navigator.language||W.a.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){Object(n.e)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ve(e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};h.a&&(h.a.networkerFactory=Pe);var be=Pe,Ie=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};var Se=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,K.a.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new R;t.storeBytes(Object(g.c)(e.modulus),"n"),t.storeBytes(Object(g.c)(e.exponent),"e");const a=t.getBuffer();return q.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[Object(g.f)(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return Ie(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(h.b&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new B(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(o,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e})}sendReqPQ(e){return Ce(this,void 0,void 0,(function*(){const t=new R({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),h.b&&this.log("Send req_pq",e.nonce.hex);try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Se.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!Object(g.b)(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,h.b&&this.log("Got ResPQ",Object(g.f)(e.serverNonce),Object(g.f)(e.pq),e.fingerprints);const n=yield Se.select(e.fingerprints);if(!n)throw new Error("[MT] No public key found");e.publicKey=n,h.b&&this.log("PQ factorization start",e.pq);try{var i=yield q.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=i[0],e.q=i[1],h.b&&this.log("PQ factorization done",i),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ce(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new R({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const n=Object(m.a)(s,192,!1,!0,!1),i=n.slice().reverse(),r=yield(()=>Ce(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=i.concat(yield q.invokeCrypto("sha256-hash",t.concat(n)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield q.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),r=Object(g.h)(t,yield q.invokeCrypto("sha256-hash",s)).concat(s),o=Object(u.x)(Object(g.f)(r),16),p=Object(u.x)(e.publicKey.modulus,16);if(-1===Object(u.g)(o,p))return r}})))(),o=Object(m.a)(yield q.invokeCrypto("rsa-encrypt",r,e.publicKey),256,!0,!0,!0),p={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:o},d=new R({mtproto:!0});d.storeMethod("req_DH_params",p);const c=d.getBytes(!0);let l;h.b&&this.log("Send req_DH_params",p);try{l=yield this.sendPlainRequest(e.dcId,c)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const y=l.fetchObject("Server_DH_Params","RESPONSE");if(h.b&&this.log("Sent req_DH_params, response:",y),"server_DH_params_fail"!==y._&&"server_DH_params_ok"!==y._)throw new Error("[MT] Server_DH_Params response invalid: "+y._);if(!Object(g.b)(e.nonce,y.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!Object(g.b)(e.serverNonce,y.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===y._){const t=(yield q.invokeCrypto("sha1-hash",e.newNonce)).slice(-16);if(!Object(g.b)(t,y.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,y.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ce(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield q.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield q.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield q.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield q.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),s=a.slice(0,20),n=a.slice(20),i=new B(n,{mtproto:!0}),r=i.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==r._)throw new Error("[MT] server_DH_inner_data response invalid: "+r);if(!Object(g.b)(e.nonce,r.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!Object(g.b)(e.serverNonce,r.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");h.b&&this.log("Done decrypting answer"),e.g=r.g,e.dhPrime=r.dh_prime,e.gA=r.g_a,e.serverTime=r.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=i.getOffset();if(!Object(g.b)(s,yield q.invokeCrypto("sha1-hash",n.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");z.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){h.b&&this.log("Verifying DH params",e,t,a);const s=Object(g.f)(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");h.b&&this.log("dhPrime cmp OK");const n=Object(u.x)(Object(g.f)(a),16),i=Object(u.x)(s,16);if(Object(u.g)(n,u.t)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(Object(u.g)(n,Object(u.y)(i,u.t))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");h.b&&this.log("1 < gA < dhPrime-1 OK");const r=Object(u.n)(2,32,0),o=Object(u.u)(r,1984);if(Object(u.g)(n,o)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(Object(u.g)(n,Object(u.y)(i,o))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return h.b&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ce(this,void 0,void 0,(function*(){const t=Object(g.c)(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield q.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const s=new R({mtproto:!0});s.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const n=(yield q.invokeCrypto("sha1-hash",s.getBuffer())).concat(s.getBytes(!0)),i=yield q.invokeCrypto("aes-encrypt",n,e.tmpAesKey,e.tmpAesIv),r=new R({mtproto:!0});let o;r.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:i}),h.b&&this.log("Send set_client_DH_params");try{o=yield this.sendPlainRequest(e.dcId,r.getBytes(!0))}catch(e){throw e}const p=o.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==p._&&"dh_gen_retry"!==p._&&"dh_gen_fail"!==p._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+p._);if(!Object(g.b)(e.nonce,p.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!Object(g.b)(e.serverNonce,p.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var d=yield q.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw d}const c=yield q.invokeCrypto("sha1-hash",d),l=c.slice(0,8),m=c.slice(-8);switch(h.b&&this.log("Got Set_client_DH_params_answer",p._,d),p._){case"dh_gen_ok":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([1],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,p),new Error("new_nonce_hash1 mismatch");const a=Object(g.h)(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return h.b&&this.log("Auth successfull!",m,d,a),e.authKeyId=m,e.authKey=d,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([2],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([3],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=ge.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>Ce(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)}))),this.cached[e]=t)}},we=a(151),ke=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ae=new class{constructor(){this.log=Object(c.b)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=K.a.transport,ge.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n){n[a].forEach((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return ce.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);e.networker.changeTransport(a)})}getBaseDcId(){return ke(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield l.a.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(W.a.baseDcId)),this.baseDcId}))}setUserAuth(e){return ke(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}l.a.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,l.a.set({dc:this.baseDcId})}logOut(){return ke(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>l.a.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,we.a.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(s,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",s=this.getTransportType(a);this.cachedNetworkers[s]||(this.cachedNetworkers[s]={client:{},download:{},upload:{}});const n=this.cachedNetworkers[s][a];e in n||(n[e]=[]);const i=n[e],r="client"===a||"https"===s?1:3;if(i.length>=r){let e=i.length-1,t=!1;for(;e>=0;--e)if(i[e].isOnline){t=!0;break}const a=t?i.splice(e,1)[0]:i.pop();return i.unshift(a),Promise.resolve(a)}let o=this.generateNetworkerGetKey(e,s,a);if(this.gettingNetworkers[o])return this.gettingNetworkers[o];const p=`dc${e}_auth_key`,d=`dc${e}_server_salt`;let c=this.chooseServer(e,a,s);return this.gettingNetworkers[o]=Promise.all([p,d].map(e=>l.a.get(e))).then(([n,r])=>ke(this,void 0,void 0,(function*(){let m,h;if(n&&512===n.length){r&&16===r.length||(r="AAAAAAAAAAAAAAAA");const a=Object(g.c)(n),s=(yield q.invokeCrypto("sha1-hash",a)).slice(-8),i=Object(g.c)(r);m=be.getNetworker(e,a,s,i,t)}else try{const a=yield Me.auth(e);l.a.set({[p]:Object(g.f)(a.authKey),[d]:Object(g.f)(a.serverSalt)}),m=be.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){h=e}const u=this.getTransportType(a);if(u!==s&&(o=this.generateNetworkerGetKey(e,u,a),c.destroy(),de.removeTransport(ce.chosenServers,c),m&&(c=this.chooseServer(e,a,u)),this.log("transport has been changed during authorization from",s,"to",u)),delete this.gettingNetworkers[o],h)throw this.log("get networker error",h,h.stack),h;return m.changeTransport(c),i.unshift(m),this.setOnDrainIfNeeded(m),m})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),be.removeNetworker(e),de.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const s=Object(Q.a)();let{afterMessageId:n,prepareTempMessageId:i}=a;if(i&&s.then(()=>{delete this.afterMessageTempIds[i]}),h.a){const n=Date.now(),i=ye.a.setInterval(()=>{p&&p.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)},5e3);s.catch($.a).finally(()=>{clearInterval(i)})}const r=t=>{t?Object(m.b)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},s.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=d||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let o,p,d=(new Error).stack||"empty stack";const c=d=>{if(n){const e=this.afterMessageTempIds[n];e&&(a.afterMessageId=e.messageId)}const m=(p=d).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:s}),m.then(s.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,o,e,t),401===i.code&&this.baseDcId===o)"SESSION_PASSWORD_NEEDED"!==i.type&&(l.a.delete("dc"),l.a.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&o!==this.baseDcId){if(void 0===this.cachedExportPromise[o]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:o},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:o,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[o]=e}this.cachedExportPromise[o].then(()=>{this.invokeApi(e,t,a).then(s.resolve,r)},r)}else if(303===i.code){const n=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];n!==o&&(a.dcId?a.dcId=n:this.setBaseDcId(n),this.getNetworker(n,a).then(n=>{n.wrapApiCall(e,t,a).then(s.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const n=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];n!==o?this.getNetworker(n,a).then(n=>{n.wrapApiCall(e,t,a).then(s.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[n];n=void 0,delete a.afterMessageId,e?e.promise.then(()=>c(p)):c(p)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{c(p)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{c(p)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{c(p)},1e3*e)}})};return(o=a.dcId||this.baseDcId)?this.getNetworker(o,a).then(c,r):this.getBaseDcId().then(e=>{this.getNetworker(o=e,a).then(c,r)}),s}};h.a.apiManager=Ae;var Ee=Ae,Te=a(47),De=a(15),Ue=a(170),xe=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function Oe(e){return xe(this,void 0,void 0,(function*(){return yield navigator.mediaDevices.getDisplayMedia(e)}))}var Fe=a(148),Re=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function Be(){const e={main:{},screen:{}};return t=>Re(this,void 0,void 0,(function*(){const{isScreen:a,constraints:s}=t,n=e[a?"screen":"main"];let i=n[s.audio?"audio":"video"];i||(i=(a?Oe:Fe.a)(s,t.muted),s.audio&&!n.audio&&(n.audio=i.finally(()=>n.audio=void 0)),s.video&&!n.video&&(n.video=i.finally(()=>n.video=void 0)));try{return yield i}catch(e){throw e}}))}window.getStreamCached=Be;var Ve=a(149),je=a(150);class Le extends X.a{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=Be()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch($.a)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,a){const{streamManager:s}=this;if(s){const a=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(a&&s)return Promise.resolve()}const n={audio:e&&Object(Ue.a)(),video:t&&Object(Ve.a)()};return this.getStream({constraints:n,muted:a}).then(e=>{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main"),this.onInputStream(e)})}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const a=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:a,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:a,source:s}){s||(s=je.a.getSource(e,a)),this.log("tryAddTrack",e,t,a,s);const n="output"===a,{player:i,elements:r,streamManager:o}=this,p=t.kind,d="video"===p,c=d?s:p;let l=r.get(c);d&&t.addEventListener("ended",()=>{this.log("[track] onended"),r.delete(c)},{once:!0}),n&&o.addTrack(e,t,a);const m=d?e:o.outputStream;if(l)l.paused&&l.play().catch($.a),l.srcObject=m;else{if(l=document.createElement(p),l.autoplay=!0,l.srcObject=m,l.volume=1,"undefined"!==l.sinkId){const{outputDeviceId:e}=this;e&&l.setSinkId(e)}d||i.appendChild(l),r.set(c,l)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach(t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)})}onInputStream(e){if(!this.isClosing){const{streamManager:t,description:a}=this;t.addStream(e,"input"),a&&t.appendToConference(a)}}}var Ne=a(138);var qe,Ge,He=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ze=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class We{constructor(e,t){qe.set(this,void 0),Ge.set(this,void 0),He(this,qe,e,"f"),He(this,Ge,t,"f")}get session(){return ze(this,qe,"f")}get media(){return ze(this,Ge,"f")}get bundle(){return this.session.lines.find(e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map(e=>e.lines)).map(e=>e.toString()).join("\r\n")+"\r\n"}}function Ke(e,t,a){const s=e.split(t),n=[];for(;a>0&&s.length;)n.push(s.shift()),--a;return s.length&&n.push(s.join(t)),n}qe=new WeakMap,Ge=new WeakMap;var $e,Je,Qe,Xe=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Ye=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ze{constructor(e,t){$e.set(this,void 0),Je.set(this,void 0),Qe.set(this,void 0),Xe(this,$e,new Set,"f"),Xe(this,Je,e,"f"),Xe(this,Qe,t,"f")}generate(){const e=Ye(this,Je,"f"),t=Ye(this,Qe,"f"),a=Ye(this,$e,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),i=0;for(;a.has(n);)if(n=s)return null;return a.add(n),n}add(e){Ye(this,$e,"f").add(e)}}$e=new WeakMap,Je=new WeakMap,Qe=new WeakMap;var et,tt,at=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},st=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class nt{constructor(e,t){et.set(this,void 0),tt.set(this,void 0),at(this,et,e,"f"),at(this,tt,t,"f")}get key(){return st(this,et,"f")}get value(){return st(this,tt,"f")}}et=new WeakMap,tt=new WeakMap;var it,rt,ot,pt,dt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ct=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class lt{constructor(e,t,a,s){it.set(this,void 0),rt.set(this,void 0),ot.set(this,void 0),pt.set(this,void 0),dt(this,it,e,"f"),dt(this,rt,t,"f"),dt(this,ot,a,"f"),dt(this,pt,s,"f")}get type(){return ct(this,it,"f")}get port(){return ct(this,rt,"f")}get protocol(){return ct(this,ot,"f")}get ids(){return ct(this,pt,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}it=new WeakMap,rt=new WeakMap,ot=new WeakMap,pt=new WeakMap;var mt,gt,ht,ut,yt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ft=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class _t{constructor(e,t){if(mt.set(this,void 0),gt.set(this,void 0),ht.set(this,void 0),ut.set(this,void 0),yt(this,mt,e,"f"),"string"==typeof t){if(yt(this,gt,t,"f"),"m"===e){const e=t.split(" ");yt(this,ht,new lt(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=Ke(t,":",1);t=e[0],yt(this,ut,1===e.length?new nt(t,null):new nt(t,e[1]),"f")}}else t instanceof lt?(yt(this,ht,t,"f"),yt(this,gt,t.toString(),"f")):t instanceof nt&&(yt(this,ut,t,"f"),yt(this,gt,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return ft(this,mt,"f")}get value(){return ft(this,gt,"f")}get parsed(){return ft(this,ut,"f")}get mediaLineParts(){return ft(this,ht,"f")}toString(){return`${this.key}=${this.value}`}}mt=new WeakMap,gt=new WeakMap,ht=new WeakMap,ut=new WeakMap;var vt,Pt,bt,It,St,Ct,Mt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},wt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class kt{constructor(e,t,a=":",s=!1){vt.set(this,void 0),Pt.set(this,void 0),bt.set(this,void 0),It.set(this,void 0),St.set(this,void 0),Ct.set(this,void 0),Mt(this,vt,e,"f"),Mt(this,Pt,t,"f"),Mt(this,bt,a,"f"),Mt(this,St,s,"f"),Mt(this,It,s?new Map:null,"f"),Mt(this,Ct,s?[]:null,"f")}get lines(){return wt(this,Pt,"f")}get value(){return wt(this,St,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!wt(this,St,"f")}get key(){return wt(this,vt,"f")}get keys(){return kt.fill(this),wt(this,Ct,"f")}forEach(e){kt.fill(this),wt(this,It,"f").forEach(e)}get(e){return kt.fill(this),wt(this,It,"f").get(e)||new kt(e,[],":",!0)}static fill(e){if(null!==wt(e,It,"f"))return;const t=new Map;e.lines.forEach(a=>{const[s,n]=Ke(a,wt(e,bt,"f"),1),i=t.get(s)||[];t.set(s,[...i,n||""])});const a=Mt(e,It,kt.makeAttributes(t),"f");Mt(e,Ct,Array.from(a.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach((e,a)=>{t.set(a,new kt(a,e))}),t}}vt=new WeakMap,Pt=new WeakMap,bt=new WeakMap,It=new WeakMap,St=new WeakMap,Ct=new WeakMap;var At,Et,Tt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Dt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ut{constructor(e){At.set(this,void 0),Et.set(this,void 0),Tt(this,At,e,"f"),Tt(this,Et,new Map,"f"),Ut.fillAttributes(this)}get(e){return Dt(this,Et,"f").get(e)||new kt(e,[]," ",!0)}static fillAttributes(e){const t=new Map;Dt(e,At,"f").forEach(e=>{if("a"===e.key){const{key:a,value:s}=e.parsed;let n=t.get(a);n||(n=[],t.set(a,n)),n.push(s||"")}}),t.forEach((t,a)=>{Dt(e,Et,"f").set(a,new kt(a,t," ",!1))})}}At=new WeakMap,Et=new WeakMap;var xt,Ot,Ft,Rt,Bt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Vt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class jt{constructor(e){xt.set(this,void 0),Ot.set(this,void 0),Ft.set(this,void 0),Rt.set(this,void 0),Bt(this,xt,e,"f"),Bt(this,Ot,e[0],"f"),Bt(this,Ft,Bt(this,Rt,null,"f"),"f")}get lines(){return Vt(this,xt,"f")}get mediaLine(){return Vt(this,Ot,"f")}get mediaLineParts(){return Vt(this,Ot,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!Vt(this,Rt,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",Bt(this,Rt,t,"f")}return Vt(this,Rt,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return Vt(this,Ft,"f")||Bt(this,Ft,new Ut(this.lines),"f"),Vt(this,Ft,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const a in e){const s=this.attributes.get(a),n=!e[a];t[a]=s?n?s.lines:s.value:n?[]:void 0}return t}}xt=new WeakMap,Ot=new WeakMap,Ft=new WeakMap,Rt=new WeakMap;var Lt,Nt,qt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Gt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ht{constructor(e){Lt.set(this,void 0),Nt.set(this,void 0),qt(this,Lt,e,"f"),qt(this,Nt,e.filter(e=>"o"===e.key).map(e=>e.value.split(" ")[1])[0],"f")}get lines(){return Gt(this,Lt,"f")}get sessionId(){return Gt(this,Nt,"f")}}function zt(e){function t(){a?s.push(new jt(n)):a=new Ht(n)}let a=null,s=[],n=[];return e.split(/\r?\n/).forEach(e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const a=Wt(e);"m"===a.key&&(t(),n=[]),n.push(a)}}),t(),new We(a,s)}function Wt(e){const t=Ke(e,"=",1);return new _t(t[0],t[1])}Lt=new WeakMap,Nt=new WeakMap;var Kt=a(171),$t=a(137);function Jt(e,t){const a=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!a.fingerprint){const t=e.session.lines.find(e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)});a.fingerprint=t.parsed.value}const s=function(e){const t=e.map(e=>{const[t,...a]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:a.map(e=>Object($t.c)(+e))}});return t.length?t:void 0}(a["ssrc-group"]),[n,i]=a.fingerprint.split(" ",2),r=a.ssrc&&Object($t.c)(+a.ssrc.split(" ",1)[0]);return{raw:a,ufrag:a["ice-ufrag"],pwd:a["ice-pwd"],fingerprint:{fingerprint:i,setup:a.setup,hash:n},source:r,sourceGroups:s,mid:a.mid}}function Qt(e){const{offer:t,data:a}=e,s=zt(t.sdp);let r=!1;if(e.skipAddingMulticast||(r=function(e){let t;return e.media.forEach((a,s)=>{if("video"===a.mediaType&&a.isSending&&!a.attributes.get("ssrc-group").get("SIM").exists){t||(t=new Ze(2,4294967295));const n=a.attributes.get("ssrc-group").get("FID").value.split(" "),i=a.lines;n.forEach(e=>t.add(+e));const r=[n[0],t.generate(),t.generate()],o=[n[1],t.generate(),t.generate()];i.push(Wt("a=ssrc-group:SIM "+r.join(" ")));const p=a.attributes.get("ssrc").get(n[0]).lines;r.forEach((e,t)=>{const a=o[t];t>0&&(i.push(Wt("a=ssrc-group:FID "+e+" "+a)),p.forEach(t=>{i.push(Wt("a=ssrc:"+e+" "+t))}),p.forEach(e=>{i.push(Wt("a=ssrc:"+a+" "+e))}))}),e.media[s]=new jt(i)}}),!!t}(s)||r),Object(n.d)(s.media,(e,t,n)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,p=o.mediaLineParts,d=(p.ids,o.toString()),c=a[e.mediaType]["payload-types"].map(e=>""+e.id);if(d!==Object(Kt.c)(e.mediaType,void 0,c)){const o=Jt(s,e);let d=Object.assign({},a);d.transport=Object(i.a)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const c=new Ne.a(o.mid,p.type);c.setPort(p.port),o.source&&c.setSource(o.sourceGroups||o.source),c.setDirection(e.direction);const l=zt((new Kt.a).addSsrcEntry(c,d).finalize()).media[0];n[t]=l,r=!0}}),r){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}var Xt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Yt extends class{constructor(e){var t;Object(i.g)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||Object(c.b)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=Object(c.b)("RTCPeerConnection")),t("constructor");const a=new RTCPeerConnection(e);return a.addEventListener("track",e=>{t("ontrack",e)}),a.addEventListener("signalingstatechange",()=>{t("onsignalingstatechange",a.signalingState)}),a.addEventListener("connectionstatechange",()=>{t("onconnectionstatechange",a.connectionState)}),a.addEventListener("negotiationneeded",()=>{t("onnegotiationneeded",a.signalingState)}),a.addEventListener("icecandidate",e=>{t("onicecandidate",e)}),a.addEventListener("iceconnectionstatechange",()=>{t("oniceconnectionstatechange",a.iceConnectionState)}),a.addEventListener("datachannel",()=>{t("ondatachannel")}),a.log=t,{connection:a}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,a){a||(a=Object(c.b)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",e=>{a("onmessage",e)}),s.addEventListener("open",()=>{a("onopen")}),s.addEventListener("close",()=>{a("onclose")}),s.log=a,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new Ne.b(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){let e=this.negotiating;return e||(this.negotiating=this.negotiateInternal().finally(()=>{this.negotiating=void 0}))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}{constructor(e){super(e),this.negotiateThrottled=Object(r.a)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",()=>{this.maybeUpdateRemoteVideoConstraints()}),e.addEventListener("close",()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}),e}createDescription(){if(this.description)return this.description;return super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,a){return Xt(this,void 0,void 0,(function*(){const{groupCall:s,description:i}=this,r=s.id,d=t.map(t=>{const a=function(e,t){const a=Jt(e,t),s=t.mediaType,n={source:a.source,sourceGroups:a.sourceGroups,type:s};a.fingerprint.setup="active";const i={fingerprints:[a.fingerprint],pwd:a.pwd,ssrc:a.source,"ssrc-groups":a.sourceGroups||[],ufrag:a.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(i)},source:a.source,media:t,sourceGroups:a.sourceGroups,entry:n}}(e,t);return this.sources[a.entry.type]=a.entry,a});let c;const l=d.find(e=>"audio"===e.media.mediaType),m=d.find(e=>"video"===e.media.mediaType);let{source:g,params:h}=l||{};const u=m||l,y={audio:l,video:m};if(i.entries.forEach(e=>{if("sendonly"===e.direction){const t=y[e.type];if(!t)return;i.setEntrySource(e,t.sourceGroups||t.source),i.setEntryPeerId(e,De.default.myId)}}),h!==u.params){const e=JSON.parse(u.params.data);g?e.ssrc=g:delete e.ssrc,h={_:"dataJSON",data:JSON.stringify(e)}}const f=p.a.getGroupCallInput(r);if("main"===a.type){const e={call:f,join_as:{_:"inputPeerSelf"},params:h,muted:a.isMuted,video_stopped:!a.joinVideo};c=Ee.invokeApi("phone.joinGroupCall",e),this.log("[api] joinGroupCall id="+r,e)}else{const e={call:f,params:h};c=Ee.invokeApi("phone.joinGroupCallPresentation",e),this.log("[api] joinGroupCallPresentation id="+r,e)}const _=yield c;o.a.processUpdateMessage(_);const v=_.updates.find(e=>"updateGroupCallConnection"===e._),P=JSON.parse(v.params.data);return P.audio=P.audio||s.connections.main.description.audio,i.setData(P),function(e,t){["audio","video"].filter(e=>t[e]).map(e=>[t[e],e]).forEach(([t,a])=>{const s=e.find(e=>e.mediaType===a);if(!s)return;const i=(e=>{const t={};return e.attributes.get("extmap").forEach(e=>{const a=e.key.split("/",1)[0];t[a]=e.value}),t})(s);Object(n.d)(t["rtp-hdrexts"],(e,t,s)=>{i[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,a))})})}(t,P),P}))}negotiateInternal(){return Xt(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,a="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const i=yield e.createOffer({iceRestart:!1});if(a&&this.dataChannel){t.createEntry("application").setDirection("sendrecv")}const{sdp:r,offer:o}=Qt({offer:i,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const p=r.media.filter(e=>"application"!==e.mediaType&&e.isSending);if(a)try{yield this.invokeJoinGroupCall(r,p,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],c=r.bundle;Object(n.d)(c,(e,a,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(a,1),d.push(n))});const l=r.media.map(e=>{const a=e.mid;let s=t.getEntryByMid(a);return s||(s=new Ne.a(a,e.mediaType),s.setDirection("inactive")),s}),m={type:"answer",sdp:t.generateSdp({bundle:c,entries:l,isAnswer:!0})};d.forEach(e=>{t.deleteEntry(e)}),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,m.sdp),yield e.setRemoteDescription(m),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then(()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1}),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:a}=t;e.onStageEndpoints.push(a),e.constraints[a]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var Zt=a(118);var ea=a(164),ta=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class aa extends Le{constructor(e){super(),Object(i.g)(this,e),this.log||(this.log=Object(c.b)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=Object(r.a)(()=>{this.dispatchEvent("pinned",this.pinnedSource)},0,!1),this.addEventListener("state",e=>{e===Zt.a.CLOSED&&this.cleanup()})}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return Zt.a.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?Zt.a.MUTED:Zt.a.UNMUTED:Zt.a.MUTED_BY_ADMIN}return Zt.a.CONNECTING}get participants(){return p.a.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==Zt.a.UNMUTED}get isClosing(){const{state:e}=this;return e===Zt.a.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){Object(n.e)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),Object(n.e)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return Te.c===e?this.participant:this.participants.get(e)}toggleMuted(){return this.requestAudioSource(!0).then(()=>p.a.toggleMuted())}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let a;if(e.pFlags.self){a="video"===t?"main":"presentation"}else{a=e[t].source_groups[0].sources[0]}const s=this.getElement(a);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,n.setAttribute("playsinline","true"),n.muted=!0,{video:n,source:a}}createConnectionInstance(e){return this.connections[e.type]=new Yt(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return p.a.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return ta(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Oe({video:{width:{max:1920},height:{max:1080},frameRate:{max:30}},audio:!0}),a=new je.a,s=this.createConnectionInstance({streamManager:a,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",()=>{s.negotiate()}),t.getVideoTracks()[0].addEventListener("ended",()=>{this.connections.presentation&&this.stopScreenSharing()},{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally(()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,p.a.saveApiParticipant(this.id,this.participant),Ee.invokeApi("phone.leaveGroupCallPresentation",{call:p.a.getGroupCallInput(this.id)}).then(e=>{o.a.processUpdateMessage(e)})):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return ta(this,void 0,void 0,(function*(){const e={video:Object(Ve.a)()};try{const t=yield Object(Fe.a)(e,!1);this.connections.main.addInputVideoStream(t),yield p.a.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally(()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return ta(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Object(ea.a)(t),e.streamManager.appendToConference(e.description),yield p.a.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,a=!1){return ta(this,void 0,void 0,(function*(){for(const e in this.connections){this.connections[e].closeConnectionAndStream(!t)}if(this.dispatchEvent("state",this.state),!a&&!t){let t;const a=p.a.getGroupCallInput(this.id);if(e)this.log("[api] discardGroupCall id="+this.id),t=Ee.invokeApi("phone.discardGroupCall",{call:a});else if(this.joined){this.log("[api] leaveGroupCall id="+this.id);const e=this.connections.main;t=Ee.invokeApi("phone.leaveGroupCall",{call:a,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=Ee.invokeApi("phone.joinGroupCall",{call:a,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const s=yield t;o.a.processUpdateMessage(s)}}))}tryAddTrack(e){const{description:t}=this,a=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+a),s=this.participants.get(e.peerId);s&&De.default.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:s})}return a}onParticipantUpdate(e,t){const a=this.connections.main,{connection:s,description:n}=a,i=d.a.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(i)||[];if(e.presentation&&!r){const{source:t}=p.a.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,a.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==i&&this.dispatchEvent("state",this.state))}const c=r?[]:p.a.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(i):this.participantsSsrcs.set(i,c);const l=new Set;o.forEach(e=>{const t=e.source;if(!c.find(e=>e.source===t)){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}}),c.forEach(e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,i),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))}),l.size&&(l.has("video")&&(a.updateConstraints=!0),a.negotiateThrottled())}}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var s=a(16);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function i(e,t){const a=function(e,t=2){e||(e=1);let a=[];const s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach((t,i)=>{if(n*=t.m,e=0;--e)0===i[e].duration&&i.splice(e,1);return i}(e,2);if(t){const e=a.map(e=>s.default.format(n[e.type],!0,[e.duration]));return Object(s.join)(e,!1,t)}const i=a.map(e=>Object(s.i18n)(n[e.type],[e.duration])),r=document.createElement("span");return r.append(...Object(s.join)(i,!1)),r}},function(e,t,a){"use strict";var s=a(0);var n=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE;const i=new Set(["image/gif","video/mp4","video/webm"]);n&&i.add("video/quicktime");t.a=i},function(e,t,a){"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach(t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)}),e}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"b",(function(){return i})),a.d(t,"c",(function(){return o})),a.d(t,"a",(function(){return p}));var s=a(0);var n=a(137);const i="9";function r(e){return"application"===e?"DTLS/SCTP":"RTP/SAVPF"}function o(e,t=i,a){return`m=${e} ${t} ${r(e)} ${a.join(" ")}`}class p extends class{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(" generation "+e.generation),t.join("")}(e))}addHeader(e,t){const a=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed","a=group:BUNDLE "+a,"a=ice-options:trickle","a=ice-lite","a=msid-semantic:WMS *")}addTransport(e,t){this.add("a=ice-ufrag:"+e.ufrag,"a=ice-pwd:"+e.pwd,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,"a=setup:"+t.setup);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:a,sourceGroups:s}=e;const i=Object(n.a)(e.source);t+=i,a+=i;const r=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${a}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${a}`)};return(()=>{this.add(`a=msid:${t} ${a}`)})(),(null==s?void 0:s.length)?s.forEach(e=>{if(e.sources.length){const t=e.sources.map(n.a);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(r)}}):r(i),this}addSsrcEntry(e,t,a){const s=(...e)=>this.add(...e),{type:n,mid:i,direction:p,port:d}=e,c=t.transport,l="application"===n,m=l?void 0:t[n],g="inactive"===p;if(e.shouldBeSkipped(a))return s(`m=${n} 0 ${r(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive","a=mid:"+i);const h=l?[{id:5e3}]:m["payload-types"],u=h.map(e=>e.id);s(o(n,d,u),"c=IN IP4 0.0.0.0",`a=rtcp:${d} IN IP4 0.0.0.0`),c["rtcp-mux"]&&s("a=rtcp-mux"),s("a=mid:"+i);let y=p;if("sendrecv"===p||!a||g||l||(y="sendonly"===p?"recvonly":"sendonly"),s("a="+y),this.addTransport(c),l)s(`a=sctpmap:${h[0].id} webrtc-datachannel 256`);else{const e=m["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach(e=>{s(`a=extmap:${e.id} ${e.uri}`)}),h.forEach(e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?"/"+e.channels:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const a=[];for(const e in t)a.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${a.join(";")}`)}const a=e["rtcp-fbs"];(null==a?void 0:a.length)&&a.forEach(t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)})})}return!e.source||"sendonly"!==y&&"sendrecv"!==y||this.addSsrc(e),this}addConference(e){const{conference:t,entries:a,bundle:n,isAnswer:i}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of a)this.addSsrcEntry((i?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,i);return this}static fromConference(e){return(new p).addConference(e).finalize()}}}])]); -//# sourceMappingURL=5.65a3414c4ad3195165a3.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[5],Array(41).concat([function(e,t,a){"use strict";var s=a(29),n=a(39),i=a(45),r=a(134);function o(e){return e&&e.toLowerCase()||""}var p=a(59),d=a(85),c=a(31),l=a(16),m=a(33),g=a(47),h=a(78),u=a(32),y=a(15),f=a(123),_=a(75),v=a(51),P=a(43),b=a(17);const I=new class{constructor(){this.storage=b.default.storages.users,this.updateUsersStatuses=()=>{const e=Object(p.h)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}},this.clear(!0),setInterval(this.updateUsersStatuses,6e4),y.default.addEventListener("state_synchronized",this.updateUsersStatuses),y.default.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=h.a.serverTimeOffset),"was_online"in a.status&&(a.status.was_online-=h.a.serverTimeOffset)),y.default.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserPhoto:e=>{var t;const a=e.user_id,s=this.users[a];if(s){if((null===(t=s.photo)||void 0===t?void 0:t.photo_id)===e.photo.photo_id)return;this.forceUserOnline(a,e.date),"userProfilePhotoEmpty"===e.photo._?delete s.photo:s.photo=Object(c.i)(s.photo,e.photo),this.setUserToStateIfNeeded(s),y.default.dispatchEvent("user_update",a),y.default.dispatchEvent("avatar_update",a.toPeerId())}else console.warn("No user by id:",a)},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign({},a,{first_name:e.first_name,last_name:e.last_name,username:e.username}),!0))}}),y.default.addEventListener("language_change",e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))}),b.default.getState().then(e=>{const t=b.default.storagesResults.users;if(t.length)for(let e=0,a=t.length;e{this.pushContact(e)}),a.length&&(this.contactsFillPromise=Object(i.a)(),this.contactsFillPromise.resolve(this.contactsList))),b.default.addEventListener("peerNeeded",e=>{if(!P.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})}),b.default.addEventListener("peerUnneeded",e=>{if(!P.a.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)})})}clear(e=!1){if(e)this.users={},this.usernames={};else{const e=b.default.storagesResults.users;for(const t in this.users){if(!t)continue;const a=t.toPeerId();if(!b.default.isPeerNeeded(a)){const a=this.users[t];a.username&&delete this.usernames[o(a.username)],e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.users[t]}}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1}onContactsModified(){const e=[...this.contactsList];b.default.pushToState("contactsList",e)}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=Object(i.a)();return m.a.invokeApi("contacts.getContacts").then(e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach(e=>{this.pushContact(e.user_id)}),this.onContactsModified(),this.contactsFillPromise=t),t.resolve(this.contactsList)},()=>{this.updatedContactsList=!1}),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){return"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase(),this.usernames[e]?Promise.resolve(this.users[this.usernames[e]]):m.a.invokeApi("contacts.resolveUsername",{username:e}).then(e=>(this.saveApiUsers(e.users),v.a.saveApiChats(e.chats),P.a.getPeer(P.a.getPeerId(e.peer))))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),b.default.requestPeerSingle(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),b.default.releaseSinglePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];if(!t)return"";return[t.first_name,t.last_name,t.phone,t.username,t.pFlags.self?l.default.format("SavedMessages",!0):"",t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" ")}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then(s=>{let i=[...s];if(e){const t=this.contactsIndex.search(e);i=[...i].filter(e=>t.has(e))}"name"===a?i.sort((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)}):"online"===a&&i.sort((e,t)=>{const a=I.getUserStatusForSort(I.getUser(e).status);return I.getUserStatusForSort(I.getUser(t).status)-a});const r=y.default.myId.toUserId();return Object(n.e)(i,r),t&&this.testSelfSearch(e)&&i.unshift(r),i})}getContactsPeerIds(e,t,a){return this.getContacts(e,t,a).then(e=>e.map(e=>e.toPeerId(!1)))}toggleBlock(e,t){return m.a.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:P.a.getInputPeerById(e)}).then(a=>(a&&_.a.processLocalUpdate({_:"updatePeerBlocked",peer_id:P.a.getOutputPeer(e),blocked:t}),a))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new f.a({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiUser(e,t)))}setUserNameToCache(e,t){if(!t||t.username!==e.username){if(null==t?void 0:t.username){const e=o(t.username);delete this.usernames[e]}if(e.username){const t=o(e.username);this.usernames[t]=e.id}}}saveApiUser(e,t){var a,s;if("userEmpty"===e._)return;const n=e.id,i=this.users[n];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;if(this.setUserNameToCache(e,i),i&&void 0!==i.initials&&void 0!==i.sortName&&i.first_name===e.first_name&&i.last_name===e.last_name)e.sortName=i.sortName,e.initials=i.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(r.b)(t,!1),e.initials=u.a.getAbbreviation(t)}e.status&&(e.status.expires&&(e.status.expires-=h.a.serverTimeOffset),e.status.was_online&&(e.status.was_online-=h.a.serverTimeOffset));let o=!1,p=!1;if(void 0===i)this.users[n]=e;else{e.first_name===i.first_name&&e.last_name===i.last_name&&e.username===i.username||(p=!0);(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(o=!0);const t=!!i.pFlags.contact,r=!!e.pFlags.contact;Object(c.i)(i,e),y.default.dispatchEvent("user_update",n),t!==r&&this.onContactUpdated(n,r,t)}o&&y.default.dispatchEvent("avatar_update",e.id.toPeerId()),p&&y.default.dispatchEvent("peer_title_edit",e.id.toPeerId()),this.setUserToStateIfNeeded(e)}setUserToStateIfNeeded(e){b.default.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}formatUserPhone(e){return"+"+Object(d.a)(e).formatted}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e&&(e=this.getUser(e).status),e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return Object(c.f)(e)?e:this.users[e]||{id:e,pFlags:{deleted:!0},access_hash:""}}getSelf(){return this.getUser(y.default.myId)}getUserStatusString(e){var t;let a,s;switch(e){case g.d:a="Peer.RepliesNotifications";break;case g.e:a="Peer.ServiceNotifications";break;default:{if(this.isBot(e)){a="Bot";break}const n=this.getUser(e);if(!n){a="";break}if(n.pFlags.support){a="SupportStatus";break}switch(null===(t=n.status)||void 0===t?void 0:t._){case"userStatusRecently":a="Lately";break;case"userStatusLastWeek":a="WithinAWeek";break;case"userStatusLastMonth":a="WithinAMonth";break;case"userStatusOffline":{const e=n.status.was_online,t=new Date,i=(t.getTime()/1e3|0)-e;if(i<60)a="Peer.Status.justNow";else if(i<3600){a="Peer.Status.minAgo";s=[i/60|0]}else if(i<86400&&t.getDate()===new Date(1e3*e).getDate()){a="LastSeen.HoursAgo";s=[i/3600|0]}else{a="Peer.Status.LastSeenAt";const{dateEl:t,timeEl:n}=Object(p.e)(e);s=[t,n]}break}case"userStatusOnline":a="Online";break;default:a="ALongTimeAgo"}break}}return Object(l.i18n)(a,s)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e.toPeerId()!==y.default.myId}hasUser(e,t){const a=this.users[e];return Object(c.f)(a)&&(t||!a.pFlags.min)}canSendToUser(e){const t=this.getUser(e);return!t.pFlags.deleted&&t.id.toPeerId()!==g.d}getUserPhoto(e){const t=this.getUser(e);return t&&t.photo||{_:"userProfilePhotoEmpty"}}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputPeerSelf"}:{_:"inputPeerUser",user_id:e,access_hash:t.access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=Object(p.h)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(_.a.updatesState.syncLoading)return;const s=this.getUser(e);s&&s.status&&"userStatusOnline"!==s.status._&&"userStatusEmpty"!==s.status._&&!s.pFlags.support&&!s.pFlags.deleted&&(s.status={_:"userStatusOnline",expires:a+60},y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then(e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]})}importContacts(e){const t=[];for(let a=0;a{this.saveApiUsers(e.users);return e.imported.map(e=>(this.onContactUpdated(e.user_id,!0),e.user_id))})}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=b.default.getState().then(t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:m.a.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then(a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),v.a.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map(e=>{const t=P.a.getPeerId(e.peer);return b.default.requestPeer(t,"topPeer"),{id:t,rating:e.rating}}))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},b.default.pushToState("topPeersCache",t.topPeersCache),s})})}getBlocked(e=0,t=0){return m.a.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then(e=>{this.saveApiUsers(e.users),v.a.saveApiChats(e.chats);return{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map(e=>e.id.toPeerId()).concat(e.chats.map(e=>e.id.toPeerId(!0)))}})}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return m.a.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then(e=>(_.a.processUpdateMessage(e),e))}searchContacts(e,t=20){return m.a.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then(e=>{this.saveApiUsers(e.users),v.a.saveApiChats(e.chats);return{my_results:Object(n.b)(e.my_results.map(e=>P.a.getPeerId(e))),results:e.results.map(e=>P.a.getPeerId(e))}})}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),y.default.dispatchEvent("contacts_update",e))}updateUsername(e){return m.a.invokeApi("account.updateUsername",{username:e}).then(e=>{this.saveApiUser(e)})}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:Object(p.h)(!0)}:{_:"userStatusOnline",expires:Object(p.h)(!0)+50};a.status=s,y.default.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}addContact(e,t,a,s,n){return m.a.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)})}deleteContacts(e){return m.a.invokeApi("contacts.deleteContacts",{id:e.map(e=>this.getUserInput(e))}).then(t=>{_.a.processUpdateMessage(t,{override:!0}),e.forEach(e=>{this.onContactUpdated(e,!1)})})}};s.a.appUsersManager=I;t.a=I},function(e,t,a){"use strict";var s=a(84),n=a(112),i=a(45),r=a(59),o=a(113),p=a(31),d=a(61),c=a(88),l=a(16),m=a(37),g=a(33),h=a(145),u=a(78),y=a(32),f=a(15),_=a(123),v=a(39),P=a(135),b=a(47),I=a(2),S=a(92);class C{constructor(e,t,a,s,n,i,r,o,p,d){this.appMessagesManager=e,this.appChatsManager=t,this.appPeersManager=a,this.appUsersManager=s,this.appDraftsManager=n,this.appNotificationsManager=i,this.appStateManager=r,this.apiUpdatesManager=o,this.serverTimeManager=p,this.appMessagesIdsManager=d,this.folders={},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach(e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog(i)),this.appMessagesManager.scheduleHandleNewDialogs(n,i)})},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);n&&(e.pFlags.pinned?n.pFlags.pinned=!0:this.handleDialogUnpinning(n,a),this.generateIndexForDialog(n)),this.appMessagesManager.scheduleHandleNewDialogs(s,n)},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:0,s=e=>{this.pinnedOrders[a].length=0,e.reverse(),e.forEach(e=>{n[e]=!0;const t=this.getDialogOnly(e);this.appMessagesManager.scheduleHandleNewDialogs(e,t),t&&(t.pFlags.pinned=!0,this.generateIndexForDialog(t))});const t=this.getFolderDialogs(a,!1);for(const e of t){if(!e.pFlags.pinned)break;const t=e.peerId;n[t]||this.appMessagesManager.scheduleHandleNewDialogs(t)}},n={};e.order?s(e.order.map(e=>this.appPeersManager.getPeerId(e.peer))):g.a.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then(e=>{this.applyDialogs(e),s(e.dialogs.map(e=>e.peerId))})},this.storage=this.appStateManager.storages.dialogs,this.dialogs=this.storage.getCache(),this.clear(!0),f.default.addEventListener("language_change",()=>{const e=s.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=a.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}});const c=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a="index_"+e.orderIndex;for(let e=0;e{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)}),f.default.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updatePinnedDialogs:this.onUpdatePinnedDialogs}),r.getState().then(e=>{this.pinnedOrders=e.pinnedOrders||{},this.pinnedOrders[0]||(this.pinnedOrders[0]=[]),this.pinnedOrders[1]||(this.pinnedOrders[1]=[]);const t=r.storagesResults.dialogs;t.length&&S.a.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{}})}setDialogsFromState(e){for(let t=0,a=e.length;tvoid 0===e.migratedTo):a.dialogs}getCachedDialogs(e){return this.getFolderDialogs(0,e).concat(this.getFolderDialogs(1,e))}setDialogIndexInFilter(e,t,a){var s;let n;if(this.appMessagesManager.filtersStorage.testDialogForFilter(e,a)){const t=a.pinnedPeerIds.indexOf(e.peerId);n=-1!==t?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(a.pinned_peers.length-1-t),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)?this.generateIndexForDialog(e,!0):e.index}return e[t]=n}getDialog(e,t,a=!0){const s=[];void 0===t?s.push(this.getFolder(0).dialogs,this.getFolder(1).dialogs):s.push(this.getFolderDialogs(t,!1));for(let t of s){let s=0,n=0;for(let i=t.length;st.peerId===e.peerId),i=s[n],r=i&&i[a],o=this.setDialogIndexInFilter(e,a,t);r!==o&&((!r&&o||n&&!o)&&this.prepareFolderUnreadCountModifyingByDialog(t.id,e,!!o),-1!==n&&s.splice(n,1),o&&Object(v.f)(s,e,a,n))}prepareDialogUnreadCountModifying(e){const t=[this.prepareFolderUnreadCountModifyingByDialog(e.folder_id,e)],a=this.appMessagesManager.filtersStorage.filters;for(const s in a){const n=a[s];this.appMessagesManager.filtersStorage.testDialogForFilter(e,n)&&t.push(this.prepareFolderUnreadCountModifyingByDialog(n.id,e))}return()=>t.forEach(e=>e())}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=a-s,i=a&&!s||!a&&s?s?-1:1:0;this.modifyFolderUnreadCount(e,n,i)};this.modifyFolderUnreadCount(e,a?s:-s,s?a?1:-1:0)}modifyFolderUnreadCount(e,t,a){if(!t&&!a)return;const s=this.getFolder(e);t&&(s.unreadMessagesCount=Math.max(0,s.unreadMessagesCount+t)),a&&(s.unreadDialogsCount=Math.max(0,s.unreadDialogsCount+a)),void 0===s.dispatchUnreadTimeout&&(s.dispatchUnreadTimeout=I.a.setTimeout(()=>{s.dispatchUnreadTimeout=void 0,f.default.dispatchEvent("folder_unread",s)},0))}generateIndexForDialog(e,t=!1,a){var s;let n,i=0;if(e.pFlags.pinned&&!t)i=this.generateDialogPinnedDate(e),n=!0;else{a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),i=a.date||i;const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!i||e.date&&e.date>i)&&(i=e.date)}"draftMessage"===(null===(s=e.draft)||void 0===s?void 0:s._)&&e.draft.date>i&&(i=e.draft.date)}i||(i=Object(r.h)(!0));const o=this.generateDialogIndex(i,n);if(t)return o;e.index=o}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.pinnedOrders[e.folder_id],a=t.indexOf(e.peerId);let s=a;return-1===a&&(s=t.push(e.peerId)-1,this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(s)}setDialogToState(e){const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;ee.peerId===i);if(-1!==o&&r.splice(o,1),this.dialogs[i]=e,this.setDialogToState(e),void 0===t&&(t=this.getDialogOffsetDate(e)),this.processDialogForFilters(e),t&&!e.pFlags.pinned){if(s){const e=this.dialogsOffsetDate[void 0];(!e||t{"dialogFolder"===t._&&e.dialogs.splice(a,1)}),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const t={};e.dialogs.forEach(e=>{const a=this.appPeersManager.getPeerId(e.peer);let s=e.top_message;const n=this.appMessagesManager.pendingTopMsgs[a];n&&(!s||this.appMessagesManager.getMessageByPeer(a,n).date>this.appMessagesManager.getMessageByPeer(a,s).date)&&(e.top_message=s=n,this.appMessagesManager.getHistoryStorage(a).maxId=n),s||e.draft&&"draftMessage"===e.draft._?(this.saveDialog(e),t[a]=e):this.dropDialogWithEvent(a);const i=this.appMessagesManager.newUpdatesAfterReloadToHandle[a];if(void 0!==i){for(const e of i)i.delete(e),this.apiUpdatesManager.saveUpdate(e);i.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[a]}}),Object.keys(t).length&&f.default.dispatchEvent("dialogs_multiupdate",t)}getDialogOffsetDate(e){return this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message).date||0}saveDialog(e,t,a,s){var n,i;void 0===t&&(t=null!==(n=e.folder_id)&&void 0!==n?n:0);const r=this.appPeersManager.getPeerId(e.peer);if(!r)return void console.error("saveConversation no peerId???",e,t);"dialog"!==e._&&console.error("saveConversation not regular dialog",e,Object.assign({},e));const o=this.appPeersManager.isChannel(r)?r.toChatId():b.c;if(r.isAnyChat()){const e=this.appChatsManager.getChat(r.toChatId());if("channelForbidden"===e._||e.pFlags.left||e.pFlags.kicked)return}const d=this.appPeersManager.getPeerSearchText(r);this.dialogsIndex.indexObject(r,d);const c=this.getDialogOnly(r);let l,m;if(e.top_message){l=this.appMessagesIdsManager.generateMessageId(e.top_message);const t=(null==c?void 0:c.top_message)&&this.appMessagesManager.getMessageByPeer(r,c.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&c.top_message>=l&&(l=c.top_message),m=this.appMessagesManager.getMessageByPeer(r,l)}else l=this.appMessagesManager.generateTempMessageId(r),m={_:"message",id:l,mid:l,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(r),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([m],{isOutgoing:!0});if((null==m?void 0:m.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,m),!o&&r.isAnyChat()){const t=this.appChatsManager.getChat(r.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[r]=a,this.appMessagesManager.migratedToFrom[a]=r,e.migratedTo=a}}if(e.top_message=l,e.read_inbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_inbox_max_id?c.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=this.appMessagesIdsManager.generateMessageId(c&&!e.read_outbox_max_id?c.read_outbox_max_id:e.read_outbox_max_id),void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=c?c.folder_id:t),e.draft=this.appDraftsManager.saveDraft(r,0,e.draft),e.peerId=r,m.pFlags.is_outgoing){const t=m.pFlags.out;l>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(m.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete m.pFlags.unread}const g=this.appMessagesManager.getHistoryStorage(r),h=g.history.slice;if(h.length){if(!h.isEnd(P.a.Bottom)){g.history.insertSlice([l]).setEnd(P.a.Bottom),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,m)&&f.default.dispatchEvent("history_reply_markup",{peerId:r})}}else g.history.unshift(l),g.count||(g.count=1),this.appMessagesManager.mergeReplyKeyboard(g,m)&&f.default.dispatchEvent("history_reply_markup",{peerId:r});g.maxId=l,g.readMaxId=e.read_inbox_max_id,g.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:r,settings:e.notify_settings}),o&&e.pts&&this.apiUpdatesManager.addChannelState(o,e.pts),this.generateIndexForDialog(e),Object(p.c)(e,["index_0","index_1","index_2","index_3","index_4","index_5","index_6","index_7","index_8","index_9","index_10"]),c&&Object(p.i)(c,e),this.pushDialog(e,m.date,a,s)}getDialogIndexKey(e){return e>1?"index_"+this.appMessagesManager.filtersStorage.getFilter(e).orderIndex:"index"}getDialogs(e="",t,a=20,s=0,n=!1){const i={};if(s>1){const r=[],o=this.appUsersManager.fillContacts();o.cached||r.push(o.promise);const p=this.appMessagesManager.filtersStorage.reloadMissingPeerIds(s);if(p&&r.push(p),r.length)return i.cached=!1,i.promise=Promise.all(r).then(()=>this.getDialogs(e,t,a,s,n).promise),i}const r=s>1||this.getOffsetDate(s)?void 0:s;let o=this.getFolderDialogs(s,n);const p=this.getDialogIndexKey(s);if(e){if(!a||this.cachedResults.query!==e||this.cachedResults.folderId!==s){this.cachedResults.query=e,this.cachedResults.folderId=s;const t=this.dialogsIndex.search(e),a=[];for(const e in this.dialogs){const n=this.dialogs[e];t.has(n.peerId)&&n.folder_id===s&&a.push(n)}a.sort((e,t)=>t[p]-e[p]),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}o=this.cachedResults.dialogs}else this.cachedResults.query="";let d=0;if(t>0)for(let e=o.length;do[d][p]);++d);const c=this.isDialogsLoaded(r),l=o.length>=d+a;if(e||c||l){const s=o.slice(d,d+a);return i.cached=!0,i.promise=Promise.resolve({dialogs:s,count:c?o.length:null,isTopEnd:o.length&&(s[0]&&s[0]===o[0]||o[0][p]=o.length}),i}return i.cached=!1,i.promise=this.appMessagesManager.getTopMessages(a,r).then(e=>{if(n&&(o=this.getFolderDialogs(s,n)),d=0,t>0)for(let e=o.length;do[d][p]);++d);const i=o.slice(d,d+a);return{dialogs:i,count:void 0===e.count?o.length:e.count,isTopEnd:o.length&&(i[0]&&i[0]===o[0]||o[0][p]{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id]),this.appStateManager.pushToState("filters",this.filters)},this.onUpdateDialogFilterOrder=e=>{this.orderIndex=1,e.order.forEach((e,t)=>{const a=this.filters[e];delete a.orderIndex,this.setOrderIndex(a)}),this.rootScope.dispatchEvent("filter_order",e.order),this.appStateManager.pushToState("filters",this.filters)},this.clear(!0),this.filters={},this.appStateManager.getState().then(e=>{Object(p.i)(this.filters,e.filters);for(const e in this.filters){const t=this.filters[e];t.hasOwnProperty("orderIndex")&&t.orderIndex>=this.orderIndex&&(this.orderIndex=t.orderIndex+1)}}),r.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:e=>{const t=Object(p.a)(this.filters);this.getDialogFilters(!0).then(e=>{for(const a in t){const t=+a;e.find(e=>e.id===t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map(e=>e.id)})})},updateDialogFilterOrder:this.onUpdateDialogFilterOrder})}clear(e=!1){e?(this.filters={},this.reloadedPeerIds=new Set):(Object(p.i)(this.filters,{}),this.reloadedPeerIds.clear()),this.orderIndex=1}testDialogForFilter(e,t){const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&1===e.folder_id)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted(a)&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}toggleDialogPin(e,t){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=this.rootScope.config.pinned_infolder_count_max)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"});a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map(e=>+e));return(e=Object(p.a)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return g.a.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then(s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.orderIndex,t.push(a)}e.orderIndex=1;const a=t.sort((e,t)=>e.orderIndex-t.orderIndex).map(e=>e.id);this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s})}getOutputDialogFilter(e){const t=Object(p.a)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){Object(v.d)(e.includePeerIds,(t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))})}reloadMissingPeerIds(e,t="pinned_peers"){const a=[],s=this.getFilter(e),n=s&&s[t];if(null==n?void 0:n.length){const e=n.filter((e,t)=>{const a=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(a)&&!this.appMessagesManager.getDialogOnly(a)});if(e.length){const t=e.map(e=>{const t=this.appPeersManager.getPeerId(e),a=this.appMessagesManager.reloadConversation(e);return a.then(()=>{this.reloadedPeerIds.add(t)}),a}),s=Promise.all(t);a.push(s)}}return a.length?Promise.all(a):void 0}getDialogFilters(e=!1){return M(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length&&!e)return t.map(e=>this.filters[e]).sort((e,t)=>e.orderIndex-t.orderIndex);const a=yield g.a.invokeApiSingle("messages.getDialogFilters");for(const t of a)this.saveDialogFilter(t,e);return a}))}saveDialogFilter(e,t=!0){w.forEach(([t,a])=>{e[a]=e[t].map(e=>this.appPeersManager.getPeerId(e))}),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds);const a=this.filters[e.id];a?Object.assign(a,e):this.filters[e.id]=e,this.setOrderIndex(e),t?this.rootScope.dispatchEvent("filter_update",e):a||this.rootScope.dispatchEvent("filter_new",e)}setOrderIndex(e){e.hasOwnProperty("orderIndex")?e.orderIndex>=this.orderIndex&&(this.orderIndex=e.orderIndex+1):e.orderIndex=this.orderIndex++,this.appStateManager.pushToState("filters",this.filters)}}var A=a(75),E=a(51),T=a(76),D=a(73),U=a(43),x=a(55),O=a(136),F=a(17),R=a(41),B=a(160),V=a(125),j=a(115),L=a(74),N=a(29),q=a(105),G=a(52),H=a(146),z=a(94),W=a(168),K=a(116),$=a(24),J=a(117),Q=a(91),X=a(104),Y=a(161),Z=a(169),ee=a(126),te=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ae=new class{constructor(){this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new s.a(10),this.needSingleMessages=new Map,this.fetchSingleMessagesPromise=null,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newMessagesHandleTimeout=0,this.newMessagesToHandle={},this.newDialogsToHandle={},this.newUpdatesAfterReloadToHandle={},this.notificationsHandlePromise=0,this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=Object(m.b)("MESSAGES",m.a.Error|m.a.Debug|m.a.Log|m.a.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.handleNewMessages=()=>{clearTimeout(this.newMessagesHandleTimeout),this.newMessagesHandleTimeout=0,f.default.dispatchEvent("history_multiappend",this.newMessagesToHandle),this.newMessagesToHandle={}},this.handleNewDialogs=()=>{let e=0;const t=this.newDialogsToHandle;for(const a in t){const s=t[a];s?(this.dialogsStorage.pushDialog(s),U.a.isChannel(a.toPeerId())||(e=Math.max(e,s.top_message||0))):(this.reloadConversation(a.toPeerId()),delete t[a])}0!==e&&this.incrementMaxSeenId(e),f.default.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle={}},this.handleNotifications=()=>{window.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=0;for(const e in this.notificationsToHandle){const t=e.toPeerId();if(f.default.peerId===t&&!f.default.idle.isIDLE)continue;const a=this.notificationsToHandle[t];Promise.all([q.a.getNotifyPeerTypeSettings(),q.a.getNotifySettings(U.a.getInputNotifyPeerById(t,!0))]).then(([e,s])=>{const n=a.topMessage;!q.a.isPeerLocalMuted(t,!0)&&n.pFlags.unread&&n.pFlags.unread&&this.notifyAboutMessage(n,{fwdCount:a.fwdCount,peerTypeNotifySettings:s})})}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id,a=this.pendingByRandomId[t];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a,o=X.a.generateMessageId(e.id),p=this.getMessageFromStorage(r,o);p.deleted?this.pendingByMessageId[o]=t:([this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach(e=>{e.history.delete(n)}),this.finalizePendingMessageCallbacks(r,n,p))}},this.onUpdateNewMessage=e=>{var t;const a=e.message,s=this.getMessagePeer(a),n=this.getMessagesStorage(s),i=this.getDialogOnly(s),r="updateNewDiscussionMessage"===e._;this.saveMessages([a],{storage:new Map});const o=this.getThreadKey(a),p=o?+o.split("_")[1]:void 0;if(p&&!r&&this.threadsStorage[s]&&this.threadsStorage[s][p]){const e={_:"updateNewDiscussionMessage",message:a};this.onUpdateNewMessage(e)}if(!i&&!r){let a=!0;if(s.isAnyChat()&&(a=E.a.isInChat(s.toChatId())),a){const a=null!==(t=this.newUpdatesAfterReloadToHandle[s])&&void 0!==t?t:this.newUpdatesAfterReloadToHandle[s]=new Set;if(a.has(e))return void this.log.error("here we go again",s);e.ignoreExisting=!0,a.add(e),this.scheduleHandleNewDialogs(s)}return}this.saveMessages([a],{storage:n});const d=this.checkPendingMessage(a),c=this.getHistoryStorage(s,r?p:void 0);r||this.updateMessageRepliesIfNeeded(a);const l=e.ignoreExisting;if(!!c.history.findSlice(a.mid)){if(!l)return!1}else{const e=c.history.first;if(e.isEnd(P.a.Bottom)){let t=0;for(const s=e.length;te[t]);++t);e.splice(t,0,a.mid)}else c.history.unshift(a.mid);null!==c.count&&c.count++}this.mergeReplyKeyboard(c,a)&&f.default.dispatchEvent("history_reply_markup",{peerId:s});const m=a.fromId;if(m.isUser()&&!a.pFlags.out&&a.from_id){R.a.forceUserOnline(m,a.date);const e={_:"sendMessageCancelAction"};let t;t=s.isUser()?{_:"updateUserTyping",action:e,user_id:m}:U.a.isChannel(s)?{_:"updateChannelUserTyping",action:e,channel_id:s.toChatId(),from_id:U.a.getOutputPeer(m),top_msg_id:p?X.a.getServerMessageId(p):void 0}:{_:"updateChatUserTyping",action:e,chat_id:s.toChatId(),from_id:U.a.getOutputPeer(m)},A.a.processLocalUpdate(t)}if(d||this.handleNewMessage(s,a.mid),r)return;const g=!a.pFlags.out&&a.pFlags.unread;if(i){if(g&&a.mid>i.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(i);++i.unread_count,a.pFlags.mentioned&&(++i.unread_mentions_count,this.modifyCachedMentions(s,a.mid,!0)),e()}a.mid>=i.top_message&&this.setDialogTopMessage(a,i)}if(g){const e=s;let t=this.notificationsToHandle[e];void 0===t&&(t=this.notificationsToHandle[e]={fwdCount:0,fromId:b.c}),t.fromId!==m&&(t.fromId=m,t.fwdCount=0),a.fwd_from&&++t.fwdCount,t.topMessage=a,this.notificationsHandlePromise||(this.notificationsHandlePromise=window.setTimeout(this.handleNotifications,0))}},this.onUpdateDialogUnreadMark=e=>{const t=U.a.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),f.default.dispatchEvent("dialogs_multiupdate",{[t]:a}),this.dialogsStorage.setDialogToState(a)}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=X.a.generateMessageId(t.id),n=this.getMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s);this.saveMessages([t],{storage:n});const r=this.getMessageFromStorage(n,s);this.handleEditedMessage(i,r);const o=this.getDialogOnly(a),p=o&&o.top_message===s;if(t.clear_history)p&&f.default.dispatchEvent("dialog_flush",{peerId:a});else if(f.default.dispatchEvent("message_edit",{storage:n,peerId:a,mid:s}),p||t.grouped_id){const e={};e[a]=o,f.default.dispatchEvent("dialogs_multiupdate",e),this.dialogsStorage.setDialogToState(o)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=X.a.generateMessageId(e.max_id||e.read_max_id),s=X.a.generateMessageId(e.top_msg_id),n=t?t.toPeerId(!0):U.a.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=this.getMessagesStorage(n),o=Object(p.e)(r,"desc"),d=this.getDialogOnly(n),c=e.still_unread_count;let l=0,m=0,g=!1;const h=this.getHistoryStorage(n,s);if(n.isUser()&&i&&R.a.forceUserOnline(n),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const u=!s&&d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d);for(let e=0,t=o.length;ea)continue;const p=r.get(t);if(p.pFlags.out===i){if(!p.pFlags.unread)break;if(s){const e=p.reply_to;if(!e||(e.reply_to_top_id||e.reply_to_msg_id)!==s)continue}p.pFlags.unread&&(delete p.pFlags.unread,g||(g=!0),p.pFlags.out||s||!d||(void 0===c&&(l=--d.unread_count),p.pFlags.mentioned&&(m=--d.unread_mentions_count,this.modifyCachedMentions(n,p.mid,!1))),q.a.cancel("msg"+t))}}if(i?h.readOutboxMaxId=a:h.readMaxId=a,!s&&d){if(i?d.read_outbox_max_id=a:d.read_inbox_max_id=a,!i){let e;void 0!==c?e=c:l<0||!this.getReadMaxIdIfUnread(n)?e=0:l&&d.top_message>a&&(e=l),void 0!==e&&(d.unread_count=e),(m<0||!d.unread_count)&&(d.unread_mentions_count=0)}u&&u(),this.dialogsStorage.processDialogForFilters(d),f.default.dispatchEvent("dialog_unread",{peerId:n}),this.dialogsStorage.setDialogToState(d)}if(g&&f.default.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");f.default.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.messages.map(e=>X.a.generateMessageId(e)),s=t?t.toPeerId(!0):this.getMessageById(a[0]).peerId;for(let e=0,t=a.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=X.a.generateMessageId(e.available_min_id),n=a.filter(e=>e<=s);e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{const t=e.channel_id,a=e.messages.map(e=>X.a.generateMessageId(e)),s=t?t.toPeerId(!0):this.getMessageById(a[0]).peerId;if(!s)return;g.a.clearCache("messages.getSearchCounters",e=>U.a.getPeerId(e.peer)===s);const n=new Set;for(const e of a){const t=this.getMessageByPeer(s,e),a=this.getThreadKey(t);a&&this.threadsStorage[s]&&this.threadsStorage[s][+a.split("_")[1]]&&n.add(a)}const i=this.handleDeletedMessages(s,this.getMessagesStorage(s),a),r=Array.from(n).map(e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}),o=this.getHistoryStorage(s);[o].concat(r).forEach(e=>{for(const t of i.msgs)e.history.delete(t);i.count&&e.count&&(e.count=Math.max(0,e.count-i.count))}),f.default.dispatchEvent("history_delete",{peerId:s,msgs:i.msgs});const p=this.getDialogOnly(s);if(p){const e=i.unreadMentions||i.unread,t=e&&this.dialogsStorage.prepareDialogUnreadCountModifying(p);if(i.unread&&(p.unread_count=Math.max(0,p.unread_count-i.unread)),i.unreadMentions&&(p.unread_mentions_count=p.unread_count?Math.max(0,p.unread_mentions_count-i.unreadMentions):0),e&&(t(),f.default.dispatchEvent("dialog_unread",{peerId:s})),i.msgs.has(p.top_message)){const e=o.history.first;if(e.isEnd(P.a.Bottom)&&e.length){const t=e[0],a=this.getMessageByPeer(s,t);this.setDialogTopMessage(a,p)}else this.reloadConversation(s)}}},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=E.a.getChat(t),n=E.a.isInChat(t);(!!s.username||!s.pFlags.left)!==(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],f.default.dispatchEvent("history_forbidden",a));!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a))},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.dialogsStorage.dropDialog(t),delete this.historiesStorage[t],this.reloadConversation(t).then(()=>{f.default.dispatchEvent("history_reload",t)})},this.onUpdateChannelMessageViews=e=>{const t=e.views,a=e.channel_id.toPeerId(!0),s=X.a.generateMessageId(e.id),n=this.getMessageByPeer(a,s);!n.deleted&&void 0!==n.views&&n.views{const t=b.e,a=t,s=this.generateTempMessageId(a),n={_:"message",id:s,from_id:U.a.getOutputPeer(t),peer_id:U.a.getOutputPeer(a),pFlags:{unread:!0},date:(e.inbox_date||Object(r.h)(!0))+u.a.serverTimeOffset,message:e.message,media:e.media,entities:e.entities};R.a.hasUser(t)||R.a.saveApiUsers([{_:"user",id:t,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([n],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[a]=s,this.onUpdateNewMessage({_:"updateNewMessage",message:n,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):U.a.getPeerId(e.peer),s=e.messages.map(e=>X.a.generateMessageId(e)),n=this.getMessagesStorage(a),i=s.filter(e=>!n.has(e));(i.length?Promise.all(i.map(e=>this.wrapSingleMessage(a,e))):Promise.resolve()).finally(()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s){n.get(e).pFlags.pinned=!0}else for(const e of s){delete n.get(e).pFlags.pinned}delete this.pinnedMessages[a],F.default.getState().then(e=>{delete e.hiddenPinnedMessages[a],f.default.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})})})},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e;if("notifyPeer"===t._){const e=U.a.getPeerId(t.peer),s=this.getDialogOnly(e);s&&(s.notify_settings=a,f.default.dispatchEvent("dialog_notify_settings",s),this.dialogsStorage.setDialogToState(s))}},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(s){const e=X.a.generateMessageId(t.id),n=this.getMessageFromStorage(s,e);this.saveMessages([t],{storage:s,isScheduled:!0});const i=this.getMessageFromStorage(s,e);if(n.deleted){this.checkPendingMessage(t)||f.default.dispatchEvent("scheduled_new",{peerId:a,mid:t.mid})}else this.handleEditedMessage(n,i),f.default.dispatchEvent("message_edit",{storage:s,peerId:a,mid:t.mid})}},this.onUpdateDeleteScheduledMessages=e=>{const t=U.a.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map(e=>X.a.generateMessageId(e));this.handleDeletedMessages(t,a,s),f.default.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.clear(),f.default.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages}),f.default.addEventListener("notify_peer_type_settings",({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>e.peerId.isBroadcast():e=>U.a.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach(e=>{f.default.dispatchEvent("dialog_notify_settings",e)})}),f.default.addEventListener("webpage_updated",({id:e,msgs:t})=>{t.forEach(({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:B.a.getWebPage(e)},f.default.dispatchEvent("message_edit",{storage:n,peerId:t,mid:a}))})}),f.default.addEventListener("draft_updated",({peerId:e,threadId:t,draft:a})=>{if(t)return;const s=this.getDialogOnly(e);if(s){if(!t){s.draft=a;let t=!1;a||X.a.getServerMessageId(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog(s)):(this.dialogsStorage.dropDialog(e),t=!0),f.default.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a,index:s.index})}}else this.reloadConversation(e)}),f.default.addEventListener("poll_update",({poll:e})=>{const t=O.a.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);this.setDialogToStateIfMessageIsTop(s)}}),F.default.getState().then(e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)})}clear(){this.middleware?this.middleware.clean():this.middleware=Object(J.a)(),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(),this.filtersStorage&&this.filtersStorage.clear()}construct(){this.filtersStorage=new k(this,U.a,R.a,q.a,F.default,A.a,f.default),this.dialogsStorage=new C(this,E.a,U.a,R.a,V.a,q.a,F.default,A.a,u.a,X.a)}getInputEntities(e){const t=Object(p.a)(e);return t.forEach(e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=R.a.getUserInput(e.user_id))}),t}invokeAfterMessageIsSent(e,t,a){var s,n;const r=null!==(s=this.tempFinalizeCallbacks[e])&&void 0!==s?s:this.tempFinalizeCallbacks[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:Object(i.a)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",e=>this.editMessage(e,t,a));let i=a.entities||[];t&&(t=y.a.parseMarkdown(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return g.a.invokeApi("messages.editMessage",{peer:U.a.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then(e=>{A.a.processUpdateMessage(e)},e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0})}sendText(e,t,a={}){if(!t.trim())return Promise.resolve();a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const s=f.default.config.message_length_max;if(t.length>s){const n=Object(c.g)(t,s);t=n[0],n.length>1&&delete a.webPage;for(let t=1;t{this.sendText(e,n[t],a)},t)}e=U.a.getPeerMigratedTo(e)||e;let n=a.entities||[];a.viaBotId||(t=y.a.parseMarkdown(t,n));let i=this.getInputEntities(n);i.length||(i=void 0);const r=this.generateOutgoingMessage(e,a);r.entities=n,r.message=t;const o=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0,d=U.a.isChannel(e);a.webPage&&(r.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{e?r.error=!0:delete r.error,f.default.dispatchEvent("messages_pending")};return r.send=()=>{l(!1);const s={};let n;return this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId),n=a.viaBotId?g.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:r.random_id,reply_to_msg_id:o||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft},s):g.a.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:U.a.getInputPeerById(e),message:t,random_id:r.random_id,reply_to_msg_id:o||void 0,entities:i,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent},s),this.pendingAfterMsgs[e]=s,n.then(e=>{if("updateShortSentMessage"===e._){const t=r.promise;delete r.promise;const s=Object(p.a)(r);r.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:r.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":d?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)});A.a.processUpdateMessage(e),r.promise.resolve()},e=>{l(!0),r.promise.reject(e)}).finally(()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(r,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),r.promise}sendFile(e,t,a={}){e=U.a.getPeerMigratedTo(e)||e;const s=this.generateOutgoingMessage(e,a),r=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let p,d;const c="mime_type"in t?t.mime_type:t.type,l=t instanceof File?t.name:"",m=!(t instanceof File||t instanceof Blob);let h=a.caption||"";this.log("sendFile",t,c);const u=a.entities||[];h&&(h=y.a.parseMarkdown(h,u));const _=[],v=Y.a.has(c);let P,b,I;if(m)p="document",d="";else if(0===c.indexOf("audio/")||["video/ogg"].indexOf(c)>=0){p="audio",d="audio."+("ogg"===c.split("/")[1]?"ogg":"mp3"),I="sendMessageUploadAudioAction",a.isVoiceMessage&&(p="voice",s.pFlags.media_unread=!0);let e={_:"documentAttributeAudio",pFlags:{voice:a.isVoiceMessage},waveform:a.waveform,duration:a.duration||0};_.push(e)}else if(a.isMedia)if(v){p="photo",d="photo."+c.split("/")[1],I="sendMessageUploadPhotoAction";const e={_:"photoSize",w:a.width,h:a.height,type:"full",location:null,size:t.size};P={_:"photo",id:""+s.id,sizes:[e],w:a.width,h:a.height};const n=D.a.getCacheContext(P,e.type);n.downloaded=t.size,n.url=a.objectURL||"",P=x.a.savePhoto(P)}else if(Z.a.has(c)){p="video",d="video.mp4",I="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:a.isRoundMessage,supports_streaming:!0},duration:a.duration,w:a.width,h:a.height};_.push(e),a.noSound&&t.size>10240&&t.size<10485760&&_.push({_:"documentAttributeAnimated"})}else p="document",d="document."+c.split("/")[1],I="sendMessageUploadDocumentAction";else p="document",d="document."+c.split("/")[1],I="sendMessageUploadDocumentAction";if(_.push({_:"documentAttributeFilename",file_name:l||d}),-1!==["document","video","audio","voice"].indexOf(p)&&!m){const e=[];b={_:"document",id:""+s.id,duration:a.duration,attributes:_,w:a.width,h:a.height,thumbs:e,mime_type:c,size:t.size};const n=D.a.getCacheContext(b);let i;if(n.downloaded=t.size,n.url=a.objectURL||"",v)_.push({_:"documentAttributeImageSize",w:a.width,h:a.height}),i={_:"photoSize",w:a.width,h:a.height,type:"full",size:t.size};else if("video"===p&&a.thumb){i={_:"photoSize",w:a.thumb.size.width,h:a.thumb.size.height,type:"local-thumb",size:a.thumb.blob.size};const e=D.a.getCacheContext(b,i.type);e.downloaded=i.size,e.url=a.thumb.url}i&&e.push(i),b=T.a.saveDoc(b)}this.log("sendFile",p,d,t.type,a);const S=m?void 0:new n.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),C=Object(i.a)();S&&(S.attachPromise(C),C.cancel=()=>{const e=new Error("Download canceled");e.name="AbortError",C.reject(e)},C.catch(t=>{"AbortError"!==t.name||k||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"}),(null==E?void 0:E.cancel)&&E.cancel())}));const M=m?void 0:{_:P?"messageMediaPhoto":"messageMediaDocument",pFlags:{},preloader:S,photo:P,document:b,promise:C};s.entities=u,s.message=h,s.media=m?{_:"messageMediaDocument",pFlags:{},document:t}:M;const w=e=>{e?s.error=!0:delete s.error,f.default.dispatchEvent("messages_pending")};let k=!1,E=null;return s.send=()=>{if(m){const{id:e,access_hash:a,file_reference:s}=t,n={_:"inputMediaDocument",id:{_:"inputDocument",id:e,access_hash:a,file_reference:s}};C.resolve(n)}else if(t instanceof File||t instanceof Blob){const n=()=>{let n;return k&&!s.error||(k=!1,E=D.a.upload(t),C.notifyAll({done:0,total:t.size})),"video"===p&&a.objectURL&&(n=new Promise((e,t)=>{(a.thumb&&a.thumb.blob?Promise.resolve(a.thumb):Object(o.a)(a.objectURL)).then(a=>{a?D.a.upload(a.blob).then(e,t):e(null)},t)})),E&&E.then(e=>te(this,void 0,void 0,(function*(){let t;switch(delete s.media.preloader,e.name=d,k=!0,p){case"photo":t={_:"inputMediaUploadedPhoto",file:e};break;default:t={_:"inputMediaUploadedDocument",file:e,mime_type:c,pFlags:{force_file:"sendMessageUploadDocumentAction"===I||void 0},attributes:_}}if(n)try{const e=yield n;t.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}C.resolve(t)})),()=>{w(!0)}),E.addNotifyListener(t=>{const a=Math.max(1,Math.floor(100*t.done/t.total));I&&this.setTyping(e,{_:I,progress:0|a}),C.notifyAll(t)}),C};a.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return C},this.beforeMessageSending(s,{isGroupedItem:a.isGroupedItem,isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),a.isGroupedItem||(C.then(t=>(this.setTyping(e,{_:"sendMessageCancelAction"}),g.a.invokeApi("messages.sendMedia",{background:a.background,peer:U.a.getInputPeerById(e),media:t,message:h,random_id:s.random_id,reply_to_msg_id:r,schedule_date:a.scheduleDate,silent:a.silent,entities:u,clear_draft:a.clearDraft}).then(e=>{A.a.processUpdateMessage(e)},e=>{if("photo"===p&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,p="document",void s.send();throw w(!0),e}))),C.then(s.promise.resolve,s.promise.reject)),{message:s,promise:C}}sendAlbum(e,t,a={}){return te(this,void 0,void 0,(function*(){if(a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId),1===t.length)return this.sendFile(e,t[0],Object.assign(Object.assign({},a),a.sendFileDetails[0]));e=U.a.getPeerMigratedTo(e)||e;const s=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let n=a.caption||"",r=a.entities||[];n&&(n=y.a.parseMarkdown(n,r)),this.log("sendAlbum",t,a);const o=""+ ++this.groupedTempId,p=t.map((t,i)=>{const p=a.sendFileDetails[i],d=Object.assign({isGroupedItem:!0,isMedia:a.isMedia,scheduleDate:a.scheduleDate,silent:a.silent,replyToMsgId:s,threadId:a.threadId,groupId:o},p);return 0===i&&(d.caption=n,d.entities=r),this.sendFile(e,t,d).message});a.clearDraft&&setTimeout(()=>{V.a.clearDraft(e,a.threadId)},0);const d=(e,t)=>{t?e.error=!0:delete e.error,f.default.dispatchEvent("messages_pending")},c=U.a.getInputPeerById(e),l=t=>{this.setTyping(e,{_:"sendMessageCancelAction"});const n=Object(i.a)();return this.sendSmthLazyLoadQueue.push({load:()=>g.a.invokeApi("messages.sendMultiMedia",{peer:c,multi_media:t,reply_to_msg_id:s,schedule_date:a.scheduleDate,silent:a.silent,clear_draft:a.clearDraft}).then(e=>{A.a.processUpdateMessage(e),n.resolve()},e=>{p.forEach(e=>d(e,!0)),n.reject(e)})}),n},m=p.map(e=>e.send().then(e=>g.a.invokeApi("messages.uploadMedia",{peer:c,media:e})).then(t=>{let a;if("messageMediaPhoto"===t._){const e=x.a.savePhoto(t.photo);a=x.a.getMediaInput(e)}else if("messageMediaDocument"===t._){const e=T.a.saveDoc(t.document);a=T.a.getMediaInput(e)}const s={_:"inputSingleMedia",media:a,random_id:e.random_id,message:n,entities:r};return n&&(n="",r=[]),s}).catch(t=>{if("AbortError"===t.name)return null;throw this.log.error("sendAlbum upload item error:",t,e),d(e,!0),t}));return Promise.all(m).then(e=>l(e.filter(Boolean)))}))}sendContact(e,t){return this.sendOther(e,R.a.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=U.a.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?X.a.getServerMessageId(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,O.a.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=O.a.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:x.a.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:T.a.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t}n.media=r;return n.send=()=>{const s={};let r;return this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId),r=a.viaBotId?g.a.invokeApiAfter("messages.sendInlineBotResult",{peer:U.a.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent},s):g.a.invokeApiAfter("messages.sendMedia",{peer:U.a.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent},s),this.pendingAfterMsgs[e]=s,r.then(e=>{e.updates&&e.updates.forEach(e=>{"updateDraftMessage"===e._&&(e.local=!0)}),A.a.processUpdateMessage(e)},e=>{f.default.dispatchEvent("messages_pending")}).finally(()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]})},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getMessagesStorage(s);if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),setTimeout(()=>{f.default.dispatchEvent("scheduled_new",{peerId:s,mid:a})},0);else{const i=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of i)e&&e.history.unshift(a);this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),setTimeout(()=>{f.default.dispatchEvent("history_append",{storage:n,peerId:s,mid:a})},0)}this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n},!t.isGroupedItem&&e.send&&setTimeout(()=>{t.clearDraft&&V.a.clearDraft(s,t.threadId),e.send()},0)}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=U.a.isBroadcast(e);if(s){if(U.a.getPeer(e).pFlags.signatures){const e=R.a.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}}return{_:"message",id:this.generateTempMessageId(e),from_id:this.generateFromId(e),peer_id:U.a.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||Object(r.h)(!0)+u.a.serverTimeOffset,message:"",grouped_id:t.groupId,random_id:Object(d.b)(),reply_to:this.generateReplyHeader(t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0,promise:void 0===t.groupId?Object(i.a)():void 0}}generateReplyHeader(e,t){const a={_:"messageReplyHeader",reply_to_msg_id:e||t};return t&&a.reply_to_msg_id!==t&&(a.reply_to_top_id=t),a}generateReplies(e){let t;if(U.a.isBroadcast(e)){const a=L.default.chatsFull[e.toChatId()];(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return e.isAnyChat()&&(e.isBroadcast()||this.isAnonymousSending(e))?void 0:U.a.getOutputPeer(R.a.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==R.a.getSelf().id&&(t.out=!0,U.a.isChannel(e)||R.a.isBot(e)||(t.unread=!0)),U.a.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=R.a.getSelf().id.toPeerId();if(t.fromId===a&&t.peerId===a&&!t.fwd_from)return;const s={_:"messageFwdHeader",flags:0,date:t.date};return t.fwd_from?(s.from_id=t.fwd_from.from_id,s.from_name=t.fwd_from.from_name,s.post_author=t.fwd_from.post_author):(s.from_id=U.a.getOutputPeer(t.fromId),s.post_author=t.post_author),U.a.isBroadcast(t.peerId)&&(t.post_author&&(s.post_author=t.post_author),s.channel_post=t.id),e===a&&(s.saved_from_msg_id=t.id,s.saved_from_peer=U.a.getOutputPeer(t.peerId)),s}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",action:{_:"messageActionChannelEditPhoto",photo:t},mid:a,peerId:e,date:t.date,fromId:e};return this.getMessagesStorage(e).set(a,s),s}isAnonymousSending(e){var t,a;return e.isAnyChat()&&(null===(a=null===(t=U.a.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){if(t){t.top_message=e.mid;this.getHistoryStorage(e.peerId).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t)}}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return A.a.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return te(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(void 0);){const t=yield this.getTopMessages(100,void 0);if(!e()||t.isEnd)break}}))}getConversations(e="",t,a,s=0,n){return this.dialogsStorage.getDialogs(e,t,a,s,n)}getReadMaxIdIfUnread(e,t){var a;const s=this.getHistoryStorage(e,t);if(t){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,s.readMaxId);return!this.getMessageByPeer(e,s.maxId).pFlags.out&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;N.b&&this.log("messages.getDialogs result:",r.dialogs,Object.assign({},r.dialogs[0])),a||void 0===t||this.dialogsStorage.resetPinnedOrder(t),a||$.default.setAuthorized(!0),R.a.saveApiUsers(r.users),E.a.saveApiChats(r.chats),this.saveMessages(r.messages);let o=!!a,p=!1;const d={},c=void 0===t?0:t,l=void 0===t;Object(v.d)(r.dialogs,e=>{void 0===e.folder_id&&(e.folder_id=c),this.dialogsStorage.saveDialog(e,void 0,!0,l),o||U.a.isChannel(e.peerId||U.a.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),o=!0),void 0!==e.peerId&&(s&&e.index>s&&(this.scheduleHandleNewDialogs(e.peerId,e),p=!0),X.a.getServerMessageId(e.read_inbox_max_id)||X.a.getServerMessageId(e.read_outbox_max_id)||(d[e.peerId]=e,this.log.error("noIdsDialogs",e,i)))});const m=Object.keys(d);if(m.length){const e=m.map(e=>e.toPeerId()),t=e.map(e=>this.reloadConversation(e));Promise.all(t).then(()=>{f.default.dispatchEvent("dialogs_multiupdate",d);for(let t=0;t=g||!r.dialogs.length;y&&this.dialogsStorage.setDialogsLoaded(t,!0),p?this.scheduleHandleNewDialogs():f.default.dispatchEvent("dialogs_multiupdate",{});const _=r.dialogs,P=100===e?_:_.slice(0,e);return{isEnd:y&&P[P.length-1]===_[_.length-1],count:g,dialogs:P}})}forwardMessages(e,t,a,s={}){e=U.a.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort((e,t)=>e-t)).length;n{var i,r;const o=this.getMessageByPeer(t,a),p=this.generateOutgoingMessage(e,s),d=["entities","media"];s.dropAuthor||(p.fwd_from=this.generateForwardHeader(e,o),d.push("views","forwards")),s.dropCaptions&&o.media||d.push("message"),d.forEach(e=>{p[e]=o[e]});const c=null===(i=p.media)||void 0===i?void 0:i.document;if(c){["round","voice"].includes(c.type)&&(p.pFlags.media_unread=!0)}if(o.grouped_id){(null!==(r=n[o.grouped_id])&&void 0!==r?r:n[o.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(p)}return p});for(const e in n){const t=n[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}i.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=g.a.invokeApiAfter("messages.forwardMessages",{from_peer:U.a.getInputPeerById(t),id:a.map(e=>X.a.getServerMessageId(e)),random_id:i.map(e=>e.random_id),to_peer:U.a.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions},r).then(e=>{this.log("forwardMessages updates:",e),A.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}generateEmptyMessage(e){return{_:"messageEmpty",id:X.a.getServerMessageId(e),mid:e,deleted:!0,pFlags:{}}}getMessageFromStorage(e,t){return e&&e.get(t)||this.generateEmptyMessage(t)}createMessageStorage(){return new Map}getMessagesStorage(e){var t;return null!==(t=this.messagesStorageByPeerId[e])&&void 0!==t?t:this.messagesStorageByPeerId[e]=this.createMessageStorage()}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(U.a.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&U.a.getPeerId(e.peer_id)||b.c}getDialogByPeerId(e){return this.dialogsStorage.getDialog(e)}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}reloadConversation(e){let t;if(void 0!==e){const a=U.a.getPeerId(e);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=Object(i.a)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:U.a.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=new Promise((e,t)=>{setTimeout(()=>{const a=[],s={};for(const[e,{inputDialogPeer:t,promise:n}]of this.reloadConversationsPeers)a.push(t),s[e]=n;this.reloadConversationsPeers.clear();const n=()=>{for(const e in s)s[e].resolve(void 0)};g.a.invokeApi("messages.getPeerDialogs",{peers:a}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(s[t].resolve(e),delete s[t])}),n(),e()},e=>{n(),t(e)}).finally(()=>{this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()})},0)})),t||this.reloadConversationsPromise}doFlushHistory(e,t,a){return g.a.invokeApiSingle("messages.deleteHistory",{just_clear:t,revoke:a,peer:e,max_id:0}).then(s=>(A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:s.pts,pts_count:s.pts_count}}),!s.offset||this.doFlushHistory(e,t,a)))}flushHistory(e,t,a){return te(this,void 0,void 0,(function*(){if(U.a.isChannel(e)){const t=this.getHistory(e,0,1),a=t instanceof Promise?yield t:t,s=e.toChatId(),n=a.history[0]||0;return g.a.invokeApiSingle("channels.deleteHistory",{channel:E.a.getChannelInput(s),max_id:X.a.getServerMessageId(n)}).then(e=>(e&&A.a.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e))}return this.doFlushHistory(U.a.getInputPeerById(e),t,a).then(()=>{[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pinnedMessages,this.pendingAfterMsgs,this.pendingTopMsgs].forEach(t=>{delete t[e]});const a=this.needSingleMessages.get(e);if(a&&a.clear(),[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach(t=>{const a=t[e];a&&a.clear()}),t)f.default.dispatchEvent("dialog_flush",{peerId:e});else{delete this.notificationsToHandle[e],delete this.typings[e];const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0)),this.dialogsStorage.dropDialogOnDeletion(e)}})}))}onPeerDeleted(e){}hidePinnedMessages(e){return Promise.all([F.default.getState(),this.getPinnedMessage(e)]).then(([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,f.default.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})})}getPinnedMessage(e){var t;const a=null!==(t=this.pinnedMessages[e])&&void 0!==t?t:this.pinnedMessages[e]={};return a.promise?a.promise:a.maxId?Promise.resolve(a):a.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1}).then(e=>{var t;return a.count=e.count,a.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,a}).finally(()=>{delete a.promise})}updatePinnedMessage(e,t,a,s,n){return g.a.invokeApi("messages.updatePinnedMessage",{peer:U.a.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:X.a.getServerMessageId(t)}).then(e=>{A.a.processUpdateMessage(e)})}unpinAllMessages(e){return g.a.invokeApiSingle("messages.unpinAllMessages",{peer:U.a.getInputPeerById(e)}).then(t=>{if(A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),!t.offset){return this.getMessagesStorage(e).forEach(e=>{e.pFlags.pinned&&delete e.pFlags.pinned}),f.default.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[e],!0}return this.unpinAllMessages(e)})}getAlbumText(e){const t=this.groupedMessagesStorage[e];let a,s,n,i=0;for(const[e,r]of t)if(r.message){if(++i>1)break;a=r.message,s=r.totalEntities,n=r.entities}return i>1&&(a=void 0,s=void 0,n=void 0),{message:a,entities:n,totalEntities:s}}getMidsByAlbum(e){return Object(p.e)(this.groupedMessagesStorage[e],"asc")}getMidsByMessage(e){var t;return(null===(t=e)||void 0===t?void 0:t.grouped_id)?this.getMidsByAlbum(e.grouped_id):[e.mid]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return X.a.generateMessageId((null==t?void 0:t.top_message)||0,!0)}saveMessage(e,t={}){var a,s;if(void 0===e.pFlags&&(e.pFlags={}),"messageEmpty"===e._)return void(e.deleted=!0);const n=this.getMessagePeer(e),i=t.storage||this.getMessagesStorage(n),r="peerChannel"===e.peer_id._,o=r&&E.a.isBroadcast(n.toChatId()),p="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const d=X.a.generateMessageId(e.id);if(e.mid=d,p){if(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id){(null!==(a=this.groupedMessagesStorage[e.grouped_id])&&void 0!==a?a:this.groupedMessagesStorage[e.grouped_id]=new Map).set(d,e)}e.via_bot_id&&(e.viaBotId=e.via_bot_id)}const c=this.getDialogOnly(n);c&&d&&d>c[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0),e.reply_to&&(e.reply_to.reply_to_msg_id&&(e.reply_to.reply_to_msg_id=e.reply_to_mid=X.a.generateMessageId(e.reply_to.reply_to_msg_id)),e.reply_to.reply_to_top_id&&(e.reply_to.reply_to_top_id=X.a.generateMessageId(e.reply_to.reply_to_top_id))),p&&e.replies&&(e.replies.max_id&&(e.replies.max_id=X.a.generateMessageId(e.replies.max_id)),e.replies.read_max_id&&(e.replies.read_max_id=X.a.generateMessageId(e.replies.read_max_id)));const l=!!n;l||(e.date-=u.a.serverTimeOffset);const m=R.a.getSelf().id.toPeerId(),g=p&&e.fwd_from;if(e.peerId=n,e.fromId=n===m?g?g.from_id?U.a.getPeerId(g.from_id):b.c:m:e.pFlags.post||!e.from_id?n:U.a.getPeerId(e.from_id),g){g.saved_from_msg_id&&(g.saved_from_msg_id=X.a.generateMessageId(g.saved_from_msg_id)),g.channel_post&&(g.channel_post=X.a.generateMessageId(g.channel_post));const t=g.saved_from_peer||g.from_id,a=g.saved_from_msg_id||g.channel_post;if(t&&a){const s=U.a.getPeerId(t),n=X.a.generateMessageId(a);e.savedFrom=s+"_"+n}e.fwdFromId=U.a.getPeerId(g.from_id),l||(g.date-=u.a.serverTimeOffset)}const h={type:"message",peerId:n,messageId:d};if(p&&e.media)switch(e.media._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":e.media.ttl_seconds?e.media={_:"messageMediaUnsupported"}:e.media.photo=x.a.savePhoto(e.media.photo,h),e.media.photo||delete e.media;break;case"messageMediaPoll":{const t=O.a.savePoll(e.media.poll,e.media.results,e);e.media.poll=t.poll,e.media.results=t.results;break}case"messageMediaDocument":e.media.ttl_seconds?e.media={_:"messageMediaUnsupported"}:e.media.document=T.a.saveDoc(e.media.document,h);break;case"messageMediaWebPage":{const a=B.a.getMessageKeyForPendingWebPage(n,d,t.isScheduled);e.media.webpage=B.a.saveWebPage(e.media.webpage,a,h);break}case"messageMediaInvoice":e.media={_:"messageMediaUnsupported"};break;case"messageMediaUnsupported":e.message="",delete e.entities,delete e.totalEntities}if(!p&&e.action){const t=e.action;let a,i;const p=e.fromId===R.a.getSelf().id?"You":"";switch(t.photo&&(t.photo=x.a.savePhoto(t.photo,h)),t.document&&(t.document=T.a.saveDoc(t.photo,h)),t._){case"messageActionChatEditPhoto":(null===(s=t.photo)||void 0===s?void 0:s.video_sizes)?t._=o?"messageActionChannelEditVideo":"messageActionChatEditVideo":o&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;ee.a.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",o||(e+="_by"+p),t.type=e;break}case"messageActionChatEditTitle":o&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":o&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=r?"messageActionChatJoined"+p:"messageActionChatReturn"+p)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+p);break;case"messageActionChannelMigrateFrom":a=t.chat_id.toPeerId(!0),i=n;break;case"messageActionChatMigrateTo":a=n,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}a&&i&&!this.migratedFromTo[a]&&!this.migratedToFrom[i]&&this.migrateChecks(a,i)}p&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),i.set(d,e)}saveMessages(e,t={}){e.saved||(e.saved=!0,e.forEach(e=>{this.saveMessage(e,t)}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=y.a.fixEmoji(e.message,t);const a=y.a.parseEntities(e.message);e.totalEntities=y.a.mergeEntities(t,a)}wrapMessageForReply(e,t=e.message,a,s,n,i){const r=[];let o=!1;const p=(e,t)=>{if(e){if(void 0===t&&o)return;t=s?l.default.format(e,!0):Object(l.i18n)(e)}if(s)r.push(t);else{const e=document.createElement("i");"string"==typeof t?e.innerHTML=t:e.append(t),r.push(e)}};let d=e.totalEntities;if(e.media){Object(Q.a)(e);let n=!0;if(e.grouped_id){if(a){const t=this.getMidsByMessage(e);if(a.length===t.length){for(const e of t)if(!a.includes(e)){n=!1;break}}else n=!1}if(n){const a=this.getAlbumText(e.grouped_id);t=a.message,d=a.totalEntities,i||(p("AttachAlbum"),o=!0)}}else n=!1;if(!n&&!i||!t){const a=e.media;switch(a._){case"messageMediaPhoto":p("AttachPhoto");break;case"messageMediaDice":p(void 0,s?a.emoticon:y.a.wrapEmojiText(a.emoticon));break;case"messageMediaVenue":t=a.title,p("AttachLocation");break;case"messageMediaGeo":p("AttachLocation");break;case"messageMediaGeoLive":p("AttachLiveLocation");break;case"messageMediaPoll":p(void 0,s?"📊 "+(a.poll.question||"poll"):a.poll.rReply);break;case"messageMediaContact":p("AttachContact");break;case"messageMediaGame":{const e="🎮 "+a.game.title;p(void 0,s?e:y.a.wrapEmojiText(e));break}case"messageMediaDocument":{const e=a.document;if("video"===e.type)p("AttachVideo");else if("voice"===e.type)p("AttachAudio");else if("gif"===e.type)p("AttachGif");else if("round"===e.type)p("AttachRound");else if("sticker"===e.type)e.stickerEmojiRaw&&p(void 0,(s?e.stickerEmojiRaw:e.stickerEmoji)+" "),p("AttachSticker"),t="";else if("audio"===e.type){const t=e.attributes.find(e=>"documentAttributeAudio"===e._&&(e.title||e.performer)),a="🎵 "+(t?[t.title,t.performer].filter(Boolean).join(" - "):e.file_name);p(void 0,s?a:y.a.wrapEmojiText(a))}else p(void 0,s?e.file_name:y.a.wrapEmojiText(e.file_name));break}case"messageMediaUnsupported":p(l.UNSUPPORTED_LANG_PACK_KEY)}}const c=r.length;t&&c&&r.push(", ")}if(e.action){const t=this.wrapMessageActionTextNew(e,s);t&&p(void 0,t)}if(t)if(t=Object(c.f)(t,100),d||(d=[]),s)r.push(y.a.wrapPlainText(t,d));else{if(n){n=n.trim();let e,a=!1,s=new RegExp(Object(c.e)(n),"gi");for(;null!==(e=s.exec(t));)d.push({_:"messageEntityHighlight",length:n.length,offset:e.index}),a=!0;a&&y.a.sortEntities(d)}const e=y.a.wrapRichText(t,{noLinebreaks:!0,entities:d,noLinks:!0,noTextFormat:!0});r.push(Object(H.a)(e))}if(s)return r.join("");{const e=document.createDocumentFragment();return e.append(...r),e}}wrapSenderToPeer(e){const t=document.createElement("span");t.classList.add("sender-title");const a=e.fromId===f.default.myId&&e.peerId!==f.default.myId;if(t.append(a?Object(l.i18n)("FromYou"):new G.a(Object.assign(Object.assign({},this.getMessageSenderPeerIdOrName(e)),{dialog:e.peerId===f.default.myId})).element),U.a.isAnyGroup(e.peerId)||a){const a=new G.a({peerId:e.peerId}).element;t.append(" ➝ ",a)}return t}getMessageSenderPeerIdOrName(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}wrapSentTime(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append(Object(r.c)(new Date(1e3*e.date))),t}wrapJoinVoiceChatAnchor(e){const t=e.action,{onclick:a,url:s}=y.a.wrapUrl(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!a)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",a+"(this)"),n}wrapMessageActionTextNewUnsafe(e,t){const a=t?void 0:document.createElement("span"),s="action"in e&&e.action;if(s.message){const e=s.message;return t?y.a.wrapPlainText(e):(a.innerHTML=y.a.wrapRichText(e,{noLinebreaks:!0}),a)}{let n,i,o=s._;const p=(e,t)=>t?U.a.getPeerTitle(e,t):new G.a({peerId:e}).element;switch(s._){case"messageActionPhoneCall":o+="."+s.type,i=[Object(W.a)(s.duration,t)];break;case"messageActionGroupCall":o+="."+s.type,i=[],o.endsWith("You")||e.pFlags.post||i.push(p(e.fromId,t)),void 0!==s.duration?i.push(Object(W.a)(s.duration,t)):i.push(this.wrapJoinVoiceChatAnchor(e));break;case"messageActionInviteToGroupCall":{const a=[e.fromId,s.users[0].toPeerId()];let r="Chat.Service.VoiceChatInvitation";const o=R.a.getSelf().id;a[0]===o?r+="ByYou":a[1]===o&&(r+="ForYou"),Object(v.e)(a,o),n=r,i=a.map(e=>p(e,t)),i.push(this.wrapJoinVoiceChatAnchor(e));break}case"messageActionGroupCallScheduled":{const a=new Date,o=new Date(1e3*s.schedule_date),d=(o.getTime()-a.getTime())/864e5,c=new Date(a);c.setDate(c.getDate()+1);const m=U.a.isBroadcast(e.peerId);n=m?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",i=[];const g=R.a.getSelf().id;e.fromId===g?n+="You":m||i.push(p(e.fromId,t));let h,u=[];d<1&&o.getDate()===a.getDate()?h="TodayAtFormattedWithToday":d<2&&o.getDate()===c.getDate()?h="Time.TomorrowAt":(h="formatDateAtTime",u.push(new l.default.IntlDateElement({date:o,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),u.push(Object(r.f)(o));const y=Object(l.i18n)(h,u);i.push(y);break}case"messageActionChatCreate":{const a=R.a.getSelf().id;e.fromId===a?o+="You":i=[p(e.fromId,t)];break}case"messageActionPinMessage":{const a=e.peerId,s=this.getMessageByPeer(a,e.reply_to_mid);if(i=[p(e.fromId,t)],s.deleted)n="ActionPinnedNoText",e.reply_to_mid&&this.fetchMessageReplyTo(e).then(t=>{t.deleted||e.deleted||(f.default.dispatchEvent("message_edit",{storage:this.getMessagesStorage(a),peerId:a,mid:e.mid}),this.isMessageIsTopMessage(e)&&f.default.dispatchEvent("dialogs_multiupdate",{[a]:this.getDialogOnly(a)}))});else{const e=document.createElement("i");e.dataset.savedFrom=s.peerId+"_"+s.mid,e.dir="auto",e.append(this.wrapMessageForReply(s,void 0,void 0,t)),i.push(e)}break}case"messageActionChatJoinedByRequest":{const a=U.a.isBroadcast(e.peerId);e.pFlags.out?n=a?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(n=a?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",i=[p(e.fromId,t)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":i=[p(e.fromId,t)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":i=[],"messageActionChatEditTitle"===s._&&i.push(p(e.fromId,t)),i.push(t?s.title:Object(z.a)(y.a.wrapEmojiText(s.title)));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const a=s.users||[s.user_id];if(i=[p(e.fromId,t)],a.length>1){const e=Object(l.join)(a.map(e=>p(e.toPeerId(),t)),!1,t);if(t)i.push(...e);else{const t=document.createElement("span");t.append(...e),i.push(t)}}else i.push(p(a[0].toPeerId(),t));break}case"messageActionBotAllowed":{const e=y.a.wrapRichText(s.domain,{entities:[{_:"messageEntityUrl",length:s.domain.length,offset:0}]});i=[Object(z.a)(e)];break}default:n=l.langPack[o]||`[${s._}]`}return n||(n=l.langPack[o],void 0===n&&(n="["+o+"]")),t?l.default.format(n,!0,i):Object(l._i18n)(a,n,i)}}wrapMessageActionTextNew(e,t){try{return this.wrapMessageActionTextNewUnsafe(e,t)}catch(e){return this.log.error("wrapMessageActionTextNewUnsafe error:",e),t?"":document.createElement("span")}}reportMessages(e,t,a,s){return g.a.invokeApiSingle("messages.report",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e)),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=Object(d.b)();return g.a.invokeApi("messages.startBot",{bot:R.a.getUserInput(e),peer:U.a.getInputPeerById(s),random_id:t,start_param:a}).then(e=>{A.a.processUpdateMessage(e)})}if(t){let a;return a=E.a.isChannel(t)?E.a.inviteToChannel(t,[e]):E.a.addChatUser(t,e,0),a.catch(e=>{if(!e||"USER_ALREADY_PARTICIPANT"!=e.type)throw e;e.handled=!0}).then(()=>{const t=R.a.getUser(e);return this.sendText(s,"/start@"+t.username)})}return this.sendText(s,"/start")}editPeerFolders(e,t){g.a.invokeApi("folders.editPeerFolders",{folder_peers:e.map(e=>({_:"inputFolderPeer",peer:U.a.getInputPeerById(e),folder_id:t}))}).then(e=>{A.a.processUpdateMessage(e)})}toggleDialogPin(e,t){var a;if(t>1)return this.filtersStorage.toggleDialogPin(e,t);const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!(null===(a=s.pFlags)||void 0===a?void 0:a.pinned)||void 0;if(n){const e=1===t?f.default.config.pinned_infolder_count_max:f.default.config.pinned_dialogs_count_max;if(this.dialogsStorage.getPinnedOrders(t).length>=e)return Promise.reject({type:"PINNED_DIALOGS_TOO_MUCH"})}return g.a.invokeApi("messages.toggleDialogPin",{peer:U.a.getInputDialogPeerById(e),pinned:n}).then(a=>{if(a){const a=n?{pinned:n}:{};A.a.saveUpdate({_:"updateDialogPinned",peer:U.a.getDialogPeer(e),folder_id:t,pFlags:a})}})}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return g.a.invokeApi("messages.markDialogUnread",{peer:U.a.getInputDialogPeerById(e),unread:n}).then(t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:U.a.getDialogPeer(e),pFlags:t})}})}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&E.a.hasChat(t.toChatId())){const a=E.a.getChat(e.toChatId());a&&a.migrated_to&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,f.default.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){if(e.pFlags.is_outgoing)return!1;const a=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&a.push("messageMediaPoll"),!("message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===a.indexOf(e.media._)||e.fromId&&R.a.isBot(e.fromId))&&(!e.media||"messageMediaDocument"!==e.media._||!e.media.document.sticker&&"round"!==e.media.document.type)}canEditMessage(e,t="text"){var a;return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===R.a.getSelf().id||!(!e.pFlags.out||e.peerId.isUser()&&e.date=t.mid)&&(!n.pFlags.selective&&(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return Object(Q.a)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:R.a.isBot(t.action.user_id)))&&(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},!0)}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0){return(a?g.a.invokeApiCacheable:g.a.invokeApi).bind(g.a)("messages.getSearchCounters",{peer:U.a.getInputPeerById(e),filters:t})}filterMessagesByInputFilter(e,t,a,s){const n=[];if(!t.length)return n;let i=!0;const r={},o=[],p=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,p.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:i=!1}if(!i)return n;for(let e=0,i=t.length;ee.includes(t._))||y.a.matchUrl(i.message))&&(d=!0)}}else r.avatar&&i.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(i.action._)&&(d=!0);if(d&&(n.push(i),n.length>=s))break}return n}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:d,maxDate:c}){t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),d=d?d/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilter(a._,m.history.slice,this.getMessagesStorage(e),n)),l.length){if(!(l.length{R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages),N.b&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach(e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=E.a.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)}),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}})}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=X.a.getServerMessageId(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:X.a.generateMessageId(a,!0),date:e.date,from_id:{_:"peerUser",user_id:b.c},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getDiscussionMessage(e,t){return g.a.invokeApiSingle("messages.getDiscussionMessage",{peer:U.a.getInputPeerById(e),msg_id:X.a.getServerMessageId(t)}).then(a=>{var s;E.a.saveApiChats(a.chats),R.a.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.filterMessages(a.messages[0],e=>!!e.replies)[0],i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid);return a.max_id=r.maxId=X.a.generateMessageId(a.max_id)||0,a.read_inbox_max_id=r.readMaxId=X.a.generateMessageId(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=X.a.generateMessageId(a.read_outbox_max_id)||0,this.threadsToReplies[i]=e+"_"+t,n})}handleNewMessage(e,t){void 0===this.newMessagesToHandle[e]&&(this.newMessagesToHandle[e]=new Set),this.newMessagesToHandle[e].add(t),this.newMessagesHandleTimeout||(this.newMessagesHandleTimeout=window.setTimeout(this.handleNewMessages,0))}scheduleHandleNewDialogs(e,t){return void 0!==e&&(this.newDialogsToHandle[e]=t),this.newDialogsHandlePromise?this.newDialogsHandlePromise:this.newDialogsHandlePromise=new Promise(e=>{setTimeout(()=>{e(),this.newDialogsHandlePromise=void 0,this.handleNewDialogs()},0)})}deleteMessages(e,t,a){var s,n;let i;const r=t.map(e=>X.a.getServerMessageId(e));if(e.isAnyChat()&&U.a.isChannel(e)){const a=e.toChatId(),o=E.a.getChat(a);if(!o.pFlags.creator&&!(null===(n=null===(s=o.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter(t=>!!this.getMessageByPeer(e,t).pFlags.out)).length)return;i=g.a.invokeApi("channels.deleteMessages",{channel:E.a.getChannelInput(a),id:r}).then(e=>{A.a.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})})}else i=g.a.invokeApi("messages.deleteMessages",{revoke:a,id:r}).then(e=>{A.a.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})});return i}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)&&!s)return this.log("readHistory: isn't unread"),Promise.resolve();const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=g.a.invokeApi("messages.readDiscussion",{peer:U.a.getInputPeerById(e),msg_id:X.a.getServerMessageId(a),read_max_id:X.a.getServerMessageId(t)})),A.a.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):U.a.isChannel(e)?(n.readPromise||(i=g.a.invokeApi("channels.readHistory",{channel:E.a.getChannelInput(e.toChatId()),max_id:X.a.getServerMessageId(t)})),A.a.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=g.a.invokeApi("messages.readHistory",{peer:U.a.getInputPeerById(e),max_id:X.a.getServerMessageId(t)}).then(e=>{A.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),A.a.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:U.a.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),q.a.soundReset(U.a.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally(()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)}),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}fixDialogUnreadMentionsIfNoMessage(e){const t=this.getDialogOnly(e);(null==t?void 0:t.unread_mentions_count)&&this.reloadConversation(e)}modifyCachedMentions(e,t,a){const s=this.unreadMentions[e];s&&(a?s.first.isEnd(P.a.Top)&&s.insertSlice([t]):s.delete(t))}fixUnreadMentionsCountIfNeeded(e,t){const a=this.getDialogOnly(e);!t.length&&(null==a?void 0:a.unread_mentions_count)&&this.reloadConversation(e)}goToNextMention(e){var t;const a=this.goToNextMentionPromises[e];if(a)return a;const s=null!==(t=this.unreadMentions[e])&&void 0!==t?t:this.unreadMentions[e]=new P.b,n=s.length,i=s.first.isEnd(P.a.Top);if(!n&&i)return this.fixUnreadMentionsCountIfNeeded(e,s),Promise.resolve();let r=Promise.resolve();return!i&&n<25&&(r=this.loadNextMentions(e)),this.goToNextMentionPromises[e]=r.then(()=>{const t=s.last,a=t&&t[t.length-1];a?(s.delete(a),f.default.dispatchEvent("history_focus",{peerId:e,mid:a})):this.fixUnreadMentionsCountIfNeeded(e,s)}).finally(()=>{delete this.goToNextMentionPromises[e]})}loadNextMentions(e){const t=this.unreadMentions[e],a=t.first[0]||1;return this.getUnreadMentions(e,a,-50,50).then(e=>{this.mergeHistoryResult(t,e,1===a?0:a,50,-50)})}getUnreadMentions(e,t,a,s,n=0,i=0){return g.a.invokeApiSingle("messages.getUnreadMentions",{peer:U.a.getInputPeerById(e),offset_id:X.a.getServerMessageId(t),add_offset:a,limit:s,max_id:X.a.getServerMessageId(n),min_id:X.a.getServerMessageId(i)}).then(e=>(Object(Q.a)(e),R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages),e))}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map(e=>X.a.getServerMessageId(e)),e.isAnyChat()&&U.a.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=g.a.invokeApi("channels.readMessageContents",{channel:E.a.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=g.a.invokeApi("messages.readMessageContents",{id:t}).then(e=>{s.pts=e.pts,s.pts_count=e.pts_count,A.a.processLocalUpdate(s)});return A.a.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s;return t?(this.threadsStorage[e]||(this.threadsStorage[e]={}),null!==(a=this.threadsStorage[e][t])&&void 0!==a?a:this.threadsStorage[e][t]={count:null,history:new P.b}):null!==(s=this.historiesStorage[e])&&void 0!==s?s:this.historiesStorage[e]={count:null,history:new P.b}}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if((null===(t=e.peerId)||void 0===t?void 0:t.isAnyChat())&&e.reply_to){const t=e.reply_to.reply_to_top_id||e.reply_to.reply_to_msg_id;a=e.peerId+"_"+t}return a}updateMessage(e,t,a){return this.wrapSingleMessage(e,t,!0).then(()=>{const s=this.getMessageByPeer(e,t);return a&&f.default.dispatchEvent(a,s),s})}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&f.default.dispatchEvent("history_update",{storage:s.storage,peerId:e.peerId,mid:e.mid}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e,t){const a={_:"inputPeerNotifySettings"};return void 0===t&&(t=!q.a.isPeerLocalMuted(e,!1)),a.mute_until=t?b.b:0,q.a.updateNotifySettings({_:"inputNotifyPeer",peer:U.a.getInputPeerById(e)},a)}canSendToPeer(e,t,a="send_messages"){if(e.isAnyChat()){const s=E.a.getChat(e.toChatId());return E.a.hasRights(e.toChatId(),a,void 0,!!t)&&(!s.pFlags.left||!!t)}return R.a.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(a){const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach(e=>{e.history.delete(n)});const o=this.getMessageFromStorage(r,n);return o.deleted||(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),f.default.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){Object(Q.a)(a);const{photo:e,document:s}=a.media;if(e){const a=x.a.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=D.a.getCacheContext(e,t.type),n=D.a.getCacheContext(a,"full");Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=x.a.getPhotoDownloadOptions(e,i),o=Object(j.a)(r.location);D.a.fakeDownload(o,n.url)}}else if(s){const e=T.a.getDoc(""+t);if(e&&e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type){const t=D.a.getCacheContext(s),a=D.a.getCacheContext(e);Object.assign(t,a);const n=T.a.getInputFileName(s);D.a.fakeDownload(n,a.url)}}else a.media.poll&&(delete O.a.polls[t],delete O.a.results[t])}const n=this.getMessageFromStorage(e,t);e.delete(t),this.handleReleasingMessage(n,e),f.default.dispatchEvent("message_sent",{storage:e,tempId:t,tempMessage:n,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,F.default.pushToState("maxSeenMsgId",e),g.a.invokeApi("messages.receivedMessages",{max_id:X.a.getServerMessageId(e)})}incrementMessageViews(e,t){if(t.length)return g.a.invokeApiSingle("messages.getMessagesViews",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e)),increment:!0}).then(a=>{const s=new Array(t.length),n=e.toChatId();for(let e=0,i=t.length;e{f.default.dispatchEvent("history_focus",{peerId:a,mid:e.mid})},s.message=i,s.key="msg"+e.mid,s.tag=n,s.silent=!0;const r=U.a.getPeerPhoto(a);r?K.a.loadAvatar(a,r,"photo_small").loadPromise.then(t=>{e.pFlags.unread&&(s.image=t,q.a.notify(s))}):q.a.notify(s)}getScheduledMessagesStorage(e){var t;return null!==(t=this.scheduledMessagesStorage[e])&&void 0!==t?t:this.scheduledMessagesStorage[e]=this.createMessageStorage()}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return Promise.resolve([]);const t=this.getScheduledMessagesStorage(e);return t.size?Promise.resolve([...t.keys()]):g.a.invokeApiSingle("messages.getScheduledHistory",{peer:U.a.getInputPeerById(e),hash:""}).then(t=>{if("messages.messagesNotModified"!==t._){R.a.saveApiUsers(t.users),E.a.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]})}sendScheduledMessages(e,t){return g.a.invokeApi("messages.sendScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e))}).then(e=>{A.a.processUpdateMessage(e)})}deleteScheduledMessages(e,t){return g.a.invokeApi("messages.deleteScheduledMessages",{peer:U.a.getInputPeerById(e),id:t.map(e=>X.a.getServerMessageId(e))}).then(e=>{A.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===b.d||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&!E.a.isInChat(e.toChatId())}getNewHistory(e,t){var a;return te(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(P.a.Bottom))return;delete s.maxId,n.unsetEnd(P.a.Bottom);let i=this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);i instanceof Promise&&(i=yield i);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a);return{count:i.count,history:(null==e?void 0:e.slice)||i.history.constructSlice(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}}):{count:i.count,history:o.slice,offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid);if(a&&X.a.getServerMessageId(a)&&!l.includes(a)&&pl[e]);++e);l.splice(e,0,a)}const m=e.insertSlice(l)||e.slice;return d&&m.setEnd(P.a.Top),c&&m.setEnd(P.a.Bottom),Object.assign({slice:m,mids:l,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){return this.requestHistory(e,t,a,s,void 0,i).then(i=>{const{count:r,isBottomEnd:o,slice:p,messages:d}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=r;for(let t=0,a=d.length;t{N.b&&this.log("requestHistory result:",e,r,t,a,s),R.a.saveApiUsers(r.users),E.a.saveApiChats(r.chats),this.saveMessages(r.messages),U.a.isChannel(e)&&A.a.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&r.messages[o-1].deleted&&(r.messages.splice(o-1,1),o--,p--);const d=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=d.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr)}return r},t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=E.a.getChat(e.toChatId());t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},A.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t})}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=new Promise(e=>{setTimeout(()=>{const t=[];for(const[e,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map(e=>({_:"inputMessageID",id:X.a.getServerMessageId(e)}));let i;i=e.isAnyChat()&&U.a.isChannel(e)?g.a.invokeApiSingle("channels.getMessages",{channel:E.a.getChannelInput(e.toChatId()),id:n}):g.a.invokeApiSingle("messages.getMessages",{id:n});const r=i.then(e=>{Object(Q.a)(e),R.a.saveApiUsers(e.users),E.a.saveApiChats(e.chats),this.saveMessages(e.messages);for(let t=0;t{f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:s})});t.push(r)}this.needSingleMessages.clear(),Promise.all(t).finally(()=>{this.fetchSingleMessagesPromise=null,this.needSingleMessages.size&&this.fetchSingleMessages(),e()})},0)})}wrapSingleMessage(e,t,a=!1){const s=this.getMessageByPeer(e,t);if(s.deleted||a){let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=Object(i.a)(),a.set(t,s),this.fetchSingleMessages(),s)}return f.default.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?U.a.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.wrapSingleMessage(t,e.reply_to_mid).then(t=>(t.deleted&&delete e.reply_to_mid,t))}setTyping(e,t,a){var s;let n=this.typings[e];return f.default.myId&&e&&this.canSendToPeer(e)&&e!==f.default.myId&&(a||(null===(s=null==n?void 0:n.action)||void 0===s?void 0:s._)!==t._)?((null==n?void 0:n.timeout)&&clearTimeout(n.timeout),n=this.typings[e]={action:t},g.a.invokeApi("messages.setTyping",{peer:U.a.getInputPeerById(e),action:t}).finally(()=>{n===this.typings[e]&&(n.timeout=window.setTimeout(()=>{delete this.typings[e]},6e3))})):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&h.a.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=B.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);B.a.deleteWebPageFromPending(a.webpage,n)}a.poll&&O.a.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(a.deleted){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,q.a.cancel("msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n);const r=this.newMessagesToHandle[e];r&&r.has(n)&&r.delete(n)}if(s.albums)for(const t in s.albums)f.default.dispatchEvent("album_edit",{peerId:e,groupId:t,deletedMids:[...s.albums[t]]});return s}handleEditedMessage(e,t){var a;if("message"===e._&&(null===(a=e.media)||void 0===a?void 0:a.webpage)){const t=B.a.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);B.a.deleteWebPageFromPending(e.media.webpage,t)}}getMediaFromMessage(e){return e.action?e.action.photo:e.media&&(e.media.photo||e.media.document||e.media.webpage&&(e.media.webpage.document||e.media.webpage.photo))}isMentionUnread(e){var t;const a=null===(t=e.media)||void 0===t?void 0:t.document;return e.pFlags.media_unread&&e.pFlags.mentioned&&(!a||!["voice","round"].includes(a.type))}getDialogUnreadCount(e){return e.unread_count||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return!e.pFlags.noforwards&&!U.a.noForwards(e.peerId)}};N.a.appMessagesManager=ae;t.a=ae},function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(32),r=a(15),o=a(51),p=a(41),d=a(16),c=a(47);const l=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],m=["red","green","yellow","blue","violet","pink","cyan","orange"],g=[0,7,4,1,6,3,5];["isChannel","isMegagroup","isAnyGroup","isBroadcast","isBot","isContact","isUser","isAnyChat"].forEach(e=>{const t=Array.isArray(e)?e[0]:e,a=Array.isArray(e)?e[1]:e;String.prototype[t]=function(){return h[a](this.toString())},Number.prototype[t]=function(){return h[a](this)}});const h=new class{canPinMessage(e){return e.isUser()||o.a.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=e.isUser()?p.a.getUserPhoto(e.toUserId()):o.a.getChatPhoto(e.toChatId());return"chatPhotoEmpty"!==t._&&"userProfilePhotoEmpty"!==t._?t:null}getPeerMigratedTo(e){if(e.isUser())return!1;const t=o.a.getChat(e.toChatId());return!!(t&&t.migrated_to&&t.pFlags.deactivated)&&this.getPeerId(t.migrated_to)}getPeerTitle(e,t=!1,a=!1){e||(e=r.default.myId);let s="";if(e.isUser()){const t=p.a.getUser(e.toUserId());t.first_name&&(s+=t.first_name),!t.last_name||a&&s||(s+=" "+t.last_name),s=s?s.trim():t.pFlags.deleted?d.default.format("HiddenName",!0):t.username}else{s=o.a.getChat(e.toChatId()).title,a&&(s=s.split(" ")[0])}return t?s:i.a.wrapEmojiText(s)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return o.a.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?p.a.getUserString(e.toUserId()):o.a.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeer(e).username||""}getPeer(e){return e.isUser()?p.a.getUser(e.toUserId()):o.a.getChat(e.toChatId())}getPeerId(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if(Object(n.f)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):r.default.myId}if(!e)return c.c;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&o.a.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&o.a.isMegagroup(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!o.a.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&p.a.isBot(e.toUserId())}isContact(e){return e.isUser()&&p.a.isContact(e.toUserId())}isUser(e){return+e>=0}isAnyChat(e){return!this.isUser(e)}getInputNotifyPeerById(e,t){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return o.a.getInputPeer(t)}const t=e.toUserId();return p.a.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:Object(n.f)(e)?e:this.getInputPeerById(e)}}getPeerColorById(e,t=!0){if(!e)return"";const a=g[Math.abs(+e)%7];return(t?m:l)[a]}getPeerSearchText(e){let t;if(this.isUser(e))t="%pu "+p.a.getUserSearchText(e.toUserId());else{t="%pg "+(o.a.getChat(e.toChatId()).title||"")}return t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===r.default.myId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return o.a.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return o.a.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;if(e.isUser())return!1;return!!(null===(t=o.a.getChatTyped(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}};s.a.appPeersManager=h,t.a=h},,,,,,,,function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(33),r=a(32),o=a(15),p=a(75),d=a(43),c=a(17),l=a(41);const m=new class{constructor(){this.storage=c.default.storages.chats,this.onChatUpdated=(e,t)=>{var a;p.a.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&o.default.dispatchEvent("invalidate_participants",e)},this.clear(!0),o.default.addMultipleEventsListeners({updateChannelParticipant:e=>{i.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=d.a.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,o.default.dispatchEvent("chat_update",t))}}),c.default.getState().then(e=>{const t=c.default.storagesResults.chats;if(t.length)for(let e=0,a=t.length;e{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})}),c.default.addEventListener("peerUnneeded",e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())})})}clear(e=!1){if(e)this.chats={};else{const e=c.default.storagesResults.chats;for(const t in this.chats)t&&(c.default.isPeerNeeded(t.toPeerId(!0))||(e.findAndSplice(e=>e.id===t),this.storage.delete(t),delete this.chats[t]))}}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach(e=>this.saveApiChat(e,t)))}saveApiChat(e,t){var a,s;if("chatEmpty"===e._)return;const i=this.chats[e.id];if(void 0===e.pFlags&&(e.pFlags={}),e.pFlags.min&&void 0!==i)return;e.initials=r.a.getAbbreviation(e.title),"channel"===e._&&void 0===e.participants_count&&void 0!==i&&i.participants_count&&(e.participants_count=i.participants_count);let p=!1,d=!1;if(void 0===i)this.chats[e.id]=e;else{(null===(a=i.photo)||void 0===a?void 0:a.photo_id)!==(null===(s=e.photo)||void 0===s?void 0:s.photo_id)&&(p=!0),i.title!==e.title&&(d=!0),Object(n.i)(i,e),o.default.dispatchEvent("chat_update",e.id)}const l=e.id.toPeerId(!0);p&&o.default.dispatchEvent("avatar_update",l),d&&o.default.dispatchEvent("peer_title_edit",l),c.default.isPeerNeeded(l)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]||{_:"chatEmpty",id:e,deleted:!0,access_hash:"",pFlags:{}}}getChatTyped(e){return this.getChat(e)}combineParticipantBannedRights(e,t){const a=this.getChat(e);if(a.default_banned_rights){t=Object(n.a)(t);const e=a.default_banned_rights.pFlags;for(let a in e)t.pFlags[a]=e[a]}return t}hasRights(e,t,a,s){const n=this.getChat(e);if("chatEmpty"===n._)return!1;if(n.pFlags.deactivated&&"view_messages"!==t)return!1;const i=void 0===a;if(n.pFlags.creator&&i)return!0;if("chatForbidden"===n._||"channelForbidden"===n._||n.pFlags.kicked||n.pFlags.left&&!n.pFlags.megagroup)return!1;if(!a&&!(a=n.admin_rights||n.banned_rights||n.default_banned_rights))return!1;let r={};switch(a&&(r=a.pFlags),t){case"embed_links":case"send_games":case"send_gifs":case"send_inline":case"send_media":case"send_messages":case"send_polls":case"send_stickers":if(!s&&n.pFlags.left)return!1;if("chatBannedRights"===a._&&r[t])return!1;if("channel"===n._&&!n.pFlags.megagroup&&!r.post_messages)return!1;break;case"delete_messages":case"manage_call":return!!r[t];case"pin_messages":return"chatAdminRights"===a._?r[t]||!!r.post_messages:!r[t];case"change_info":case"invite_users":return"chatAdminRights"===a._?r[t]:!r[t];case"change_type":case"delete_chat":return!1;case"ban_users":case"change_permissions":return"chatAdminRights"===a._&&!!r.ban_users;case"view_participants":return!("chat"!==n._&&n.pFlags.broadcast&&!n.pFlags.creator&&!n.admin_rights)}return!0}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&Object(n.b)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():i.a.invokeApi("messages.editChatDefaultBannedRights",{peer:d.a.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){const t=this.chats[e];return!(!t||"channel"!==t._||!t.pFlags.megagroup)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return("channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.kicked||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return"chatEmpty"!==t._&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return Object(n.f)(a)&&(t||!a.pFlags.min)}getChatPhoto(e){const t=this.getChat(e);return t&&t.photo||{_:"chatPhotoEmpty"}}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return i.a.invokeApi("channels.createChannel",e).then(e=>{p.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map(e=>l.a.getUserInput(e));return i.a.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return i.a.invokeApi("messages.createChat",{users:t.map(e=>l.a.getUserInput(e)),title:e}).then(e=>{p.a.processUpdateMessage(e);const t=e.chats[0].id;return o.default.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}leaveChannel(e){return i.a.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return i.a.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return i.a.invokeApi("messages.addChatUser",{chat_id:e,user_id:l.a.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return i.a.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:l.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,l.a.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return i.a.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return i.a.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):i.a.invokeApi("messages.migrateChat",{chat_id:e}).then(t=>{this.onChatUpdated(e,t);return t.updates.find(e=>"updateChannel"===e._).channel_id})}updateUsername(e,t){return i.a.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t}).then(a=>{if(a){this.getChat(e).username=t}return a})}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?i.a.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):i.a.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(e=>{p.a.processUpdateMessage(e)})}editTitle(e,t){let a;return a=this.isChannel(e)?i.a.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):i.a.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(e=>{p.a.processUpdateMessage(e)})}editAbout(e,t){const a=e.toPeerId(!0);return i.a.invokeApi("messages.editChatAbout",{peer:d.a.getInputPeerById(a),about:t}).then(e=>(e&&o.default.dispatchEvent("peer_bio_edit",a),e))}getParticipantPeerId(e){return e.peer?d.a.getPeerId(e.peer):e.user_id.toPeerId()}editBanned(e,t,a){const s="object"!=typeof t?t:this.getParticipantPeerId(t);return i.a.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:d.a.getInputPeerById(s),banned_rights:a}).then(n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;p.a.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:l.a.getSelf().id,peer:d.a.getOutputPeer(s),pFlags:{}}:void 0})}})}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return i.a.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then(e=>{this.saveApiChats(e.chats)})}togglePreHistoryHidden(e,t){return this.migrateChat(e).then(e=>i.a.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t})).then(e=>{p.a.processUpdateMessage(e)})}toggleSignatures(e,t){return i.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{p.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return i.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{p.a.processUpdateMessage(e)})}};s.a.appChatsManager=m,t.a=m},function(e,t,a){"use strict";a.d(t,"a",(function(){return m}));var s=a(29),n=a(43),i=a(15),r=a(16),o=a(36),p=a(41),d=a(32),c=a(47);const l=new WeakMap;s.a.peerTitleWeakMap=l,i.default.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=l.get(e);t&&t.update()})});class m{constructor(e){this.plainText=!1,this.onlyFirstName=!1,this.dialog=!1,this.element=document.createElement("span"),this.element.classList.add("peer-title"),this.element.setAttribute("dir","auto"),this.update(e),l.set(this.element,this)}update(e){if(e)for(let t in e)this.element.dataset[t]=e[t]?""+("boolean"==typeof e[t]?+e[t]:e[t]):"0",this[t]=e[t];void 0===this.fromName?(void 0===this.peerId&&(this.peerId=c.c),this.peerId===i.default.myId&&this.dialog?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Saved":"SavedMessages")):this.peerId.isUser()&&p.a.getUser(this.peerId).pFlags.deleted?Object(o.a)(this.element,Object(r.i18n)(this.onlyFirstName?"Deleted":"HiddenName")):this.element.innerHTML=n.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName)):this.element.innerHTML=d.b.wrapEmojiText(this.fromName)}}},,,function(e,t,a){"use strict";var s=a(56),n=a(115),i=a(31),r=a(0),o=a(33),p=a(145),d=a(73),c=a(41),l=a(140),m=a(29),g=a(106),h=a(130),u=a(38),y=a(96);class f{constructor(){this.photos={}}savePhoto(e,t){var a;if("photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(Object(i.h)("file_reference",s,e),p.a.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}choosePhotoSize(e,t=0,a=0,s=!1,n=!1){window.devicePixelRatio>1&&(t*=2,a*=2);let i={_:"photoSizeEmpty",type:""},r=e.sizes||e.thumbs;if(n&&r&&"document"===e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:void 0})),null==r?void 0:r.length){for(let e=0,s=r.length;e=t||n.height>=a)break}s&&"photoSizeEmpty"===i._&&"photoStrippedSize"===r[0]._&&(i=r[0])}return i}getUserPhotos(e,t="0",a=20){const s=c.a.getUserInput(e);return o.a.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then(a=>{c.a.saveApiUsers(a.users);const s=a.photos.map((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}})}getPreviewURLFromBytes(e,t=!1){let a,s;t?a=e instanceof Uint8Array?e:new Uint8Array(e):(a=new Uint8Array(f.jpegHeader.concat(Array.from(e.slice(3)),f.jpegTail)),a[164]=e[1],a[166]=e[2]),s=t?r.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const n=new Blob([a],{type:s});return URL.createObjectURL(n)}getPathFromPhotoPathSize(e){const t=e.bytes;let a="M";for(let e=0,s=t.length;e=192?a+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?a+=",":s>=64&&(a+="-"),a+=""+(63&s))}return a+="z",a}getPreviewURLFromThumb(e,t,a=!1){const s=d.a.getCacheContext(e,t.type);return s.url||(s.url=this.getPreviewURLFromBytes(t.bytes,a))}getImageFromStrippedThumb(e,t,a){const s=this.getPreviewURLFromThumb(e,t,!1),n=new Image;n.classList.add("thumbnail");const i=(a?Object(l.a)(s):Promise.resolve(s)).then(e=>Object(g.b)(n,e));return{image:n,loadPromise:i}}setAttachmentSize(e,t,a,s,n=!0,i,r,o){let p;o||(o=this.choosePhotoSize(e,a,s,void 0,r));const d="document"===e._;p=d?Object(u.c)(e.w||o.w||512,e.h||o.h||512):Object(u.c)(o.w||100,o.h||100);let c=Object(u.c)(a,s);c=p=p.aspect(c,n);let l=!0;return d&&!["video","gif"].includes(e.type)||(c.width<200&&c.height<200&&(c=p=p.aspectCovered(Object(u.c)(200,200))),i&&(i.message||i.reply_to_mid||i.media.webpage||i.replies&&i.replies.pFlags.comments&&777!==i.replies.channel_id)&&c.width<320&&(c=Object(u.c)(320,c.height),l=!1),l&&c.width<120&&i&&(c=Object(u.c)(120,c.height),l=!1)),t.style.width=c.width+"px",t.style.height=c.height+"px",{photoSize:o,size:p,isFit:l}}getStrippedThumbIfNeeded(e,t,a,s=!1){if(!t.downloaded||["video","gif"].includes(e.type)||s){if("document"===e._&&t.downloaded&&!s)return null;const n=e.sizes||e.thumbs,i=(null==n?void 0:n.length)?n.find(e=>"photoStrippedSize"===e._):null;if(i&&"bytes"in i)return this.getImageFromStrippedThumb(e,i,a)}return null}getPhotoDownloadOptions(e,t,a,s){const n="document"===e._;if(!t||"photoSizeEmpty"===t._)throw new Error("photoSizeEmpty!");const i=("photoSize"===t._||"photoSizeProgressive"===t._)&&e.access_hash&&e.file_reference,r={_:n?"inputDocumentFileLocation":"inputPhotoFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t.type};return{dcId:e.dc_id,location:r,size:i?t.size:void 0,queueId:a,onlyCache:s}}preloadPhoto(e,t,a,s){const i=this.getPhoto(e);if(!i||"photoEmpty"===i._)throw new Error("preloadPhoto photoEmpty!");if(!t){const e=y.a.width,a=y.a.height;t=this.choosePhotoSize(i,e,a)}const r=d.a.getCacheContext(i,t.type);if(r.downloaded>=("size"in t?t.size:0)&&r.url)return Promise.resolve();const o=this.getPhotoDownloadOptions(i,t,a,s),p=Object(n.a)(o.location);let c=d.a.getDownload(p);return c||(c=d.a.download(o),c.then(e=>{if(!r.downloaded||r.downloaded{}),c)}getPhoto(e){return Object(i.f)(e)?e:this.photos[e]}getInput(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}getMediaInput(e){return{_:"inputMediaPhoto",id:this.getInput(e),ttl_seconds:0}}savePhotoFile(e,t){const a=this.choosePhotoSize(e,65535,65535);if("photoSize"!==a._&&"photoSizeProgressive"!==a._)return;const s=this.getPhotoDownloadOptions(e,a,t);s.fileName="photo"+e.id+".jpg",d.a.downloadToDisc(s,s.fileName)}}f.jpegHeader=Object(s.c)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),f.jpegTail=Object(s.c)("ffd9");const _=new f;m.a&&(m.a.appPhotosManager=_),t.a=_},function(e,t,a){"use strict";function s(e){const t=e.length,a=new Array(t);for(let s=0;s>>t&24),2!==t&&s-i!=1||(a+=String.fromCharCode(r(n>>>18&63),r(n>>>12&63),r(n>>>6&63),r(63&n)),n=0);return a.replace(/A(?=A$|$)/g,"=")}function r(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function o(e,t){const a=e.length;if(a!==t.length)return!1;for(let s=0;se+(t.byteLength||t.length),0),a=new Uint8Array(t);let s=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,s),s+=e.byteLength||e.length}),a}function l(e){const t=new Uint8Array(e.byteLength);for(let a=0,s=4*e.length;a>>2]>>>24-a%4*8&255;return t}function m(e){const t=d(e),a=[];for(let e=0,s=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.d(t,"f",(function(){return s})),a.d(t,"c",(function(){return n})),a.d(t,"e",(function(){return i})),a.d(t,"b",(function(){return o})),a.d(t,"h",(function(){return p})),a.d(t,"i",(function(){return d})),a.d(t,"a",(function(){return c})),a.d(t,"d",(function(){return l})),a.d(t,"g",(function(){return m}))},,,,,,,,,,,function(e,t,a){"use strict";var s=a(33),n=a(15),i=a(76),r=a(92),o=a(29),p=a(39),d=a(128),c=a(98),l=a(54),m=a(38),g=a(99),h=a(32),u=a(91),y=a(108),f=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const _=new Set(["emoji","emojiAnimations"]);const v=new class{constructor(){this.storage=new r.a(d.a,"stickerSets"),this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.getAnimatedEmojiStickerSet(),n.default.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),n.default.dispatchEvent("stickers_installed",t.set)}}),this.getGreetingStickersTimeout=window.setTimeout(()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)},5e3)}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then(e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort((e,t)=>Math.random()-Math.random())})),this.getGreetingStickersPromise.then(()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),i.a.downloadDoc(this.greetingStickers[0]),t})}saveStickers(e){Object(p.d)(e,(t,a)=>{(t=i.a.saveDoc(t))?e[a]=t:e.splice(a,1)})}getStickerSet(e,t={}){return f(this,void 0,void 0,(function*(){const a=e.id;return this.getStickerSetPromises[a]?this.getStickerSetPromises[a]:this.getStickerSetPromises[a]=new Promise(n=>f(this,void 0,void 0,(function*(){var i;if(!t.overwrite){const e=yield this.storage.get(a);if(e&&(null===(i=e.documents)||void 0===i?void 0:i.length)&&(Date.now()-e.refreshTime<36e5||t.useCache))return this.saveStickers(e.documents),n(e),void delete this.getStickerSetPromises[a]}try{const i=yield s.a.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),r=t.saveById?a:i.set.id;this.saveStickerSet(i,r),n(i)}catch(e){n(null)}delete this.getStickerSetPromises[a]})))}))}getAnimatedEmojiStickerSet(){return Promise.all([this.getStickerSet({id:"emoji"},{saveById:!0}),this.getStickerSet({id:"emojiAnimations"},{saveById:!0}),this.getAnimatedEmojiSounds()]).then(([e,t])=>({emoji:e,animations:t}))}getAnimatedEmojiSounds(e){return this.getAnimatedEmojiSoundsPromise&&!e?this.getAnimatedEmojiSoundsPromise:this.getAnimatedEmojiSoundsPromise=s.a.getAppConfig(e).then(e=>{for(const t in e.emojies_sounds){const a=e.emojies_sounds[t],s=atob(Object(y.a)(a.file_reference_base64,!1)),r=new Uint8Array(s.length);for(let e=0,t=r.length;e(Object(u.a)(e),this.saveStickers(e.stickers),e)})}))}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=this.storage.getFromCache(t?"emojiAnimations":"emoji");if(!a||!a.documents)return;e=this.cleanEmoji(e);const s=a.packs.find(t=>t.emoticon===e);return s?i.a.getDoc(s.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e,t,a){const s=this.getAnimatedEmojiStickerSet().then(()=>{const s=this.getAnimatedEmojiSticker(e);if(s)return i.a.downloadDoc(s).then(c.c).then(n=>f(this,void 0,void 0,(function*(){const r=m.b.active.emojiSticker,o=Object(g.d)(e),p=yield l.a.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:r.width,height:null!=a?a:r.height,name:"doc"+s.id,autoplay:!1,loop:!1},"none",o);p.addEventListener("firstFrame",()=>{i.a.saveLottiePreview(s,p.canvas,o),p.remove()},{once:!0})})))});return Promise.all([s,this.preloadAnimatedEmojiStickerAnimation(e)])}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then(()=>{const t=this.getAnimatedEmojiSticker(e,!0);if(t){const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([i.a.downloadDoc(t),a?i.a.downloadDoc(a):void 0])}})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),this.saveStickers(e.documents);const n=s.set.installed_date||_.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find(e=>"photoSize"===e._),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return"emoji"===e.id?{_:"inputStickerSetAnimatedEmoji"}:"emojiAnimations"===e.id?{_:"inputStickerSetAnimatedEmojiAnimations"}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return f(this,void 0,void 0,(function*(){return(yield s.a.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>(Object(u.a)(e),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)})).sets}))}toggleStickerSet(e){return f(this,void 0,void 0,(function*(){if(e.installed_date){if(yield s.a.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,n.default.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else{if(yield s.a.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,n.default.dispatchEvent("stickers_installed",e),!0}return!1}))}searchStickerSets(e,t=!0){return f(this,void 0,void 0,(function*(){const a=t?1:0,n=yield s.a.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>(Object(u.a)(e),e.sets.forEach(e=>{this.saveStickerSet({set:e.set,documents:[],packs:[]},e.set.id)}),e)}),i=[],r=this.storage.getCache();for(let t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!n.sets.find(e=>e.set.id===a.id)&&i.push({_:"stickerSetCovered",set:a,cover:null})}return n.sets.concat(i)}))}getAllStickers(){return s.a.invokeApiHashable({method:"messages.getAllStickers"})}preloadStickerSets(){return this.getAllStickers().then(e=>Promise.all(e.sets.map(e=>this.getStickerSet(e,{useCache:!0}))))}getStickersByEmoticon(e,t=!0){return e=h.b.fixEmoji(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([s.a.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e}}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then(([t,a,s])=>{const n=t.stickers.map(e=>i.a.saveDoc(e)),r=[],o=[],p=t=>{for(const a of t){if(h.b.fixEmoji(a.emoticon).includes(e))for(const e of a.documents){const t=i.a.getDoc(e);(t.animated?r:o).push(t)}}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach(t=>{t.sort((t,a)=>e.indexOf(t)-e.indexOf(a))})}for(const e of a)p(e.packs);return[...new Set(r.concat(o,n))]})}pushRecentSticker(e){const t=h.b.fixEmoji(e.stickerEmojiRaw);for(const a in this.getStickersByEmoticonsPromises){this.getStickersByEmoticonsPromises[a].then(s=>{const n=s.findAndSplice(t=>t.id===e.id);n?s.unshift(n):a.includes(t)&&s.unshift(e)})}}};o.a.appStickersManager=v,t.a=v},,,,,,,function(e,t,a){"use strict";a.r(t),a.d(t,"AppProfileManager",(function(){return v}));var s=a(29),n=a(59),i=a(64),r=a(16),o=a(33),p=a(32),d=a(15),c=a(123),l=a(75),m=a(51),g=a(104),h=a(105),u=a(43),y=a(55),f=a(41),_=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class v{constructor(){this.usersFull={},this.chatsFull={},this.onUpdateUserTyping=e=>{var t;const a=e.user_id?e.user_id.toPeerId():u.a.getPeerId(e.from_id);if(d.default.myId===a||"speakingInGroupCallAction"===e.action._)return;const s=u.a.getPeerId(e),n=null!==(t=this.typingsInPeer[s])&&void 0!==t?t:this.typingsInPeer[s]=[];let i=n.find(e=>e.userId===a);const r=()=>{delete i.timeout;const e=n.indexOf(i);-1!==e&&n.splice(e,1),d.default.dispatchEvent("peer_typings",{peerId:s,typings:n}),n.length||delete this.typingsInPeer[s]};if(i&&void 0!==i.timeout&&clearTimeout(i.timeout),"sendMessageCancelAction"===e.action._){if(!i)return;return void r()}i||(i={userId:a},n.push(i)),i.action=e.action;const o=f.a.hasUser(a);o?f.a.forceUserOnline(a):"updateChatUserTyping"===e._&&e.chat_id&&m.a.hasChat(e.chat_id)&&!m.a.isChannel(e.chat_id)&&P.getChatFull(e.chat_id).then(()=>{void 0!==i.timeout&&f.a.hasUser(a)&&d.default.dispatchEvent("peer_typings",{peerId:s,typings:n})}),i.timeout=window.setTimeout(r,6e3),o&&d.default.dispatchEvent("peer_typings",{peerId:s,typings:n})},this.onUpdatePeerBlocked=e=>{const t=u.a.getPeerId(e.peer_id);if(u.a.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),d.default.dispatchEvent("user_full_update",a)}d.default.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})},d.default.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,d.default.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a,s;const n=this.chatsFull[e],i=m.a.getChat(e);if(!n||!i)return;let r=!1;!!n.call!=!!(null===(t=i.pFlags)||void 0===t?void 0:t.call_active)&&(r=!0);const{photo:o}=i;if(o){"chatPhotoEmpty"!==o._===("photoEmpty"!==(null===(a=n.chat_photo)||void 0===a?void 0:a._))&&o.photo_id===(null===(s=n.chat_photo)||void 0===s?void 0:s.id)||(r=!0)}r&&this.refreshFullPeer(e.toPeerId(!0))}),d.default.addEventListener("chat_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!0))}),d.default.addEventListener("user_full_update",e=>{d.default.dispatchEvent("peer_full_update",e.toPeerId(!1))}),d.default.addEventListener("invalidate_participants",e=>{this.invalidateChannelParticipants(e)}),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t?Promise.resolve(this.usersFull[e]):o.a.invokeApiSingleProcess({method:"users.getFullUser",params:{id:f.a.getUserInput(e)},processResult:t=>{m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);return a.profile_photo&&(a.profile_photo=y.a.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s})),void 0!==a.about&&(a.rAbout=p.a.wrapRichText(a.about,{noLinebreaks:!0})),h.a.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,d.default.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return u.a.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return this.getProfileByPeerId(e).then(e=>{switch(e._){case"userFull":return e.profile_photo;case"channelFull":case"chatFull":return e.chat_photo}})}getChatFull(e,t){if(m.a.isChannel(e))return this.getChannelFull(e,t);const a=this.chatsFull[e];if(a&&!t){const t=m.a.getChat(e);if(t.version===a.participants.version||t.pFlags.left)return Promise.resolve(a)}return o.a.invokeApiSingleProcess({method:"messages.getFullChat",params:{chat_id:e},processResult:t=>{m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const a=t.full_chat,s=e.toPeerId(!0);return a&&a.chat_photo&&a.chat_photo.id&&(a.chat_photo=y.a.savePhoto(a.chat_photo,{type:"profilePhoto",peerId:s})),h.a.savePeerSettings({peerId:s,settings:a.notify_settings}),this.chatsFull[e]=a,d.default.dispatchEvent("chat_full_update",e),a}})}getChatInviteLink(e,t){return this.getChatFull(e).then(a=>!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:o.a.invokeApi("messages.exportChatInvite",{peer:u.a.getInputPeerById(e.toPeerId(!0))}).then(t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=m.a.getChat(e);if(t&&t.pFlags&&(t.pFlags.kicked||t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights))return Promise.reject()}return o.a.invokeApiCacheable("channels.getParticipants",{channel:m.a.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then(e=>(f.a.saveApiUsers(e.users),e))}getChannelParticipant(e,t){return o.a.invokeApiSingle("channels.getParticipant",{channel:m.a.getChannelInput(e),participant:u.a.getInputPeerById(t)}).then(e=>(f.a.saveApiUsers(e.users),e.participant))}getChannelFull(e,t){return void 0===this.chatsFull[e]||t?o.a.invokeApiSingleProcess({method:"channels.getFullChannel",params:{channel:m.a.getChannelInput(e)},processResult:t=>{const a=e.toPeerId(!0);m.a.saveApiChats(t.chats,!0),f.a.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=y.a.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),h.a.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,d.default.dispatchEvent("chat_full_update",e),s},processError:t=>{switch(t.type){case"CHANNEL_PRIVATE":let t=m.a.getChat(e);t={_:"channelForbidden",access_hash:t.access_hash,title:t.title},l.a.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:[t],users:[]})}throw t}}):Promise.resolve(this.chatsFull[e])}getMentions(e,t,a){let s;return s=m.a.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:g.a.getServerMessageId(a)},50,0).then(e=>e.participants.map(e=>m.a.getParticipantPeerId(e))):e?this.getChatFull(e).then(e=>e.participants.participants.map(e=>e.user_id.toPeerId())):Promise.resolve([]),Promise.all([f.a.getTopPeers("bots_inline").catch(()=>[]),s]).then(e=>(e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new c.a({ignoreCase:!0}),s=new Map;e.forEach(e=>{a.indexObject(e.id,f.a.getUserSearchText(e.id)),s.set(e.id,e.rating)});const n=Array.from(a.search(t));return n.sort((e,t)=>s.get(t)-s.get(e)),n})(e[0].concat(e[1].map(e=>({id:e,rating:0})))))}invalidateChannelParticipants(e){o.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){e.isUser()?delete this.usersFull[e.toUserId()]:delete this.chatsFull[e.toChatId()],d.default.dispatchEvent("peer_full_update",e)}updateProfile(e,t,a){return o.a.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then(e=>(f.a.saveApiUser(e),this.getProfile(d.default.myId,!0)))}uploadProfilePhoto(e){return o.a.invokeApi("photos.uploadProfilePhoto",{file:e}).then(e=>{f.a.saveApiUsers(e.users);const t=d.default.myId;y.a.savePhoto(e.photo,{type:"profilePhoto",peerId:t});const a=t.toUserId();l.a.processLocalUpdate({_:"updateUserPhoto",user_id:a,date:Object(n.h)(!0),photo:f.a.getUser(a).photo,previous:!0})})}deletePhotos(e){return o.a.invokeApiSingle("photos.deletePhotos",{id:e.map(e=>{const t=y.a.getPhoto(e);return y.a.getInput(t)})}).then(e=>{})}getChatMembersString(e){var t,a;const s=m.a.getChat(e);if("chatForbidden"===s._)return Object(r.i18n)("YouWereKicked");const n=this.chatsFull[e];let o;o=n?"channelFull"===n._?n.participants_count:null===(t=n.participants.participants)||void 0===t?void 0:t.length:s.participants_count||(null===(a=s.participants)||void 0===a?void 0:a.participants.length);o=o||1;let p=m.a.isBroadcast(e)?"Peer.Status.Subscribers":"Peer.Status.Member";return Object(r.i18n)(p,[Object(i.d)(o)])}verifyParticipantForOnlineCount(e){const t=f.a.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce((e,t)=>e+ +this.verifyParticipantForOnlineCount(t),0)}getOnlines(e){var t;return _(this,void 0,void 0,(function*(){if(m.a.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(m.a.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield o.a.invokeApiCacheable("messages.getOnlines",{peer:m.a.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getPeerTypings(e){return this.typingsInPeer[e]}}const P=new v;s.a.appProfileManager=P,t.default=P},function(e,t,a){"use strict";var s=a(29),n=a(37),i=a(33),r=a(15),o=a(41),p=a(51),d=a(43),c=a(17),l=a(78),m=a(91),g=a(70),h=a(32),u=a(7);const y=new class{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=Object(n.b)("UPDATES",n.a.Error|n.a.Warn|n.a.Log),this.debug=s.b,this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{Object(m.a)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?r.default.myId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||r.default.myId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:d.a.getOutputPeer(s.toPeerId()),peer_id:d.a.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":o.a.saveApiUsers(e.users,t.override),p.a.saveApiChats(e.chats,t.override),e.updates.forEach(e=>{this.processUpdate(e,a)});break;default:this.log.warn("Unknown update message",e)}}}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;c.default.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){const e=this.updatesState,t=e.seq+1,a=e.pendingSeqUpdates[t];if(!a)return!1;const s=a.updates;for(let e=0,t=s.length;e=e.syncPending.seqAwaiting&&(e.syncPending.ptsAwaiting?delete e.syncPending.seqAwaiting:(clearTimeout(e.syncPending.timeout),e.syncPending=null)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort((e,t)=>e.pts-t.pts);let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:(clearTimeout(t.syncPending.timeout),t.syncPending=null)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState;let a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=i.a.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then(a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&r.default.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){o.a.saveApiUsers(a.users),p.a.saveApiChats(a.chats),a.other_updates.forEach(e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)}),a.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})});const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+l.a.serverTimeOffset,delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),r.default.dispatchEvent("state_cleared");if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")});return a||this.justAName(t,s),s}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),t.syncPending&&(clearTimeout(t.syncPending.timeout),t.syncPending=null);const s=i.a.invokeApi("updates.getChannelDifference",{channel:p.a.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:30},{timeout:2147483647}).then(a=>{if(this.debug&&this.log.debug("Get channel diff result",a),t.pts="pts"in a?a.pts:void 0,"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return this.debug&&this.log.debug("channel diff too long",a),delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(o.a.saveApiUsers(a.users),p.a.saveApiChats(a.chats),this.debug&&this.log.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach(e=>{this.saveUpdate(e)}),this.debug&&this.log.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach(e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})}),this.debug&&this.log.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);this.debug&&this.log.debug("finished channel get diff")}else this.debug&&this.log.debug("apply channel empty diff",a)});return a||this.justAName(t,s,e),s}justAName(e,t,a){e.syncLoading=t,r.default.dispatchEvent("state_synchronizing",a),t.then(()=>{e.syncLoading=null,r.default.dispatchEvent("state_synchronized",a)},()=>{e.syncLoading=null})}addChannelState(e,t){if(!t)throw new Error("Add channel state without pts "+e);return!(e in this.channelStates)&&(this.channelStates[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null},!0)}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a;let s;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":s=d.a.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(s=e.channel_id,!(s in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(s=e.channel_id)}const{pts:n,pts_count:i}=e,r=s?this.getChannelState(s,n):this.updatesState;if(r.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!r.lastPtsUpdateTime||r.lastPtsUpdateTime{r.syncPending=null,r.syncLoading||(s?this.getChannelDifference(s):this.getDifference())},6)}),r.syncPending.ptsAwaiting=!0,!1;if(n>r.pts)r.pts=n,c=!0,r.lastPtsUpdateTime=Date.now();else if(i)return!1;s&&t.date&&this.updatesState.date0){const a=t.seq,s=t.seqStart||a;if(s!==r.seq+1&&s>r.seq)return this.debug&&this.log.warn("Seq hole",r,r.syncPending&&r.syncPending.seqAwaiting),void 0===r.pendingSeqUpdates[s]&&(r.pendingSeqUpdates[s]={seq:a,date:t.date,updates:[]}),r.pendingSeqUpdates[s].updates.push(e),r.syncPending||(r.syncPending={timeout:window.setTimeout(()=>{r.syncPending=null,r.syncLoading||this.getDifference()},6)}),(!r.syncPending.seqAwaiting||r.syncPending.seqAwaiting{const t=c.default.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise(e=>{i.a.invokeApi("updates.getState",{},{noErrorBox:!0}).then(t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()})})),i.a.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t.split(" ")[0]+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${u.a.suffix} was updated to version alpha ${t}**\n\n`+e;const a=[],s={_:"updateServiceNotification",entities:a,message:h.b.parseMarkdown(e,a),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(s)}).catch(g.a)})}))}};s.a.apiUpdatesManager=y,t.a=y},function(e,t,a){"use strict";var s=a(115),n=a(31),i=a(145),r=a(159),o=a(32),p=a(73),d=a(55),c=a(140),l=a(33),m=a(29),g=a(59),h=a(15),u=a(129),y=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const f={mov:"video/quicktime",gif:"image/gif",pdf:"application/pdf"};const _=new class{constructor(){this.docs={},this.savingLottiePreview={},this.downloading=new Map,this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];if(t.supportsStreaming){delete t.supportsStreaming;delete p.a.getCacheContext(t).url}}},l.a.onServiceWorkerFail=this.onServiceWorkerFail}saveDoc(e,t){if("documentEmpty"===e._)return;const a=this.docs[e.id];if(e.file_reference&&(Object(n.h)("file_reference",a,e),i.a.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e),e.attributes.forEach(t=>{switch(t._){case"documentAttributeFilename":e.file_name=o.a.wrapPlainText(t.file_name),e.fileName=o.a.wrapEmojiText(t.file_name);break;case"documentAttributeAudio":e.duration=t.duration,e.audioTitle=o.a.wrapEmojiText(t.title),e.audioPerformer=o.a.wrapEmojiText(t.performer),e.type=t.pFlags.voice&&"audio/ogg"===e.mime_type?"voice":"audio";break;case"documentAttributeVideo":e.duration=t.duration,e.w=t.w,e.h=t.h,t.pFlags.round_message?e.type="round":e.type="video";break;case"documentAttributeSticker":void 0!==t.alt&&(e.stickerEmojiRaw=t.alt,e.stickerEmoji=o.a.wrapRichText(e.stickerEmojiRaw,{noLinks:!0,noLinebreaks:!0})),t.stickerset&&("inputStickerSetEmpty"===t.stickerset._?delete t.stickerset:"inputStickerSetID"===t.stickerset._&&(e.stickerSetInput=t.stickerset)),"image/webp"===e.mime_type&&(e.thumbs||u.a)&&(e.type="sticker",e.sticker=1);break;case"documentAttributeImageSize":e.type="photo",e.w=t.w,e.h=t.h;break;case"documentAttributeAnimated":"image/gif"!==e.mime_type&&"video/mp4"!==e.mime_type||(e.type="gif"),e.animated=!0}}),e.mime_type)e.mime_type===f.pdf?e.type="pdf":e.mime_type===f.gif&&(e.type="gif");else{const t=(e.file_name||"").split(".").pop(),a=t&&f[t.toLowerCase()];if(a)e.mime_type=a;else switch(e.type){case"gif":case"video":case"round":e.mime_type="video/mp4";break;case"sticker":e.mime_type="image/webp";break;case"audio":e.mime_type="audio/mpeg";break;case"voice":e.mime_type="audio/ogg";break;default:e.mime_type="application/octet-stream"}}if("voice"!==e.type&&"round"!==e.type||(e.file_name=e.fileName=e.type+"_"+Object(g.g)(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_")),l.a.isServiceWorkerOnline()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)){e.supportsStreaming=!0;const t=p.a.getCacheContext(e);t.url||(t.url=this.getFileURL(e))}return e.file_name||(e.file_name=e.fileName=""),"application/x-tgsticker"===e.mime_type&&"AnimatedSticker.tgs"===e.file_name&&(e.type="sticker",e.animated=!0,e.sticker=2),a?Object.assign(a,e):e}getDoc(e){return Object(n.f)(e)?e:this.docs[e]}getMediaInput(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}getInput(e,t){return{_:"inputDocumentFileLocation",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference,thumb_size:t}}getFileDownloadOptions(e,t,a,s){const n=this.getInput(e,null==t?void 0:t.type);let i;return i=t?e.sticker?"image/webp":"image/jpeg":e.mime_type||"application/octet-stream",{dcId:e.dc_id,location:n,size:t?t.size:e.size,mimeType:i,fileName:e.file_name,queueId:a,onlyCache:s}}getFileURL(e,t=!1,a){let n;return n=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",Object(s.b)(n,this.getFileDownloadOptions(e,a))}getThumbURL(e,t){let a=Promise.resolve();const s=p.a.getCacheContext(e,t.type);return s.url||(a="bytes"in t?Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{s.url=e}):d.a.preloadPhoto(e,t)),{thumb:t,cacheContext:s,promise:a}}getThumb(e,t=!0){const a=d.a.choosePhotoSize(e,0,0,!t);return"photoSizeEmpty"===a._?null:this.getThumbURL(e,a)}getInputFileName(e,t){return Object(s.a)(this.getInput(e,t),{fileName:e.file_name})}downloadDoc(e,t,a){const s=this.getInputFileName(e);let n=p.a.getDownload(s);if(n)return n;const i=this.getFileDownloadOptions(e,void 0,t,a);n=p.a.download(i),this.downloading.set(e.id,n),h.default.dispatchEvent("download_start",e.id);const o=p.a.getCacheContext(e),d=n;return d.then(e=>{o.url=URL.createObjectURL(e),o.downloaded=e.size},()=>{}).finally(()=>{this.downloading.delete(e.id)}),"voice"!==e.type||r.a.isPlaySupported()||(n=d.then(e=>y(this,void 0,void 0,(function*(){const t=new FileReader;return yield new Promise((a,s)=>{t.onloadend=e=>{const t=new Uint8Array(e.target.result);r.a.decode(t).then(e=>{o.url=e.url,a()},e=>{delete o.downloaded,s(e)})},t.readAsArrayBuffer(e)}),e})))),n.then(()=>{h.default.dispatchEvent("document_downloaded",e)}),n}saveLottiePreview(e,t,a){const s=e.id+"-"+a;if(this.savingLottiePreview[s])return;e.stickerCachedThumbs||(Object(n.c)(e,["stickerCachedThumbs"]),e.stickerCachedThumbs={});const i=e.stickerCachedThumbs[a];i&&i.w>=t.width&&i.h>=t.height||(this.savingLottiePreview[s]=!0,t.toBlob(n=>{const i={url:URL.createObjectURL(n),w:t.width,h:t.height};e.stickerCachedThumbs[a]=i,delete this.savingLottiePreview[s]}))}saveDocFile(e,t){const a=this.downloadDoc(e,t);return a.then(()=>{const t=p.a.getCacheContext(e);p.a.createDownloadAnchor(t.url,e.file_name)}),a}};m.a.appDocsManager=_,t.a=_},,function(e,t,a){"use strict";var s=a(29),n=a(62),i=a(33);const r=new class{constructor(){this.serverTimeOffset=0,n.a.get("server_time_offset").then(e=>{e&&(this.serverTimeOffset=e)}),i.a.addTaskListener("applyServerTimeOffset",e=>{this.serverTimeOffset=e.payload})}};s.a&&(s.a.serverTimeManager=r),t.a=r},,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"d",(function(){return c})),a.d(t,"b",(function(){return l})),a.d(t,"c",(function(){return m}));var s=a(37);class n{constructor(e){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver(t=>{if(this.locked)return;const a=[];t.forEach(e=>{const t=e.target;this.items.get(t)!==e.isIntersecting&&(this.items.set(t,e.isIntersecting),a[e.isIntersecting?"unshift":"push"]({target:t,visible:e.isIntersecting}))}),a.forEach(t=>{e(t.target,t.visible)})})}getVisible(){const e=[];return this.items.forEach((t,a)=>{t&&e.push(a)}),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}var i=a(39),r=a(97),o=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class p{constructor(e=8){this.parallelLimit=e,this.queueId=0,this.queue=[],this.inProcess=new Set,this.lockPromise=null,this.unlockResolve=null,this.log=Object(s.b)("LL",s.a.Error),this.processQueue=Object(r.a)(()=>this._processQueue(),20,!1)}clear(){this.inProcess.clear(),this.queue.length=0}lock(){this.lockPromise||(this.lockPromise=new Promise((e,t)=>{this.unlockResolve=e}))}unlock(){this.unlockResolve&&(this.unlockResolve(),this.unlockResolve=this.lockPromise=null,this.processQueue())}processItem(e){return o(this,void 0,void 0,(function*(){if(!this.lockPromise){this.inProcess.add(e);try{yield this.loadItem(e)}catch(e){["NO_ENTRY_FOUND","STORAGE_OFFLINE"].includes(e)||this.log.error("loadMediaQueue error:",e)}this.inProcess.delete(e),this.processQueue()}}))}loadItem(e){return e.load()}getItem(){return this.queue.shift()}addElement(e,t){this.queue[e](t),this.processQueue()}_processQueue(e){if(!this.queue.length||this.lockPromise||this.parallelLimit>0&&this.inProcess.size>=this.parallelLimit)return;do{if(e?Object(i.e)(this.queue,e):e=this.getItem(),!e)break;this.processItem(e),e=null}while(this.inProcess.sizee.div===t.div&&e.load===t.load))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){this.intersectorTimeout||(this.intersectorTimeout=window.setTimeout(()=>{this.intersectorTimeout=0,this.processQueue()},0))}push(e){super.push(e)}unshift(e){super.unshift(e)}unobserve(e){Object(i.c)(this.queue,t=>t.div===e),this.intersector.unobserve(e)}}class c extends d{constructor(e=8){super(e),this.parallelLimit=e,this.onVisibilityChange=(e,t)=>{t&&(Object(i.c)(this.queue,t=>t.div===e).forEach(e=>{e.wasSeen=!0,this.queue.unshift(e)}),this.setProcessQueueTimeout())},this.intersector=new n(this.onVisibilityChange)}getItem(){return this.queue.findAndSplice(e=>e.wasSeen)}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return o(this,void 0,void 0,(function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)}))}addElement(e,t){return!!super.addElement(e,t)&&(this.intersector.observe(t.div),t.hasOwnProperty("wasSeen")||(t.wasSeen=!1),!0)}}class l extends d{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this._queue=new Map,this.intersector=new n((e,t)=>{const a=Object(i.c)(this.queue,t=>t.div===e);if(t){(a.length?a:[this._queue.get(e)]).forEach(t=>{this.queue.unshift(t||this._queue.get(e))})}this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}clear(){super.clear(),this._queue.clear()}observe(e){this._queue.set(e.div,e),this.intersector.observe(e.div)}}class m extends d{constructor(e=8,t){super(e),this.parallelLimit=e,this.onVisibilityChange=t,this.intersector=new n((e,t)=>{const a=Object(i.c)(this.queue,t=>t.div===e);t&&a.length&&a.forEach(e=>{this.queue.unshift(e)}),this.onVisibilityChange&&this.onVisibilityChange(e,t),this.setProcessQueueTimeout()})}observe(e){this.intersector.observe(e)}}},function(e,t,a){"use strict";a.d(t,"a",(function(){return o}));var s=a(16);const n=new Map;let i=0;const r=(e,t,a="")=>{a=t.country_code+a,i=Math.max(i,a.length),n.set(a,{country:e,code:t})};function o(e){e=e||"",n.size||s.default.countriesList.forEach(e=>{e.country_codes.forEach(t=>{t.prefixes?t.prefixes.forEach(a=>{r(e,t,a)}):r(e,t)})});let t,a=e.replace(/\D/g,""),o=a.slice(0,i);for(let e=o.length-1;e>=0&&(t=n.get(o.slice(0,e+1)),!t);--e);if(!t)return{formatted:a,country:void 0,code:void 0,leftPattern:""};const p=t.country,d=t.code.patterns||[],c=a.slice(t.code.country_code.length);let l="",m=0,g="";for(let e=d.length-1;e>=0;--e){l=d[e];const t=l.replace(/ /g,"");let a=0;for(let e=0,s=Math.min(c.length,t.length);em&&(m=a,g=l)}l=g||l,l=l.replace(/\d/g,"X"),l=t.code.country_code+" "+l,l.split("").forEach((e,t)=>{" "===e&&" "!==a[t]&&a.length>t&&(a=a.slice(0,t)+" "+a.slice(t))});let h=l&&l.length>a.length?l.slice(a.length):"";return h&&(h=h.replace(/X/g,"‒")),{formatted:a,country:p,code:t.code,leftPattern:h}}},,,,,,function(e,t,a){"use strict";function s(e){}a.d(t,"a",(function(){return s}))},,,function(e,t,a){"use strict";function s(e){const t=document.createElement("span");return t.innerHTML=e,t}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"b",(function(){return i})),a.d(t,"c",(function(){return o})),a.d(t,"d",(function(){return p})),a.d(t,"a",(function(){return d}));var s=a(56),n=a(114);function i(e){return"object"==typeof e&&null!==e}function r(e){return e>>>0}function o(e,t){e=r(e),t=r(t);const a=Object(n.x)(e.toString(16),16,32);Object(n.p)(a,32),Object(n.b)(a,Object(n.x)(t.toString(16),16,32));return Object(n.d)(a,10)}function p(e){return e.map(e=>Object(n.x)(e,10)).sort((e,t)=>Object(n.g)(e,t)).map(e=>Object(n.d)(e,10))}function d(e,t=16,a,n=!1,i=!1){const r=e.byteLength||e.length,o=n?t-r:t-r%t;if(o>0&&o{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};t.a=s},,,,,,,,function(e,t,a){"use strict";var s=a(29);class n{constructor(){this.tempNum=0}generateMessageId(e,t=!1){const a=n.MESSAGE_ID_OFFSET,s=t?++this.tempNum:0;return e>=a?t?e+(s&n.MESSAGE_ID_INCREMENT-1):e:a+(e*n.MESSAGE_ID_INCREMENT+(s&n.MESSAGE_ID_INCREMENT-1))}getServerMessageId(e){return this.clearMessageId(e,!0)}clearMessageId(e,t){const a=n.MESSAGE_ID_OFFSET;if(e{Promise.all(["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map(e=>h.a.get(e))).then(e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&m.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?m.default.subscribe():m.default.unsubscribe())}m.default.setSettings(this.settings)}),v.default.getState().then(e=>{this.settings.nosound=!e.settings.notifications.sound})},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)},navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.topMessagesDeferred=Object(i.a)(),this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),g.default.addEventListener("instance_deactivated",()=>{this.stop()}),g.default.addEventListener("instance_activated",()=>{this.stopped&&this.start()}),g.default.addEventListener("idle",e=>{this.stopped||(e||this.clear(),this.toggleToggler())}),g.default.addMultipleEventsListeners({updateNotifySettings:e=>{const t="notifyPeer"===e.peer._&&f.a.getPeerId(e.peer.peer),a="notifyPeer"!==e.peer._?e.peer._:void 0;this.savePeerSettings({key:a,peerId:t,settings:e.notify_settings}),g.default.dispatchEvent("notify_settings",e)}}),g.default.addEventListener("push_init",e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):m.default.subscribe()}),g.default.addEventListener("push_subscribe",e=>{this.registerDevice(e)}),g.default.addEventListener("push_unsubscribe",e=>{this.unregisterDevice(e)}),g.default.addEventListener("dialogs_multiupdate",()=>{this.topMessagesDeferred.resolve()},{once:!0}),g.default.addEventListener("push_notification_click",e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void l.a.invokeApi("account.updateDeviceLocked",{period:86400}).then(()=>{});const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then(()=>{e.custom.channel_id&&!y.a.hasChat(e.custom.channel_id)||t.isUser()&&!P.a.hasUser(t)||g.default.dispatchEvent("history_focus",{peerId:t,mid:+e.custom.msg_id})})})}toggleToggler(e=g.default.idle.isIDLE){if(d.IS_MOBILE)return;const t=()=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval(()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=c.default.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const a=t.getContext("2d");a.beginPath(),a.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),a.fillStyle="#3390ec",a.fill();let n=24,i=""+e;e<10?n=22:e<100?n=20:(i="99+",n=16),n*=window.devicePixelRatio,a.font=`700 ${n}px ${s.b}`,a.textBaseline="middle",a.textAlign="center",a.fillStyle="white",a.fillText(i,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)},1e3):t()}getLocalSettings(){return this.settings}getNotifySettings(e){let t,a=Object(p.b)(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=f.a.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=l.a.invokeApi("account.getNotifySettings",{peer:e}).then(e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e)))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map(e=>this.getNotifySettings({_:e}));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return l.a.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then(a=>{a&&u.a.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:Object(p.b)(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})})}getNotifyExceptions(){l.a.invokeApi("account.getNotifyExceptions",{compare_sound:!0}).then(e=>{u.a.processUpdateMessage(e)})}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=l.a.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){l.a.invokeApi("account.setContactSignUpNotification",{silent:e}).then(t=>{this.notifyContactsSignUp=Promise.resolve(!e)})}setFavicon(e="assets/img/favicon.ico"){if(this.prevFavicon===e)return;const t=this.faviconEl.cloneNode();t.href=e,this.faviconEl.parentNode.replaceChild(t,this.faviconEl),this.faviconEl=t,this.prevFavicon=e}savePeerSettings({key:e,peerId:t,settings:a}){let s;t&&(e=t,s=this.peerSettings.notifyPeer),(s||this.peerSettings)[e]=a,t||g.default.dispatchEvent("notify_peer_type_settings",{key:e,settings:a})}isMuted(e){return"peerNotifySettings"===e._&&(1e3*e.mute_until>Object(r.h)()||e.silent)}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:f.a.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then(e=>this.isMuted(e))}getPeerLocalSettings(e,t=!0){const a={_:"peerNotifySettings"},s=this.peerSettings.notifyPeer[e];if(!s||s instanceof Promise||Object.assign(a,s),t){const t=f.a.getInputNotifyPeerById(e,!0),s=Object(p.b)(t._),n=this.peerSettings[s];if(n&&!(n instanceof Promise))for(let e in n)void 0===a[e]&&(a[e]=n[e])}return a}isPeerLocalMuted(e,t=!0){if(e===g.default.myId)return!1;const a=this.getPeerLocalSettings(e,t);return this.isMuted(a)}start(){if(this.updateLocalSettings(),g.default.addEventListener("settings_updated",this.updateLocalSettings),m.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),this.notificationsCount++,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,a=e.key||"k"+t;this.notificationsShown[a]=!0;const s=Object(r.h)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(let t in this.notificationsShown){const a=this.notificationsShown[t];"boolean"!=typeof a&&a.tag===e.tag&&(a.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void m.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),_.a.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[a],this.clear())},n.show&&n.show(),this.notificationsShown[a]=n,d.IS_MOBILE||setTimeout(()=>{this.hide(a)},8e3)}}testSound(e){const t=Object(r.h)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",()=>{s.remove()},{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,m.default.hidePushNotifications()}registerDevice(e){if(this.registeredDevice&&Object(o.b)(this.registeredDevice,e))return!1;l.a.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then(()=>{this.registeredDevice=e},e=>{e.handled=!0})}unregisterDevice(e){if(!this.registeredDevice)return!1;l.a.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then(()=>{this.registeredDevice=!1},e=>{e.handled=!0})}getVibrateSupport(){return this.vibrateSupport}};n.a.appNotificationsManager=I,t.a=I},function(e,t,a){"use strict";a.d(t,"a",(function(){return i})),a.d(t,"b",(function(){return r}));const s={},n=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function i(e,t,a,i=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(a&&a());if(s[t]&&i||e instanceof HTMLVideoElement)e&&n(e,t),a&&a();else{const i=e instanceof HTMLImageElement,r=i?e:new Image;r.src=t,r.addEventListener("load",()=>{!i&&e&&n(e,t),s[t]=!0,a&&a()},{once:!0}),a&&r.addEventListener("error",a)}}function r(e,t,a){return new Promise(s=>{i(e,t,s,a)})}},,function(e,t,a){"use strict";function s(e,t){return t?e.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=+$/,""):e.replace(/-/g,"+").replace(/_/g,"/")}a.d(t,"a",(function(){return s}))},,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var s=a(65),n=a(44),i=a(31),r=a(5),o=a(30),p=a(68);class d{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&Object(r.a)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&Object(i.g)(this,e)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&Object(o.b)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,a=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const i=Date.now()-a;if(!s&&this.cancelable){this.setProgress(100);const e=150;i{t===this.tempId&&this.detach()},e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),Object(n.b)(()=>{this.setManual()})):this.detach();this.promise=e=null};e.then(()=>s(null)).catch(e=>s(e)),e.addNotifyListener&&e.addNotifyListener(e=>{if(t!==this.tempId)return;const a=e.done/e.total*100;this.setProgress(a)})}attach(e,t=!1,a){if(this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,a&&this.attachPromise(a),this.detached||this.preloader.parentElement!==e){const t=Object(p.a)(this.preloader)?1:2;this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader),Object(s.a)(this.preloader,"is-visible",!0,200,void 0,t)}this.cancelable&&t&&this.setProgress(0)}detach(){this.detached||(this.detached=!0,this.preloader&&this.preloader.parentElement&&Object(s.a)(this.preloader,"is-visible",!1,200,()=>{this.preloader.remove()},1))}setProgress(e){if(this.totalLength||Object(p.a)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},function(e,t,a){"use strict";a.d(t,"b",(function(){return o})),a.d(t,"c",(function(){return p})),a.d(t,"a",(function(){return d})),a.d(t,"e",(function(){return c})),a.d(t,"d",(function(){return l})),a.d(t,"f",(function(){return m}));var s=a(38),n=a(81),i=a(0),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function o(e){let t,a;return e instanceof HTMLVideoElement?(t=e.videoWidth,a=e.videoHeight):(t=e.naturalWidth,a=e.naturalHeight),n={media:e,mediaSize:Object(s.c)(t,a),boxSize:Object(s.c)(320,240),quality:.9},new Promise(e=>{var t,a;const s=document.createElement("canvas"),i=n.mediaSize.aspectFitted(n.boxSize);s.width=i.width*window.devicePixelRatio,s.height=i.height*window.devicePixelRatio,s.getContext("2d").drawImage(n.media,0,0,s.width,s.height),s.toBlob(t=>{e({blob:t,size:i})},null!==(t=n.mimeType)&&void 0!==t?t:"image/jpeg",null!==(a=n.quality)&&void 0!==a?a:1)});var n}function p(e){return new Promise((t,a)=>{e.onseeked=()=>{e.onseeked=()=>{o(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=a,e.currentTime=Math.min(e.duration,1)})}function d(e){return r(this,void 0,void 0,(function*(){const t=yield function(e){return new Promise((t,a)=>{const s=document.createElement("video");s.volume=0,s.addEventListener("loadedmetadata",()=>t(s),{once:!0}),s.addEventListener("error",a,{once:!0}),s.src=e})}(e);return Promise.race([Object(n.a)(2e3),p(t)])}))}function c(e,t=e.HAVE_METADATA,a){return new Promise(s=>{e.readyState>=t?s():e.addEventListener(i.IS_APPLE_MOBILE&&!a?"loadeddata":"canplay",()=>s(),{once:!0})})}function l(e,t=!1){return r(this,void 0,void 0,(function*(){const a=[],s=(e,n)=>r(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise((e,a)=>{t.readEntries(t=>r(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()})))})}else if(e)if(t)a.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise((a,s)=>e.file(a,e=>a(t)));if(!s)return;a.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{t.addEventListener("change",t=>{const s=t.target.files[0];s?e(s):a("NO_FILE_SELECTED")},{once:!0})}).finally(()=>{t.remove()});return t.click(),a}},function(e,t,a){"use strict";a.d(t,"f",(function(){return n})),a.d(t,"t",(function(){return d})),a.d(t,"e",(function(){return C})),a.d(t,"q",(function(){return w})),a.d(t,"r",(function(){return k})),a.d(t,"v",(function(){return A})),a.d(t,"u",(function(){return E})),a.d(t,"y",(function(){return T})),a.d(t,"a",(function(){return D})),a.d(t,"k",(function(){return U})),a.d(t,"s",(function(){return x})),a.d(t,"m",(function(){return F})),a.d(t,"j",(function(){return R})),a.d(t,"n",(function(){return V})),a.d(t,"x",(function(){return j})),a.d(t,"l",(function(){return L})),a.d(t,"o",(function(){return q})),a.d(t,"d",(function(){return G})),a.d(t,"c",(function(){return H})),a.d(t,"g",(function(){return z})),a.d(t,"i",(function(){return K})),a.d(t,"h",(function(){return $})),a.d(t,"w",(function(){return Q})),a.d(t,"p",(function(){return Y})),a.d(t,"z",(function(){return ne})),a.d(t,"b",(function(){return ie}));var s,n=0,i=0,r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(n=0;1<1<>=1))-1)+1;var o,p,d=V(1,1,1),c=(V(0,1,1),new Array(0)),l=c,m=c,g=c,h=c,u=c,y=c,f=c,_=c,v=c,P=c,b=c,I=c,S=c;function C(e){var t,a,s;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,s=e[t];s;s>>=1,a++);return a+=n*t}function M(e,t){var a=V(0,(e.length>t?e.length:t)*n,0);return K(a,e),a}function w(e,t){var a=W(e);return re(a,t),de(a,1)}function k(e,t){var a=M(e,e.length+t.length);return function(e,t){var a;l.length!=2*e.length&&(l=new Array(2*e.length));for($(l,0),a=0;at.length?e.length+1:t.length+1);return ne(a,t),de(a,1)}function D(e,t){var a=M(e,e.length>t.length?e.length+1:t.length+1);return ie(a,t),de(a,1)}function U(e,t,a,s,n){var i=0,r=Math.max(e.length,t.length);for(v.length!=r&&(v=new Array(r),P=new Array(r),b=new Array(r),I=new Array(r),S=new Array(r));!(1&e[0]||1&t[0]);)X(e),X(t),i++;for(K(v,e),K(a,t),$(P,1),$(b,0),$(I,0),$(S,1);;){for(;!(1&v[0]);)X(v),1&P[0]||1&b[0]?(ie(P,t),X(P),ne(b,e),X(b)):(X(P),X(b));for(;!(1&a[0]);)X(a),1&I[0]||1&S[0]?(ie(I,t),X(I),ne(S,e),X(S)):(X(I),X(S));if(F(a,v)?(ne(a,v),ne(I,P),ne(S,b)):(ne(v,a),ne(P,I),ne(b,S)),L(v,0)){for(;x(I);)ie(I,t),ne(S,e);return Z(S,-1),K(s,I),K(n,S),void Y(a,i)}}}function x(e){return e[e.length-1]>>n-1&1}function O(e,t,a){var s,n=e.length,i=t.length;for(o=n+a=0;s++)if(e[s]>0)return 1;for(s=n-1+a;s0)return 0;for(s=o-1;s>=a;s--){if(e[s-a]>t[s])return 1;if(e[s-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(Y(t,g=n-g),Y(r,g),o=r.length;0===r[o-1]&&o>p;o--);for($(a,0);!O(t,r,o-p);)se(r,t,o-p),a[o-p]++;for(d=o-1;d>=p;d--){for(r[d]==t[p-1]?a[d-p]=i:a[d-p]=Math.floor((r[d]*s+r[d-1])/t[p-1]);m=(l=(p>1?t[p-2]:0)*a[d-p])>>n,l&=i,m=(c=m+a[d-p]*t[p-1])>>n,c&=i,m==r[d]?c==r[d-1]?l>(d>1?r[d-2]:0):c>r[d-1]:m>r[d];)a[d-p]--;te(r,t,-a[d-p],d-p),x(r)&&(ae(r,t,d-p),a[d-p]--)}Q(t,g),Q(r,g)}function B(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*s+e[a])%t;return n}function V(e,t,a){var s;s=a>(s=Math.ceil(t/n)+1)?a:s;var i=new Array(s);return $(i,e),i}function j(e,t,a){var s,n,i,o,p,d=e.length;if(-1===t){for(i=new Array(0);;){for(o=new Array(i.length+1),n=0;n=36&&(s-=26),!(s>=t||s<0));n++)Z(i,t),J(i,s);for(d=i.length;d>0&&!i[d-1];d--);for(d=a>d+1?a:d+1,o=new Array(d),p=dt.length){for(;a0;a--)n+=e[a]+",";n+=e[0]}else for(;!q(y);)s=ee(y,t),n=r.substring(s,s+1)+n;return 0===n.length&&(n="0"),n}function H(e,t=!0){y.length!==e.length?y=W(e):K(y,e);const a=[];for(;!q(y);)c=ee(y,256),a.push(c);return t&&a.reverse(),a}function z(e,t){return F(e,t)?1:N(e,t)?0:-1}function W(e){return K(p=Array(e.length),e),p}function K(e,t){var a,s=e.length>=n}function J(e,t){var a,r,o,p;for(e[0]+=t,r=e.length,o=0,a=0;a>n))*s),e[a]=o&i,!(o=(o>>n)-p))return}function Q(e,t){var a,s=Math.floor(t/n);if(s){for(a=0;a>t);e[a]>>=t}function X(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&s>>1}function Y(e,t){var a,s=Math.floor(t/n);if(s){for(a=e.length;a>=s;a--)e[a]=e[a-s];for(;a>=0;a--)e[a]=0;t%=n}if(t){for(a=e.length-1;a>0;a--)e[a]=i&(e[a]<>n-t);e[a]=i&e[a]<>n))*s),e[a]=o&i,o=(o>>n)-p}function ee(e,t){var a,n,i=0;for(a=e.length-1;a>=0;a--)n=i*s+e[a],e[a]=Math.floor(n/t),i=n%t;return i}function te(e,t,a,s){var r,o,p,d;for(p=e.length>=n;for(r=p;o&&r>=n}function ae(e,t,a){var s,r,o,p;for(o=e.length>=n;for(s=o;r&&s>=n}function se(e,t,a){var s,r,o,p;for(o=e.length>=n;for(s=o;r&&s>=n}function ne(e,t){var a,s,r;for(r=e.length>=n;for(a=r;s&&a>=n}function ie(e,t){var a,s,r;for(r=e.length>=n;for(a=r;s&&a>=n}function re(e,t){h.length!==e.length?h=W(e):K(h,e),u.length!==e.length&&(u=W(e)),R(h,t,u,e)}function oe(e,t,a){var s;for(m.length!=2*e.length&&(m=new Array(2*e.length)),$(m,0),s=0;s0&&!e[o-1];o--);for(p=o>t.length?2*o:2*t.length,m.length!=p&&(m=new Array(p)),$(m,0),a=0;a>=n,s=a+1;s>=n;m[a+o]=r}re(m,t),K(e,m)}function de(e,t){var a,s;for(a=e.length;a>0&&!e[a-1];a--);return K(s=new Array(a+t),e),s}function ce(e,t,a){var i,r,o,p;if(f.length!=a.length&&(f=W(a)),0!=(1&a[0])){for($(f,0),o=a.length;o>0&&!a[o-1];o--);for(p=s-function(e,t){for(var a=1,s=0;;){if(1===e)return a;if(0===e)return 0;if(s-=a*Math.floor(t/e),1===(t%=e))return s;if(0===t)return 0;a-=s*Math.floor(e/t),e%=t}}(B(a,s),s),f[o]=1,oe(e,f,a),g.length!=e.length?g=W(e):K(g,e),i=t.length-1;i>0&!t[i];i--);if(0!=t[i]){for(r=1<>=1);for(;;){if(!(r>>=1)){if(--i<0)return void le(e,d,a,p);r=1<0&&0==a[m-1];m--);for(;g>0&&0==t[g-1];g--);for(l=_.length-1,r=0;r>n,c=e[r],o=1;o>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o]+c*t[o],_[o-1]=p&i,p>>=n,o++;for(;o>=n,o++;for(;o>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++,p+=_[o]+d*a[o],_[o-1]=p&i,p>>=n,o++;for(;o>=n,o++;for(;o>=n,o++;_[o-1]=p&i}F(a,_)||ne(_,a),K(e,_)}},,function(e,t,a){"use strict";var s=a(106),n=a(36),i=a(66),r=a(47),o=a(32),p=a(15),d=a(73),c=a(43),l=a(55),m=a(41);const g=new class{constructor(){this.savedAvatarURLs={}}isAvatarCached(e){return!!this.savedAvatarURLs[e]}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){const s=c.a.getInputPeerById(e);let n,i=!1,r=this.savedAvatarURLs[e];if(r&&r[a])"string"!=typeof r[a]?n=r[a]:(n=Promise.resolve(r[a]),i=!0);else{r||(r=this.savedAvatarURLs[e]={});const i={_:"inputPeerPhotoFileLocation",pFlags:{},peer:s,photo_id:t.photo_id};"photo_big"===a&&(i.pFlags.big=!0);const o={dcId:t.dc_id,location:i},p=d.a.download(o);n=r[a]=p.then(e=>r[a]=URL.createObjectURL(e))}return{cached:i,loadPromise:n}}putAvatar(e,t,a,r,o=new Image,d=!1){let c,m,g,{cached:h,loadPromise:u}=this.loadAvatar(t,a,r);if(o.classList.add("avatar-photo"),h)m=()=>{Object(n.a)(e,o),e.dataset.color=""};else{const d=p.default.settings.animationsEnabled;if(d&&o.classList.add("fade-in"),"photo_big"===r){const s=this.putAvatar(e,t,a,"photo_small");c=s.loadPromise,g=s.thumbImage}else if(a.stripped_thumb){g=new Image,e.classList.add("avatar-relative"),g.classList.add("avatar-photo","avatar-photo-thumbnail");const t=l.a.getPreviewURLFromBytes(a.stripped_thumb);c=Object(s.b)(g,t).then(()=>{Object(n.a)(e,g)})}m=()=>{g?e.append(o):Object(n.a)(e,o),setTimeout(()=>{e.childElementCount&&i.a.mutateElement(o,()=>{e.dataset.color="",d&&o.classList.remove("fade-in"),g&&g.remove()})},d?200:0)}}const y=u.then(e=>Object(s.b)(o,e)).then(m);return{cached:h,loadPromise:c||y,thumbImage:g}}s(e,t,a,s){e.innerHTML=t,e.dataset.color=a,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled"),s&&e.classList.add(s)}putPhoto(e,t,a=!1,s="",n=!1){var i;const d=p.default.myId;if(t===d&&a)return void this.s(e,"","","tgico-saved");if(t!==r.c&&t.isUser()){const a=m.a.getUser(t);if(a&&a.pFlags&&a.pFlags.deleted)return void this.s(e,"",c.a.getPeerColorById(t),"tgico-deletedaccount")}const l=c.a.getPeerPhoto(t),g=!!l,h=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!h||!this.savedAvatarURLs[t]){let n,p="";if(!t||t===d&&a||(p=c.a.getPeerColorById(t)),t===r.d)return void this.s(e,"",p,"tgico-reply_filled");if(s)n=o.b.getAbbreviation(s);else{n=null!==(i=c.a.getPeer(t).initials)&&void 0!==i?i:""}this.s(e,n,p,"")}if(g){const a="photo_small";return this.putAvatar(e,t,l,a,void 0,n)}}};t.a=g},function(e,t,a){"use strict";a.d(t,"a",(function(){return s}));const s=()=>{let e={cleaned:!1};return{clean:()=>{e.cleaned=!0,e={cleaned:!1}},get:t=>{const a=e;return()=>!a.cleaned&&(!t||t())}}}},function(e,t,a){"use strict";var s;!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={})),t.a=s},,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=a(134);class n{constructor(e,t=0){this.options=e,this.minChars=t,this.fullTexts=new Map}indexObject(e,t){if(this.options&&t.trim()&&(t=Object(s.c)(t,this.options)),!t)return this.fullTexts.delete(e),!1;this.fullTexts.set(e,t)}search(e){const t=this.fullTexts;this.options&&(e=Object(s.c)(e,this.options));const a=[],n=e.split(" "),i=n.length;t.forEach((e,t)=>{let s=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(a.map(e=>e.what))}}},function(e,t,a){"use strict";a.d(t,"b",(function(){return r})),a.d(t,"a",(function(){return g}));var s=a(64);const n=new Map,i=new Set,r='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif';let o;const p=()=>{cancelAnimationFrame(o),o=window.requestAnimationFrame(d)},d=()=>{i.forEach(c),i.clear()};window.addEventListener("resize",()=>{for(const[e]of n)i.add(e);p()},{capture:!0,passive:!0});const c=e=>{let t=n.get(e);const a=!t;let{text:i,textLength:o,from:p,multiplier:d,font:c,textWidth:l,elementWidth:g}=t||{};a&&(i=e.textContent,o=i.length,p=50,d=p>0&&p/100,c=`${e.dataset.fontWeight||400} 16px ${r}`,l=m(i,c),g=e.getBoundingClientRect().width,t={text:i,textLength:o,from:p,multiplier:d,font:c,textWidth:l,elementWidth:g},n.set(e,t));const h=e.getBoundingClientRect().width,u=a||g!==h;if(!a&&u&&(t.elementWidth=g=h),u)if(l>g){e.setAttribute("title",i);let a=i,n=g;for(;a.length>3;){let t=a.length;const i=d&&Object(s.a)(d*t<<0,1,t-2)||Math.max(t+p-1,1),r=a.substr(0,i).replace(/\s*$/,""),o=a.substr(i+1).replace(/^\s*/,"");if(a=r+o,n=m(a+"…",c),n{this.drafts=e||{}}),s.default.addMultipleEventsListeners({updateDraftMessage:e=>{const t=n.a.getPeerId(e.peer);this.saveDraft(t,e.threadId,e.draft,{notify:!0})}})}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then(()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();i.a.getDialogOnly(t)||i.a.reloadConversation(t)}})}getAllDrafts(){return this.getAllDraftPromise||(this.getAllDraftPromise=d.a.invokeApi("messages.getAllDrafts").then(e=>{(r.a.updatesState.syncLoading||Promise.resolve()).then(()=>{r.a.processUpdateMessage(e)})}))}saveDraft(e,t,a,n={}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.a.set({drafts:this.drafts}),n.notify&&s.default.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n.force}),i}draftsAreEqual(e,t){if(typeof e!=typeof t)return!1;if(!Object(m.b)(e))return!0;if(e._!==t._)return!1;if("draftMessage"===e._&&t._===e._){if(e.reply_to_msg_id!==t.reply_to_msg_id)return!1;if(!Object(l.b)(e.entities,t.entities))return!1;if(e.message!==t.message)return!1;if(e.pFlags.no_webpage!==t.pFlags.no_webpage)return!1}return!0}isEmptyDraft(e){return!e||"draftMessageEmpty"===e._||!(e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(!e||"draftMessage"!==e._)return;const t=o.b.parseEntities(e.message),a=e.entities||[],s=o.b.mergeEntities(a.slice(),t);return e.rMessage=o.b.wrapDraftText(e.message,{entities:s}),e.reply_to_msg_id&&(e.reply_to_msg_id=u.a.generateMessageId(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,r=!1){return f(this,void 0,void 0,(function*(){const o=this.getDraft(e,t);if(this.draftsAreEqual(o,a))return!0;let l,m={peer:n.a.getInputPeerById(e),message:""};if(this.isEmptyDraft(a))l={_:"draftMessageEmpty"};else{Object(y.a)(a);let e=a.message,t=a.entities;a.reply_to_msg_id&&(m.reply_to_msg_id=u.a.getServerMessageId(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(m.entities=i.a.getInputEntities(t)),a.pFlags.no_webpage&&(m.no_webpage=a.pFlags.no_webpage),m.message=e}const g=l||a;return g.date=Object(c.h)(!0)+p.a.serverTimeOffset,this.saveDraft(e,t,g,{notify:!0,force:r}),!(s&&!t)||d.a.invokeApi("messages.saveDraft",m)}))}clearAllDrafts(){return d.a.invokeApi("messages.clearAllDrafts").then(e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");s.default.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}})}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft(e,t,a,{notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft(e,t,n,{notify:!0,force:!0})}};g.a.appDraftsManager=_,t.a=_},function(e,t,a){"use strict";var s=a(29);class n{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId;try{const a=this.createAudio();a.autoplay=!0,a.src="assets/audio/"+e,a.loop=t,a.play()}catch(t){console.error("playSound",e,t)}}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){var e;null===(e=this.audio)||void 0===e||e.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,a){const s=++this.tempId;setTimeout(()=>{this.tempId===s&&this.playSound(e,t)},a)}}var i=a(31),r=a(61),o=a(142),p=a(166),d=a(118),c=a(163),l=a(150),m=a(170),g=a(148),h=a(149),u=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};var y=a(138),f=a(37),_=a(33),v=a(47),P=a(15),b=a(75),I=a(51),S=a(43),C=a(41),M=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const w=new class{constructor(){this.makeSsrcsFromParticipant=e=>{var t,a;return[this.makeSsrcFromParticipant(e,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.video.audio_source),e.video&&this.makeSsrcFromParticipant(e,"video",e.video.source_groups,e.video.endpoint),(null===(a=e.presentation)||void 0===a?void 0:a.audio_source)&&this.makeSsrcFromParticipant(e,"audio",e.presentation.audio_source),e.presentation&&this.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)},this.log=Object(f.b)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,P.default.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),P.default.addEventListener("group_call_update",e=>{if("groupCallDiscarded"===e._){const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&t.hangUp(!1,!1,!0),this.participants.delete(e.id)}}),this.audioAsset=new n(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"])}get groupCall(){return this.currentGroupCall}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const{currentGroupCall:s}=this,n=this.getCachedParticipants(e),r=S.a.getPeerId(t.peer),o=n.get(r),p=t.pFlags.left;if(!o&&p)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0);const d=(null==s?void 0:s.id)===e;o?(Object(i.i)(o,t),t=o):n.set(r,t),d&&s.onParticipantUpdate(t,this.doNotDispatchParticipantUpdate);const c=this.getGroupCall(e);if("groupCall"===(null==c?void 0:c._)){let e=!1;p?(--c.participants_count,e=!0):!t.pFlags.just_joined||o||t.pFlags.self||(++c.participants_count,e=!0),e&&P.default.dispatchEvent("group_call_update",c)}p&&n.delete(r),o&&this.doNotDispatchParticipantUpdate!==r&&P.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach(t=>this.saveApiParticipant(e,t,a)))}editParticipant(e,t,a){return M(this,void 0,void 0,(function*(){if(!Object.keys(a).length)return;if(t){const{currentGroupCall:s}=this,n=(null==s?void 0:s.id)===e&&t.pFlags.self;if(n&&void 0!==a.muted&&!s.isSharingAudio&&(delete a.muted,!Object.keys(a).length))return;const i=a.muted;void 0!==i&&t.pFlags.self&&(i?t.pFlags.muted=!0:t.pFlags.can_self_unmute&&delete t.pFlags.muted),void 0!==a.raiseHand&&(a.raiseHand?t.raise_hand_rating="1":delete t.raise_hand_rating),n&&(void 0!==a.videoStopped&&(a.videoStopped?delete t.video:t.video=this.generateSelfVideo(s.connections.main.sources.video)),!t.pFlags.muted&&t.pFlags.can_self_unmute&&s.setMuted(!1),s.dispatchEvent("state",s.state)),P.default.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}const s=t.pFlags.self?v.c:S.a.getPeerId(t.peer),n=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:w.getGroupCallInput(e),participant:s===v.c?S.a.getInputPeerSelf():S.a.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});b.a.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return M(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return _.a.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{C.a.saveApiUsers(t.users),I.a.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&Object(i.i)(a,e),e=a):this.groupCalls.set(e.id,e),s&&P.default.dispatchEvent("group_call_update",e),e}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}setCurrentGroupCall(e){this.currentGroupCall=e,e&&P.default.dispatchEvent("group_call_instance",e)}createGroupCall(e,t,a){return M(this,void 0,void 0,(function*(){const s=yield _.a.invokeApi("phone.createGroupCall",{peer:S.a.getInputPeerById(e.toPeerId(!0)),random_id:Object(r.a)(32),schedule_date:t,title:a});b.a.processUpdateMessage(s);return s.updates.find(e=>"updateGroupCall"===e._).call}))}joinGroupCall(e,t,a=!0,s,n){return M(this,void 0,void 0,(function*(){let i;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${a} rejoin=${s}`),i=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return u(this,void 0,void 0,(function*(){const a={audio:Object(m.a)(),video:t&&Object(h.a)()},s=new l.a(c.b);try{const t=yield Object(g.a)(a,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,a),s.inputStream=new MediaStream}return s}))}(a,n),this.joinGroupCallInternal(e,t,i,a,s,n)}))}joinGroupCallInternal(e,t,a,s,n=!1,i){return M(this,void 0,void 0,(function*(){const r=this.log.bindPrefix("joinGroupCallInternal");r("start",t);let{currentGroupCall:o}=this;if(!o||!n){o=new p.a({chatId:e,id:t}),o.fixSafariAudio(),o.addEventListener("state",e=>{this.currentGroupCall===o&&e===d.a.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),P.default.dispatchEvent("chat_update",o.chatId))}),o.groupCall=yield this.getGroupCallFull(t);const c=o.createConnectionInstance({streamManager:a,type:"main",options:{type:"main",isMuted:s,joinVideo:i,rejoin:n}}),l=c.createPeerConnection();return l.addEventListener("negotiationneeded",()=>{c.negotiate()}),l.addEventListener("track",e=>{r("ontrack",e),o.onTrack(e)}),l.addEventListener("iceconnectionstatechange",()=>{o.dispatchEvent("state",o.state);const{iceConnectionState:e}=l;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":break;case"closed":o.hangUp();break;case"completed":break;case"connected":o.joined||(o.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.getGroupCallParticipants(t).then(({participants:e})=>{this.saveApiParticipants(t,[...e.values()])}));break;case"disconnected":break;case"failed":o.hangUp()}}),c.createDescription(),c.createDataChannel(),c.appendStreamToConference(),this.setCurrentGroupCall(o),r("set currentGroupCall",t,o),this.startConnectingSound(),c.negotiate()}o.handleUpdateGroupCallParticipants=!1,o.updatingSdp=!1,r("update currentGroupCall",t,o)}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}generateSelfVideo(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}generateSelfParticipant(){var e,t;const a=this.currentGroupCall.connections.main.sources,s=null===(e=this.currentGroupCall.connections.presentation)||void 0===e?void 0:e.sources;return{_:"groupCallParticipant",pFlags:{can_self_unmute:!0,self:!0},source:a.audio.source,video:this.generateSelfVideo(a.video),presentation:s&&this.generateSelfVideo(s.video,null===(t=s.audio)||void 0===t?void 0:t.source),date:Object(o.a)(!0),peer:S.a.getOutputPeer(P.default.myId)}}makeSsrcFromParticipant(e,t,a,s){return Object(y.c)(t,a,s)}getGroupCallParticipants(e){return M(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield _.a.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;I.a.saveApiChats(t.chats),C.a.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t=!1,a=!1){return M(this,void 0,void 0,(function*(){this.log(`hangUp start id=${e} discard=${t} rejoin=${a}`);const{currentGroupCall:s}=this;(null==s?void 0:s.id)===e&&s.hangUp(t,a)}))}toggleMuted(e){return this.changeUserMuted(v.c,e)}changeUserMuted(e,t){const{currentGroupCall:a}=this;if(!a)return;const s=a.getParticipantByPeerId(e);return v.c===e&&s.pFlags.can_self_unmute&&(t=void 0===t?!s.pFlags.muted:t),this.editParticipant(a.id,s,{muted:t})}};s.a&&(s.a.appGroupCallsManager=w);t.a=w},,,,,,,,function(e,t,a){"use strict";a.d(t,"a",(function(){return r})),a.d(t,"b",(function(){return p})),a.d(t,"c",(function(){return d}));var s=a(143);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g;function r(e){return e.replace(n,"").replace(i,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=s.a.LatinizeMap[e];return void 0!==t?t:e})}function p(e,t=!0){const a="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),a&&(e="%"+e),e}function d(e,t={}){const a=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),e}},function(e,t,a){"use strict";a.d(t,"a",(function(){return s})),a.d(t,"b",(function(){return i}));var s,n=a(29);!function(e){e[e.None=0]="None",e[e.Top=1]="Top",e[e.Bottom=2]="Bottom",e[e.Both=3]="Both"}(s||(s={}));class i{constructor(){this.sliceConstructor=i.getSliceConstructor(this);const e=this.constructSlice();this.slices=[e]}static getSliceConstructor(e){return class extends Array{constructor(){super(...arguments),this.end=s.None}isEnd(t){if((this.end&t)===t)return!0;let a=!1;if(t===s.Top){const s=e.last;a=!!(s.end&t)&&this.includes(s[s.length-1])}else if(t===s.Bottom){const s=e.first;a=!!(s.end&t)&&this.includes(s[0])}else if(t===s.Both)return this.isEnd(s.Top)&&this.isEnd(s.Bottom);return a&&this.setEnd(t),a}setEnd(e){this.end|=e}unsetEnd(e){this.end^=e}splice(t,a,...n){const i=super.splice(t,a,...n);if(!this.length){const t=e.slices,a=t.indexOf(this);-1!==a&&(1===t.length?this.unsetEnd(s.Both):t.splice(a,1))}return i}}}constructSlice(...e){const t=new this.sliceConstructor(e.length);for(let a=0,s=e.length;aa[0])break}this.slices.splice(t,0,this.constructSlice(...e)),p=t}return t?this.flatten(p):void 0}flatten(e){if(this.slices.length>=2)for(let t=0,a=this.slices.length;t=t[s])return{slice:t,offset:e===t[s]?s:s-1}}if(t&&t.isEnd(s.Top))return{slice:t,offset:t.length}}sliceMe(e,t,a){let n=this.slice,i=0,r=0;if(e){const t=this.findSliceOffset(e);if(!t)return;n=t.slice,i=r=t.offset,n.includes(e)&&(r+=1)}let o=Math.max(r+t,0),p=r+t+a;const d=n.slice(o,p),c=t<0?a+t:a,l=Math.abs(t),m=n.length-r>=c||!!n.isEnd(s.Top)&&(d.setEnd(s.Top),!0),g=r-l>=0||!!n.isEnd(s.Bottom)&&(d.setEnd(s.Bottom),!0);return{slice:d,offsetIdOffset:i,fulfilled:s.None|(m&&g?s.Both:(m?s.Top:s.None)|(g?s.Bottom:s.None))}}unshift(...e){let t=this.first;t.length?t.isEnd(s.Bottom)||(t=this.constructSlice(),t.setEnd(s.Bottom),this.slices.unshift(t)):t.setEnd(s.Bottom),t.unshift(...e)}push(...e){let t=this.last;t.length?t.isEnd(s.Top)||(t=this.constructSlice(),t.setEnd(s.Top),this.slices.push(t)):t.setEnd(s.Top),t.push(...e)}delete(e){const t=this.findSlice(e);return!!t&&(t.slice.splice(t.index,1),!0)}}n.a&&(n.a.SlicedArray=i)},function(e,t,a){"use strict";var s=a(29),n=a(31),i=a(37),r=a(33),o=a(32),p=a(15),d=a(75),c=a(104),l=a(42),m=a(43),g=a(41);const h=new class{constructor(){this.polls={},this.results={},this.pollToMessages={},this.log=Object(i.b)("POLLS",i.a.Error),p.default.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,p.default.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)})),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=o.a.parseMarkdown(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map(e=>a.answers[e].option),n=e.mid,i=e.peerId,o=m.a.getInputPeerById(i);return e.pFlags.is_outgoing?l.a.invokeAfterMessageIsSent(n,"sendVote",e=>(this.log("invoke sendVote callback"),this.sendVote(e,t))):r.a.invokeApi("messages.sendVote",{peer:o,msg_id:c.a.getServerMessageId(e.mid),options:s}).then(e=>{this.log("sendVote updates:",e),d.a.processUpdateMessage(e)})}getResults(e){const t=m.a.getInputPeerById(e.peerId);return r.a.invokeApi("messages.getPollResults",{peer:t,msg_id:c.a.getServerMessageId(e.mid)}).then(e=>{d.a.processUpdateMessage(e),this.log("getResults updates:",e)})}getVotes(e,t,a,s=20){return r.a.invokeApi("messages.getPollVotes",{peer:m.a.getInputPeerById(e.peerId),id:c.a.getServerMessageId(e.mid),option:t,offset:a,limit:s}).then(e=>(this.log("getPollVotes messages:",e),g.a.saveApiUsers(e.users),e))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=Object(n.a)(t);return a.pFlags.closed=!0,l.a.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then(()=>{},e=>{this.log.error("stopPoll error:",e)})}};s.a.appPollsManager=h,t.a=h},function(e,t,a){"use strict";function s(e){return e<<0}function n(e){return e>>>0}function i(e,t=3){if(!e)return 0;const{length:a}=e;let s=0;for(let t=0;t"sendrecv"===a.direction&&a.type===e&&!(t?a.sendEntry:a.recvEntry));return a||(a=this.createEntry(e),a.setDirection("sendrecv")),a}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return i.a.fromConference(Object.assign({conference:this},e))}}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return u}));var s=a(45),n=a(77),i=a(44),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const o=[];let p=!1;function d(e,t="push"){return e.items.length?(e.promise=Object(s.a)(),o[t](e),function e(){if(!p){(function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),a=[];return new Promise((s,o)=>{const p=()=>r(this,void 0,void 0,(function*(){const r=performance.now();do{yield Object(n.c)();const s=e.process.apply(e.context,t.shift());let i;if(s instanceof Promise)try{i=yield s}catch(e){return void o(e)}else i=s;a.push(i)}while(t.length>0&&performance.now()-r<6);t.length>0?Object(i.b)(p):s(a)}));Object(i.b)(p)}).then(e.promise.resolve,e.promise.reject)})(o.shift()).finally(()=>{p=!1,o.length&&e()})}}(),e.promise):Promise.resolve([])}const c="filter"in(document.createElement("canvas").getContext("2d")||{});let l,m;function g(e,t,a){return new Promise(s=>{const n=document.createElement("canvas");n.width=e.width,n.height=e.height;const i=n.getContext("2d",{alpha:!1});c?(i.filter=`blur(${t}px)`,i.drawImage(e,2*-t,2*-t,n.width+4*t,n.height+4*t)):(i.drawImage(e,0,0),m(i,0,0,n.width,n.height,t,a)),s(n.toDataURL())})}l=c?Promise.resolve():a.e(31).then(a.bind(null,176)).then(e=>{m=e.default});const h=new Map;function u(e,t=2,a=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(h.size>1e3&&h.clear(),h.has(e))return h.get(e);const s=new Promise(s=>{l.then(()=>{const n=new Image;n.onload=()=>{c?g(n,t,a).then(s):d({items:[[n,t,a]],context:null,process:g},"unshift").then(e=>{s(e[0])})},n.src=e})});return h.set(e,s),s}},,,,,function(e,t,a){"use strict";var s=a(42),n=a(67),i=a(56),r=a(31),o=a(29),p=a(33),d=a(91),c=a(37);const l=new class{constructor(){this.contexts=new Map,this.links={},this.log=Object(c.b)("RD",void 0,!0),p.a.addTaskListener("refreshReference",e=>{const t=e.payload;Object(d.a)(e),e.originalPayload=t,this.refreshReference(t).then(t=>{e.payload=t},t=>{e.error=t}).then(()=>p.a.postMessage(e))})}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[Object(i.f)(e)]=e;for(const e of a)if(Object(r.b)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[Object(i.f)(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if(Object(r.b)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[Object(i.f)(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=s.a.wrapSingleMessage(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||n.a.getAnimatedEmojiSounds(!0).then(()=>{this.refreshEmojiesSoundsPromise=void 0});break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const r=Object(i.f)(e);return this.log("refreshReference: refreshing reference:",r),a.then(()=>{const a=Object(i.f)(e);if(this.log("refreshReference: refreshed, reference before:",r,"after:",a),r!==a)return e;this.deleteContext(e,t);const s=this.getContext(e);if(s)return this.refreshReference(e,s[0]);throw this.log.error("refreshReference: no new context, reference before:",r,"after:",a,t),"NO_NEW_CONTEXT"})}};o.a.referenceDatabase=l,t.a=l},function(e,t,a){"use strict";function s(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";var s;a.d(t,"a",(function(){return s})),function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(s||(s={}))},function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const a=yield navigator.mediaDevices.getUserMedia(e);return a.getTracks().forEach(e=>{e.enabled=!t}),a}))}window.getStream=n},function(e,t,a){"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"a",(function(){return d}));var s=a(37),n=a(15),i=a(163),r=a(164),o=a(137);class p{constructor(e,t){const a=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain();s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,a.connect(s)}}class d{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:a,track:s,source:n,type:i}=e,r=t.analyser;if(!r)return;const p=new Uint8Array(r.frequencyBinCount);r.getByteFrequencyData(p);return{type:i,source:n,stream:a,track:s,value:Object(o.b)(p)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter(e=>"input"===e.type)).filter(e=>"audio"===e.kind).slice(0,i.a).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),n.default.dispatchEvent("group_call_amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=Object(s.b)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0}addStream(e,t){e.getTracks().forEach(a=>{this.addTrack(e,a,t)})}addTrack(e,t,a){this.log("addTrack",a,t,e);const{context:s,items:n,inputStream:i,outputStream:r}=this,o=t.kind,c=d.getSource(e,a);switch(a){case"input":i?i.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)},{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find(t=>"input"===t.type&&t.kind===e)}static getSource(e,t){return"input"===t?e.source||e.id:""+Object(o.c)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let a=!1;for(let s=0,n=t.length;!a&&se.direction===a&&e.type===t);if(!i){if(!s)continue;i=e.createEntry(t)}let{transceiver:o}=i;o||(o=i.createTransceiver(e.connection,n)),i.direction!==o.direction&&(o.direction=i.direction);const p=r.find(e=>e.kind===t),d=o.sender;d.track!==p&&d.replaceTrack(p).catch(e=>{this.log.error(e)})}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach(e=>{Object(r.a)(e)})}catch(e){this.log.error(e)}}}},,,,,,,,function(e,t,a){"use strict";const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate);t.a=s},function(e,t,a){"use strict";var s=a(29),n=a(0),i=a(37),r=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const o=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=Object(i.b)("OPUS",i.a.Error)}isPlaySupported(){if(void 0!==this.isPlaySupportedResult)return this.isPlaySupportedResult;const e=document.createElement("audio");return this.isPlaySupportedResult=!(!e.canPlayType||!e.canPlayType("audio/ogg;").replace(/no/,""))}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}}))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},n.IS_SAFARI?void 0:t.map(e=>e.buffer))}))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},n.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout(()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())},1e4)}pushDecodeTask(e,t){return new Promise((a,s)=>{const n={pages:e,withWaveform:t,callback:{resolve:a,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(n)&&this.executeNewTask(n)})}decode(e,t=!1){return r(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then(e=>{const t=new Blob([e.bytes],{type:"audio/wav"});return{url:URL.createObjectURL(t),waveform:e.waveform}})}))}};s.a.opusDecodeController=o,t.a=o},function(e,t,a){"use strict";var s=a(55),n=a(76),i=a(32),r=a(15),o=a(31),p=a(88),d=a(29);const c=new Set(["photo","video","gif","document"]);const l=new class{constructor(){this.webpages={},this.pendingWebPages={},r.default.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var d,l;if("webPageNotModified"===e._)return;const{id:m}=e,g=this.webpages[m],h=g&&g._===e._&&g.hash==g.hash;if("webPage"===e._){"photo"===(null===(d=e.photo)||void 0===d?void 0:d._)?e.photo=s.a.savePhoto(e.photo,a):delete e.photo,"document"===(null===(l=e.document)||void 0===l?void 0:l._)?e.document=n.a.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name;let r=e.title||e.author||t||"";t&&r===t&&delete e.site_name,r=Object(p.f)(r,80,100),e.rTitle=i.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let o="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(o=t[0]+"/issues/{1}")}const m=Object(p.f)(e.description||"",150,180);e.rDescription=i.a.wrapRichText(m,{contextSite:t||"external",contextHashtag:o}),c.has(e.type)||e.description||!e.photo||(e.type="photo")}let u=this.pendingWebPages[m];if(t&&(u||(u=this.pendingWebPages[m]=new Set),u.add(t)),void 0===g?this.webpages[m]=e:Object(o.i)(g,e),!t&&void 0!==u&&h){const e=[];u.forEach(t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})}),r.default.dispatchEvent("webpage_updated",{id:m,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getWebPage(e){return this.webpages[e]}};d.a&&(d.a.appWebPagesManager=l),t.a=l},function(e,t,a){"use strict";var s=a(129);const n=new Set(["image/jpeg","image/png","image/bmp"]);s.a&&n.add("image/webp"),t.a=n},,function(e,t,a){"use strict";a.d(t,"a",(function(){return s})),a.d(t,"b",(function(){return n}));const s=50,n=100},function(e,t,a){"use strict";a.d(t,"a",(function(){return n}));var s=a(57);function n(e){e.stop(),Object(s.a)(e,"ended")}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return aa}));var s=a(0),n=a(39),i=a(31),r=a(97),o=a(75),p=a(126),d=a(43),c=a(37),l=a(62),m=a(95),g=a(56),h=a(29),u=a(114),y={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:739712882,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:142306870,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactons",type:"flags.1?Vector"}],type:"MessageReactions"},{id:-1826077446,predicate:"messageUserReaction",params:[{name:"user_id",type:"long"},{name:"reaction",type:"string"}],type:"MessageUserReaction"},{id:-1553558980,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"}]},layer:137},f=a(162),_=a(174),v=a.n(_),P=a(61),b=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const I="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function S(e){return I.digest("SHA-1",Object(g.i)(e)).then(e=>new Uint8Array(e))}function C(e){return I.digest("SHA-256",Object(g.i)(e)).then(e=>new Uint8Array(e))}function M(e,t,a){e=Object(m.a)(e);const s=new f.a(Object(g.g)(t),Object(g.g)(a)).encrypt(Object(g.g)(e));return Object(g.d)(s)}function w(e,t,a){const s=new f.a(Object(g.g)(t),Object(g.g)(a)).decrypt(Object(g.g)(e));return Object(g.d)(s)}function k(e,t){const a=Object(u.x)(t.modulus,16),s=Object(u.x)(t.exponent,16),n=Object(u.x)(Object(g.f)(e),16),i=Object(u.v)(n,s,a);return Object(g.c)(Object(u.d)(i,16))}function A(e,t,a){return b(this,void 0,void 0,(function*(){const s=yield I.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return I.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},s,512).then(e=>new Uint8Array(e))}))}function E(e){let t;try{t=function(e){var t,a,s,n,i,r,o=Math.ceil(64/u.f)+1,p=0,d=new Array(o),c=new Array(o),l=new Array(o),m=new Array(o),g=new Array(o),h=new Array(o),y=new Array(o);for(t=0;t<3;++t){for(a=17+(15&Object(P.a)(8)),Object(u.i)(h,Object(u.q)(Object(u.n)(Object(P.a)(32),32,0),e)),Object(u.i)(y,h),n=1<"boolFalse"===e.predicate).id,x=+y.API.constructors.find(e=>"boolTrue"===e.predicate).id,O=+y.API.constructors.find(e=>"vector"===e.predicate).id,F=+y.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class R{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(x,(t||"")+":bool"):this.writeInt(U,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);let a;"string"!=typeof e&&(e=e?e.toString():"0"),"-"===e[0]?(a=Object(u.n)(0,64,8),Object(u.z)(a,Object(u.x)(e.slice(1),10,64))):a=Object(u.x)(e,10,64);const s=Object(u.d)(a,16).slice(-16),n=Object(m.a)(Object(g.c)(s).reverse(),8,!0,!0,!1);this.storeRawBytes(n)}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",Object(g.f)(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",Object(g.f)(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",Object(g.f)(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?y.MTProto:y.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(let e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(O,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(let t in p)this.intView[p[t]]=e[t];return r.type}}class B{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=this.readInt((e||"")+":long[high]"),s=Object(m.c)(a,t);if(!this.mtproto){const e=+s;if(Number.isSafeInteger(e))return e}return s}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===x||t!==U&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t),!s)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===F){const a=D(this.fetchBytes(t+"[packed_string]"));return new B(a).fetchObject(e,t)}if(i===O)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e{const t=new Uint8Array(e.length);for(let a=0;a{const a=Object(u.y)(t,e);return!(Object(u.s)(a)||Object(u.e)(a)<1984||Object(u.e)(e)<1984||Math.floor((Object(u.e)(e)+7)/8)>256)},{a:I,a_for_hash:S,u:C}=yield(()=>j(this,void 0,void 0,(function*(){for(;;){const e=Object(u.x)(Object(g.f)(c(t.secure_random)),16),a=Object(u.v)(i,e,n);if(b(a,n)){const t=Object(g.c)(Object(u.d)(a,16)),s=yield q.invokeCrypto("sha256-hash",Object(g.a)(t,f)),n=Object(u.x)(s.hex,16);if(!Object(u.o)(n)&&!Object(u.s)(n))return{a:e,a_for_hash:t,u:n}}}})))();let M;M=Object(u.m)(l,P)?l:Object(u.a)(l,n),M=Object(u.q)(Object(u.y)(M,P),n);const w=Object(u.r)(C,o),k=Object(u.a)(I,w),A=Object(u.v)(M,k,n),E=yield q.invokeCrypto("sha256-hash",p(Object(g.c)(Object(u.d)(A,16)),256));let T=yield q.invokeCrypto("sha256-hash",h);const D=yield q.invokeCrypto("sha256-hash",y);T=Object(g.h)(T,D);const U=Object(g.a)(T,yield q.invokeCrypto("sha256-hash",s.salt1),yield q.invokeCrypto("sha256-hash",s.salt2),S,f,E),x=yield q.invokeCrypto("sha256-hash",U);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(S),M1:x}}))}class N extends V.a{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":S,"sha256-hash":C,pbkdf2:A,"aes-encrypt":M,"aes-decrypt":w,"rsa-encrypt":k,factorize:E,"mod-pow":T,gzipUncompress:D,computeSRP:L}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}}var q=new N,G=a(119);const H=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,l.a.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|Object(P.a)(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Object(m.c)(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;l.a.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;const n={type:"applyServerTimeOffset",payload:a};return Object(G.e)(n),s}};h.a.timeManager=H;var z=H,W=a(7),K=a(63),$=a(70),J=a(81),Q=a(45),X=a(48),Y=a(153);class Z{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class ee{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new Z(t),this._aes=new f.b(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0,ge.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(se.a.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(se.a.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=c.a.Error|c.a.Log;this.debug&&(i|=c.a.Debug),this.log=Object(c.b)("TCP-"+t+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&ge.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",s.length),i||(i=a.encoded=this.encodeBody(s)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ie=0;class re extends X.a{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ie,oe.set(this.id,this);const s={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};Object(G.d)(s)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};Object(G.d)(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};Object(G.d)(e)}}const oe=new Map,pe=K.a.test?"_test":"";class de{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=K.a.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+pe,i=`wss://${W.a.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`,r="upload"===t?"-U":"download"===t?"-D":"",o=s.IS_SAFARI&&G.b&&void 0!==re?re:Y.a;return new ne(o,e,i,r,1e4)},this.transportHTTP=(e,t,a)=>{let s;if(K.a.ssl||!K.a.http){s="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(K.a.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new ue(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=K.a.transport,s=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const n=this.chosenServers[a][t];e in n||(n[e]=[]);const i=n[e];if(!i.length||!s){let n;const r="client"===t?"":"-1";return n=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),n?(s&&i.push(n),n):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const i in e[a][s]){const r=e[a][s][i];Object(n.e)(r,t)}}}var ce=new de,le=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class me extends X.a{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return le(this,void 0,void 0,(function*(){const e=this.transports={https:ce.chooseServer(W.a.baseDcId,"client","https",!1),websocket:ce.chooseServer(W.a.baseDcId,"client","websocket",!1)},t=Object(Q.a)();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=Object(Q.a)(),s=e.websocket;s.setAutoReconnect(!1),s.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),s.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>a.resolve(!1),2e3);const[n,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:n||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return le(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield Object(J.a)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}var ge=new me,he=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class ue{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=K.a.debug&&!1;let s=c.a.Error|c.a.Log;this.debug&&(s|=c.a.Debug),this.log=Object(c.b)("HTTP-"+e+a,s),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,ge.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return he(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new R({mtproto:!0}),a=Object(P.b)();t.storeMethod("ping",{ping_id:a});const s={msg_id:z.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(se.a.Connecting),this.sendEncryptedRequest(s).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=ye.a.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=Object(g.i)(this.authKey),this.serverSalt=Object(g.i)(s),this.isFileUpload=!!n.fileUpload,this.isFileDownload=!!n.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=Object(c.b)(this.name,c.a.Log|c.a.Debug|c.a.Error|c.a.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&Object(n.d)(t.inner,(e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)}),t.msg_id=z.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new R({mtproto:!0});s.storeMethod(e,t);const n=z.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return K.a.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new R({mtproto:!0});a.storeObject(e,"Object");const s=z.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return K.a.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new R(a);if(!this.connectionInited){const e=y.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(y.layer,"layer");const t=y.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(W.a.id,"api_id"),s.storeString(be.userAgent||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(W.a.version+(W.a.isMainDomain?" "+W.a.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(W.a.langPack,"lang_pack"),s.storeString(be.language,"lang_code")}if(a.afterMessageId){if(void 0===_e){const e=y.API.methods.find(e=>"invokeAfterMsg"===e.method);_e=e?+e.id:0}_e?(s.storeInt(_e,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:z.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return K.a.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),de.removeTransport(ce.chosenServers,this.transport),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof ue&&(this.longPollInterval=ye.a.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(se.a.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(se.a.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=ye.a.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(se.a.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?se.a.Closed:se.a.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{a.forEach(t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}})})}pushMessage(e,t){const a=new Promise((a,s)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:s}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),Object(m.b)(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(se.a.TimedOut))},5e3);a.catch($.a).finally(()=>{clearTimeout(t),this.setConnectionStatus(se.a.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=ye.a.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===se.a.Connected,s=this.status!==e;this.isOnline=a,this.status=e,s&&(be.onConnectionStatusChange&&be.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return fe(this,void 0,void 0,(function*(){const a=t?0:8,s=Object(g.a)(this.authKeyUint8.subarray(88+a,88+a+32),e),n=yield q.invokeCrypto("sha256-hash",s);return new Uint8Array(n).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,s=new Uint8Array(52),n=new Uint8Array(52),i=[];return s.set(e,0),s.set(this.authKeyUint8.subarray(a,a+36),16),i.push(q.invokeCrypto("sha256-hash",s)),n.set(this.authKeyUint8.subarray(40+a,40+a+36),0),n.set(e,36),i.push(q.invokeCrypto("sha256-hash",n)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]})}isStopped(){return be.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,s=!1,n=!1,i=!1;const r=Object(m.d)(Object.keys(this.pendingMessages));for(const o of r){const r=this.sentMessages[o];if(r&&r.body){const o=r.body.length+32;if(a+o>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=o,r.isAPI?s=!0:r.longPoll&&(n=!0),e=r}delete this.pendingMessages[o]}if(this.transport instanceof ue&&s&&!n){const e=new R({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:z.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const o=t.filter(e=>e.noResponse).map(e=>e.msg_id);if(t.length>1){const s=this.generateContainerMessage(a,t);e=s.messageWithBody,this.sentMessages[e.msg_id]=s.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const p=this.sendEncryptedRequest(e);this.transport instanceof ue&&this.handleSentEncryptedRequestHTTP(p,e,o),this.transport instanceof ue||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new R({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const n={msg_id:z.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return K.a.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return fe(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield q.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>q.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new R({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+Object(P.a)(8)%5),n=new Uint8Array(s).randomize(),i=Object(g.a)(a,n);return this.getEncryptedMessage(i).then(e=>{const t=new R({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof ue))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw s;return e},e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})})}parseResponse(e){this.lastResponseTime=Date.now();const t=new B(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!Object(g.b)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then(e=>this.getMsgKey(e,!1).then(t=>{if(!Object(g.b)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new B(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!(Object(g.b)(n,this.sessionId)||this.prevSessionId&&Object(g.b)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+Object(g.f)(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const c=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const l=o-d;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new B(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))}applyServerSalt(e){const t=function(e){const t=new Uint8Array(Object(u.c)(Object(u.x)(e,10),!1));return Object(m.a)(t,8,!0,!1,!1)}(e);l.a.set({["dc"+this.dcId+"_server_salt"]:Object(g.f)(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof ue&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof ue&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof ue&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=Object(u.x)(t,10);Object(u.w)(a,32);const s=z.applyServerTime(+Object(u.d)(a,10));(17===e.error_code||s)&&(this.log("Update session"),this.updateSession());const n=this.updateSentMessage(e.bad_msg_id);n&&this.pushResend(n.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),l.a.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&be.updatesProcessor&&be.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==be.updatesProcessor&&be.updatesProcessor(e)}}}const Pe=new class{constructor(){this.networkers=[],this.language=navigator.language||W.a.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){Object(n.e)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ve(e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};h.a&&(h.a.networkerFactory=Pe);var be=Pe,Ie=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};var Se=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,K.a.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new R;t.storeBytes(Object(g.c)(e.modulus),"n"),t.storeBytes(Object(g.c)(e.exponent),"e");const a=t.getBuffer();return q.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[Object(g.f)(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return Ie(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(h.b&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new B(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(o,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e})}sendReqPQ(e){return Ce(this,void 0,void 0,(function*(){const t=new R({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),h.b&&this.log("Send req_pq",e.nonce.hex);try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Se.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!Object(g.b)(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,h.b&&this.log("Got ResPQ",Object(g.f)(e.serverNonce),Object(g.f)(e.pq),e.fingerprints);const n=yield Se.select(e.fingerprints);if(!n)throw new Error("[MT] No public key found");e.publicKey=n,h.b&&this.log("PQ factorization start",e.pq);try{var i=yield q.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=i[0],e.q=i[1],h.b&&this.log("PQ factorization done",i),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ce(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new R({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const n=Object(m.a)(s,192,!1,!0,!1),i=n.slice().reverse(),r=yield(()=>Ce(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=i.concat(yield q.invokeCrypto("sha256-hash",t.concat(n)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield q.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),r=Object(g.h)(t,yield q.invokeCrypto("sha256-hash",s)).concat(s),o=Object(u.x)(Object(g.f)(r),16),p=Object(u.x)(e.publicKey.modulus,16);if(-1===Object(u.g)(o,p))return r}})))(),o=Object(m.a)(yield q.invokeCrypto("rsa-encrypt",r,e.publicKey),256,!0,!0,!0),p={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:o},d=new R({mtproto:!0});d.storeMethod("req_DH_params",p);const c=d.getBytes(!0);let l;h.b&&this.log("Send req_DH_params",p);try{l=yield this.sendPlainRequest(e.dcId,c)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const y=l.fetchObject("Server_DH_Params","RESPONSE");if(h.b&&this.log("Sent req_DH_params, response:",y),"server_DH_params_fail"!==y._&&"server_DH_params_ok"!==y._)throw new Error("[MT] Server_DH_Params response invalid: "+y._);if(!Object(g.b)(e.nonce,y.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!Object(g.b)(e.serverNonce,y.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===y._){const t=(yield q.invokeCrypto("sha1-hash",e.newNonce)).slice(-16);if(!Object(g.b)(t,y.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,y.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ce(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield q.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield q.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield q.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield q.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),s=a.slice(0,20),n=a.slice(20),i=new B(n,{mtproto:!0}),r=i.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==r._)throw new Error("[MT] server_DH_inner_data response invalid: "+r);if(!Object(g.b)(e.nonce,r.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!Object(g.b)(e.serverNonce,r.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");h.b&&this.log("Done decrypting answer"),e.g=r.g,e.dhPrime=r.dh_prime,e.gA=r.g_a,e.serverTime=r.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=i.getOffset();if(!Object(g.b)(s,yield q.invokeCrypto("sha1-hash",n.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");z.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){h.b&&this.log("Verifying DH params",e,t,a);const s=Object(g.f)(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");h.b&&this.log("dhPrime cmp OK");const n=Object(u.x)(Object(g.f)(a),16),i=Object(u.x)(s,16);if(Object(u.g)(n,u.t)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(Object(u.g)(n,Object(u.y)(i,u.t))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");h.b&&this.log("1 < gA < dhPrime-1 OK");const r=Object(u.n)(2,32,0),o=Object(u.u)(r,1984);if(Object(u.g)(n,o)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(Object(u.g)(n,Object(u.y)(i,o))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return h.b&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ce(this,void 0,void 0,(function*(){const t=Object(g.c)(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield q.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const s=new R({mtproto:!0});s.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const n=(yield q.invokeCrypto("sha1-hash",s.getBuffer())).concat(s.getBytes(!0)),i=yield q.invokeCrypto("aes-encrypt",n,e.tmpAesKey,e.tmpAesIv),r=new R({mtproto:!0});let o;r.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:i}),h.b&&this.log("Send set_client_DH_params");try{o=yield this.sendPlainRequest(e.dcId,r.getBytes(!0))}catch(e){throw e}const p=o.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==p._&&"dh_gen_retry"!==p._&&"dh_gen_fail"!==p._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+p._);if(!Object(g.b)(e.nonce,p.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!Object(g.b)(e.serverNonce,p.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var d=yield q.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw d}const c=yield q.invokeCrypto("sha1-hash",d),l=c.slice(0,8),m=c.slice(-8);switch(h.b&&this.log("Got Set_client_DH_params_answer",p._,d),p._){case"dh_gen_ok":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([1],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,p),new Error("new_nonce_hash1 mismatch");const a=Object(g.h)(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return h.b&&this.log("Auth successfull!",m,d,a),e.authKeyId=m,e.authKey=d,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([2],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield q.invokeCrypto("sha1-hash",e.newNonce.concat([3],l))).slice(-16);if(!Object(g.b)(t,p.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=ge.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>Ce(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)}))),this.cached[e]=t)}},we=a(151),ke=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ae=new class{constructor(){this.log=Object(c.b)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=K.a.transport,ge.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n){n[a].forEach((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return ce.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);e.networker.changeTransport(a)})}getBaseDcId(){return ke(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield l.a.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(W.a.baseDcId)),this.baseDcId}))}setUserAuth(e){return ke(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}l.a.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,l.a.set({dc:this.baseDcId})}logOut(){return ke(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>l.a.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,we.a.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(s,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",s=this.getTransportType(a);this.cachedNetworkers[s]||(this.cachedNetworkers[s]={client:{},download:{},upload:{}});const n=this.cachedNetworkers[s][a];e in n||(n[e]=[]);const i=n[e],r="client"===a||"https"===s?1:3;if(i.length>=r){let e=i.length-1,t=!1;for(;e>=0;--e)if(i[e].isOnline){t=!0;break}const a=t?i.splice(e,1)[0]:i.pop();return i.unshift(a),Promise.resolve(a)}let o=this.generateNetworkerGetKey(e,s,a);if(this.gettingNetworkers[o])return this.gettingNetworkers[o];const p=`dc${e}_auth_key`,d=`dc${e}_server_salt`;let c=this.chooseServer(e,a,s);return this.gettingNetworkers[o]=Promise.all([p,d].map(e=>l.a.get(e))).then(([n,r])=>ke(this,void 0,void 0,(function*(){let m,h;if(n&&512===n.length){r&&16===r.length||(r="AAAAAAAAAAAAAAAA");const a=Object(g.c)(n),s=(yield q.invokeCrypto("sha1-hash",a)).slice(-8),i=Object(g.c)(r);m=be.getNetworker(e,a,s,i,t)}else try{const a=yield Me.auth(e);l.a.set({[p]:Object(g.f)(a.authKey),[d]:Object(g.f)(a.serverSalt)}),m=be.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){h=e}const u=this.getTransportType(a);if(u!==s&&(o=this.generateNetworkerGetKey(e,u,a),c.destroy(),de.removeTransport(ce.chosenServers,c),m&&(c=this.chooseServer(e,a,u)),this.log("transport has been changed during authorization from",s,"to",u)),delete this.gettingNetworkers[o],h)throw this.log("get networker error",h,h.stack),h;return m.changeTransport(c),i.unshift(m),this.setOnDrainIfNeeded(m),m})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),be.removeNetworker(e),de.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const s=Object(Q.a)();let{afterMessageId:n,prepareTempMessageId:i}=a;if(i&&s.then(()=>{delete this.afterMessageTempIds[i]}),h.a){const n=Date.now(),i=ye.a.setInterval(()=>{p&&p.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)},5e3);s.catch($.a).finally(()=>{clearInterval(i)})}const r=t=>{t?Object(m.b)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},s.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=d||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let o,p,d=(new Error).stack||"empty stack";const c=d=>{if(n){const e=this.afterMessageTempIds[n];e&&(a.afterMessageId=e.messageId)}const m=(p=d).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:s}),m.then(s.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,o,e,t),401===i.code&&this.baseDcId===o)"SESSION_PASSWORD_NEEDED"!==i.type&&(l.a.delete("dc"),l.a.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&o!==this.baseDcId){if(void 0===this.cachedExportPromise[o]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:o},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:o,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[o]=e}this.cachedExportPromise[o].then(()=>{this.invokeApi(e,t,a).then(s.resolve,r)},r)}else if(303===i.code){const n=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];n!==o&&(a.dcId?a.dcId=n:this.setBaseDcId(n),this.getNetworker(n,a).then(n=>{n.wrapApiCall(e,t,a).then(s.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const n=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];n!==o?this.getNetworker(n,a).then(n=>{n.wrapApiCall(e,t,a).then(s.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[n];n=void 0,delete a.afterMessageId,e?e.promise.then(()=>c(p)):c(p)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{c(p)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{c(p)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{c(p)},1e3*e)}})};return(o=a.dcId||this.baseDcId)?this.getNetworker(o,a).then(c,r):this.getBaseDcId().then(e=>{this.getNetworker(o=e,a).then(c,r)}),s}};h.a.apiManager=Ae;var Ee=Ae,Te=a(47),De=a(15),Ue=a(170),xe=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function Oe(e){return xe(this,void 0,void 0,(function*(){return yield navigator.mediaDevices.getDisplayMedia(e)}))}var Fe=a(148),Re=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};function Be(){const e={main:{},screen:{}};return t=>Re(this,void 0,void 0,(function*(){const{isScreen:a,constraints:s}=t,n=e[a?"screen":"main"];let i=n[s.audio?"audio":"video"];i||(i=(a?Oe:Fe.a)(s,t.muted),s.audio&&!n.audio&&(n.audio=i.finally(()=>n.audio=void 0)),s.video&&!n.video&&(n.video=i.finally(()=>n.video=void 0)));try{return yield i}catch(e){throw e}}))}window.getStreamCached=Be;var Ve=a(149),je=a(150);class Le extends X.a{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=Be()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch($.a)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,a){const{streamManager:s}=this;if(s){const a=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(a&&s)return Promise.resolve()}const n={audio:e&&Object(Ue.a)(),video:t&&Object(Ve.a)()};return this.getStream({constraints:n,muted:a}).then(e=>{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main"),this.onInputStream(e)})}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const a=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:a,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:a,source:s}){s||(s=je.a.getSource(e,a)),this.log("tryAddTrack",e,t,a,s);const n="output"===a,{player:i,elements:r,streamManager:o}=this,p=t.kind,d="video"===p,c=d?s:p;let l=r.get(c);d&&t.addEventListener("ended",()=>{this.log("[track] onended"),r.delete(c)},{once:!0}),n&&o.addTrack(e,t,a);const m=d?e:o.outputStream;if(l)l.paused&&l.play().catch($.a),l.srcObject=m;else{if(l=document.createElement(p),l.autoplay=!0,l.srcObject=m,l.volume=1,"undefined"!==l.sinkId){const{outputDeviceId:e}=this;e&&l.setSinkId(e)}d||i.appendChild(l),r.set(c,l)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach(t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)})}onInputStream(e){if(!this.isClosing){const{streamManager:t,description:a}=this;t.addStream(e,"input"),a&&t.appendToConference(a)}}}var Ne=a(138);var qe,Ge,He=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ze=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class We{constructor(e,t){qe.set(this,void 0),Ge.set(this,void 0),He(this,qe,e,"f"),He(this,Ge,t,"f")}get session(){return ze(this,qe,"f")}get media(){return ze(this,Ge,"f")}get bundle(){return this.session.lines.find(e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map(e=>e.lines)).map(e=>e.toString()).join("\r\n")+"\r\n"}}function Ke(e,t,a){const s=e.split(t),n=[];for(;a>0&&s.length;)n.push(s.shift()),--a;return s.length&&n.push(s.join(t)),n}qe=new WeakMap,Ge=new WeakMap;var $e,Je,Qe,Xe=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Ye=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ze{constructor(e,t){$e.set(this,void 0),Je.set(this,void 0),Qe.set(this,void 0),Xe(this,$e,new Set,"f"),Xe(this,Je,e,"f"),Xe(this,Qe,t,"f")}generate(){const e=Ye(this,Je,"f"),t=Ye(this,Qe,"f"),a=Ye(this,$e,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),i=0;for(;a.has(n);)if(n=s)return null;return a.add(n),n}add(e){Ye(this,$e,"f").add(e)}}$e=new WeakMap,Je=new WeakMap,Qe=new WeakMap;var et,tt,at=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},st=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class nt{constructor(e,t){et.set(this,void 0),tt.set(this,void 0),at(this,et,e,"f"),at(this,tt,t,"f")}get key(){return st(this,et,"f")}get value(){return st(this,tt,"f")}}et=new WeakMap,tt=new WeakMap;var it,rt,ot,pt,dt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ct=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class lt{constructor(e,t,a,s){it.set(this,void 0),rt.set(this,void 0),ot.set(this,void 0),pt.set(this,void 0),dt(this,it,e,"f"),dt(this,rt,t,"f"),dt(this,ot,a,"f"),dt(this,pt,s,"f")}get type(){return ct(this,it,"f")}get port(){return ct(this,rt,"f")}get protocol(){return ct(this,ot,"f")}get ids(){return ct(this,pt,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}it=new WeakMap,rt=new WeakMap,ot=new WeakMap,pt=new WeakMap;var mt,gt,ht,ut,yt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},ft=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class _t{constructor(e,t){if(mt.set(this,void 0),gt.set(this,void 0),ht.set(this,void 0),ut.set(this,void 0),yt(this,mt,e,"f"),"string"==typeof t){if(yt(this,gt,t,"f"),"m"===e){const e=t.split(" ");yt(this,ht,new lt(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=Ke(t,":",1);t=e[0],yt(this,ut,1===e.length?new nt(t,null):new nt(t,e[1]),"f")}}else t instanceof lt?(yt(this,ht,t,"f"),yt(this,gt,t.toString(),"f")):t instanceof nt&&(yt(this,ut,t,"f"),yt(this,gt,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return ft(this,mt,"f")}get value(){return ft(this,gt,"f")}get parsed(){return ft(this,ut,"f")}get mediaLineParts(){return ft(this,ht,"f")}toString(){return`${this.key}=${this.value}`}}mt=new WeakMap,gt=new WeakMap,ht=new WeakMap,ut=new WeakMap;var vt,Pt,bt,It,St,Ct,Mt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},wt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class kt{constructor(e,t,a=":",s=!1){vt.set(this,void 0),Pt.set(this,void 0),bt.set(this,void 0),It.set(this,void 0),St.set(this,void 0),Ct.set(this,void 0),Mt(this,vt,e,"f"),Mt(this,Pt,t,"f"),Mt(this,bt,a,"f"),Mt(this,St,s,"f"),Mt(this,It,s?new Map:null,"f"),Mt(this,Ct,s?[]:null,"f")}get lines(){return wt(this,Pt,"f")}get value(){return wt(this,St,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!wt(this,St,"f")}get key(){return wt(this,vt,"f")}get keys(){return kt.fill(this),wt(this,Ct,"f")}forEach(e){kt.fill(this),wt(this,It,"f").forEach(e)}get(e){return kt.fill(this),wt(this,It,"f").get(e)||new kt(e,[],":",!0)}static fill(e){if(null!==wt(e,It,"f"))return;const t=new Map;e.lines.forEach(a=>{const[s,n]=Ke(a,wt(e,bt,"f"),1),i=t.get(s)||[];t.set(s,[...i,n||""])});const a=Mt(e,It,kt.makeAttributes(t),"f");Mt(e,Ct,Array.from(a.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach((e,a)=>{t.set(a,new kt(a,e))}),t}}vt=new WeakMap,Pt=new WeakMap,bt=new WeakMap,It=new WeakMap,St=new WeakMap,Ct=new WeakMap;var At,Et,Tt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Dt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ut{constructor(e){At.set(this,void 0),Et.set(this,void 0),Tt(this,At,e,"f"),Tt(this,Et,new Map,"f"),Ut.fillAttributes(this)}get(e){return Dt(this,Et,"f").get(e)||new kt(e,[]," ",!0)}static fillAttributes(e){const t=new Map;Dt(e,At,"f").forEach(e=>{if("a"===e.key){const{key:a,value:s}=e.parsed;let n=t.get(a);n||(n=[],t.set(a,n)),n.push(s||"")}}),t.forEach((t,a)=>{Dt(e,Et,"f").set(a,new kt(a,t," ",!1))})}}At=new WeakMap,Et=new WeakMap;var xt,Ot,Ft,Rt,Bt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Vt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class jt{constructor(e){xt.set(this,void 0),Ot.set(this,void 0),Ft.set(this,void 0),Rt.set(this,void 0),Bt(this,xt,e,"f"),Bt(this,Ot,e[0],"f"),Bt(this,Ft,Bt(this,Rt,null,"f"),"f")}get lines(){return Vt(this,xt,"f")}get mediaLine(){return Vt(this,Ot,"f")}get mediaLineParts(){return Vt(this,Ot,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!Vt(this,Rt,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",Bt(this,Rt,t,"f")}return Vt(this,Rt,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return Vt(this,Ft,"f")||Bt(this,Ft,new Ut(this.lines),"f"),Vt(this,Ft,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const a in e){const s=this.attributes.get(a),n=!e[a];t[a]=s?n?s.lines:s.value:n?[]:void 0}return t}}xt=new WeakMap,Ot=new WeakMap,Ft=new WeakMap,Rt=new WeakMap;var Lt,Nt,qt=function(e,t,a,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,a):n?n.value=a:t.set(e,a),a},Gt=function(e,t,a,s){if("a"===a&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?s:"a"===a?s.call(e):s?s.value:t.get(e)};class Ht{constructor(e){Lt.set(this,void 0),Nt.set(this,void 0),qt(this,Lt,e,"f"),qt(this,Nt,e.filter(e=>"o"===e.key).map(e=>e.value.split(" ")[1])[0],"f")}get lines(){return Gt(this,Lt,"f")}get sessionId(){return Gt(this,Nt,"f")}}function zt(e){function t(){a?s.push(new jt(n)):a=new Ht(n)}let a=null,s=[],n=[];return e.split(/\r?\n/).forEach(e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const a=Wt(e);"m"===a.key&&(t(),n=[]),n.push(a)}}),t(),new We(a,s)}function Wt(e){const t=Ke(e,"=",1);return new _t(t[0],t[1])}Lt=new WeakMap,Nt=new WeakMap;var Kt=a(171),$t=a(137);function Jt(e,t){const a=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!a.fingerprint){const t=e.session.lines.find(e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)});a.fingerprint=t.parsed.value}const s=function(e){const t=e.map(e=>{const[t,...a]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:a.map(e=>Object($t.c)(+e))}});return t.length?t:void 0}(a["ssrc-group"]),[n,i]=a.fingerprint.split(" ",2),r=a.ssrc&&Object($t.c)(+a.ssrc.split(" ",1)[0]);return{raw:a,ufrag:a["ice-ufrag"],pwd:a["ice-pwd"],fingerprint:{fingerprint:i,setup:a.setup,hash:n},source:r,sourceGroups:s,mid:a.mid}}function Qt(e){const{offer:t,data:a}=e,s=zt(t.sdp);let r=!1;if(e.skipAddingMulticast||(r=function(e){let t;return e.media.forEach((a,s)=>{if("video"===a.mediaType&&a.isSending&&!a.attributes.get("ssrc-group").get("SIM").exists){t||(t=new Ze(2,4294967295));const n=a.attributes.get("ssrc-group").get("FID").value.split(" "),i=a.lines;n.forEach(e=>t.add(+e));const r=[n[0],t.generate(),t.generate()],o=[n[1],t.generate(),t.generate()];i.push(Wt("a=ssrc-group:SIM "+r.join(" ")));const p=a.attributes.get("ssrc").get(n[0]).lines;r.forEach((e,t)=>{const a=o[t];t>0&&(i.push(Wt("a=ssrc-group:FID "+e+" "+a)),p.forEach(t=>{i.push(Wt("a=ssrc:"+e+" "+t))}),p.forEach(e=>{i.push(Wt("a=ssrc:"+a+" "+e))}))}),e.media[s]=new jt(i)}}),!!t}(s)||r),Object(n.d)(s.media,(e,t,n)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,p=o.mediaLineParts,d=(p.ids,o.toString()),c=a[e.mediaType]["payload-types"].map(e=>""+e.id);if(d!==Object(Kt.c)(e.mediaType,void 0,c)){const o=Jt(s,e);let d=Object.assign({},a);d.transport=Object(i.a)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const c=new Ne.a(o.mid,p.type);c.setPort(p.port),o.source&&c.setSource(o.sourceGroups||o.source),c.setDirection(e.direction);const l=zt((new Kt.a).addSsrcEntry(c,d).finalize()).media[0];n[t]=l,r=!0}}),r){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}var Xt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Yt extends class{constructor(e){var t;Object(i.g)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||Object(c.b)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=Object(c.b)("RTCPeerConnection")),t("constructor");const a=new RTCPeerConnection(e);return a.addEventListener("track",e=>{t("ontrack",e)}),a.addEventListener("signalingstatechange",()=>{t("onsignalingstatechange",a.signalingState)}),a.addEventListener("connectionstatechange",()=>{t("onconnectionstatechange",a.connectionState)}),a.addEventListener("negotiationneeded",()=>{t("onnegotiationneeded",a.signalingState)}),a.addEventListener("icecandidate",e=>{t("onicecandidate",e)}),a.addEventListener("iceconnectionstatechange",()=>{t("oniceconnectionstatechange",a.iceConnectionState)}),a.addEventListener("datachannel",()=>{t("ondatachannel")}),a.log=t,{connection:a}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,a){a||(a=Object(c.b)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",e=>{a("onmessage",e)}),s.addEventListener("open",()=>{a("onopen")}),s.addEventListener("close",()=>{a("onclose")}),s.log=a,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new Ne.b(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){let e=this.negotiating;return e||(this.negotiating=this.negotiateInternal().finally(()=>{this.negotiating=void 0}))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}{constructor(e){super(e),this.negotiateThrottled=Object(r.a)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",()=>{this.maybeUpdateRemoteVideoConstraints()}),e.addEventListener("close",()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}),e}createDescription(){if(this.description)return this.description;return super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,a){return Xt(this,void 0,void 0,(function*(){const{groupCall:s,description:i}=this,r=s.id,d=t.map(t=>{const a=function(e,t){const a=Jt(e,t),s=t.mediaType,n={source:a.source,sourceGroups:a.sourceGroups,type:s};a.fingerprint.setup="active";const i={fingerprints:[a.fingerprint],pwd:a.pwd,ssrc:a.source,"ssrc-groups":a.sourceGroups||[],ufrag:a.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(i)},source:a.source,media:t,sourceGroups:a.sourceGroups,entry:n}}(e,t);return this.sources[a.entry.type]=a.entry,a});let c;const l=d.find(e=>"audio"===e.media.mediaType),m=d.find(e=>"video"===e.media.mediaType);let{source:g,params:h}=l||{};const u=m||l,y={audio:l,video:m};if(i.entries.forEach(e=>{if("sendonly"===e.direction){const t=y[e.type];if(!t)return;i.setEntrySource(e,t.sourceGroups||t.source),i.setEntryPeerId(e,De.default.myId)}}),h!==u.params){const e=JSON.parse(u.params.data);g?e.ssrc=g:delete e.ssrc,h={_:"dataJSON",data:JSON.stringify(e)}}const f=p.a.getGroupCallInput(r);if("main"===a.type){const e={call:f,join_as:{_:"inputPeerSelf"},params:h,muted:a.isMuted,video_stopped:!a.joinVideo};c=Ee.invokeApi("phone.joinGroupCall",e),this.log("[api] joinGroupCall id="+r,e)}else{const e={call:f,params:h};c=Ee.invokeApi("phone.joinGroupCallPresentation",e),this.log("[api] joinGroupCallPresentation id="+r,e)}const _=yield c;o.a.processUpdateMessage(_);const v=_.updates.find(e=>"updateGroupCallConnection"===e._),P=JSON.parse(v.params.data);return P.audio=P.audio||s.connections.main.description.audio,i.setData(P),function(e,t){["audio","video"].filter(e=>t[e]).map(e=>[t[e],e]).forEach(([t,a])=>{const s=e.find(e=>e.mediaType===a);if(!s)return;const i=(e=>{const t={};return e.attributes.get("extmap").forEach(e=>{const a=e.key.split("/",1)[0];t[a]=e.value}),t})(s);Object(n.d)(t["rtp-hdrexts"],(e,t,s)=>{i[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,a))})})}(t,P),P}))}negotiateInternal(){return Xt(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,a="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const i=yield e.createOffer({iceRestart:!1});if(a&&this.dataChannel){t.createEntry("application").setDirection("sendrecv")}const{sdp:r,offer:o}=Qt({offer:i,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const p=r.media.filter(e=>"application"!==e.mediaType&&e.isSending);if(a)try{yield this.invokeJoinGroupCall(r,p,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],c=r.bundle;Object(n.d)(c,(e,a,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(a,1),d.push(n))});const l=r.media.map(e=>{const a=e.mid;let s=t.getEntryByMid(a);return s||(s=new Ne.a(a,e.mediaType),s.setDirection("inactive")),s}),m={type:"answer",sdp:t.generateSdp({bundle:c,entries:l,isAnswer:!0})};d.forEach(e=>{t.deleteEntry(e)}),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,m.sdp),yield e.setRemoteDescription(m),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then(()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1}),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:a}=t;e.onStageEndpoints.push(a),e.constraints[a]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var Zt=a(118);var ea=a(164),ta=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class aa extends Le{constructor(e){super(),Object(i.g)(this,e),this.log||(this.log=Object(c.b)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=Object(r.a)(()=>{this.dispatchEvent("pinned",this.pinnedSource)},0,!1),this.addEventListener("state",e=>{e===Zt.a.CLOSED&&this.cleanup()})}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return Zt.a.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?Zt.a.MUTED:Zt.a.UNMUTED:Zt.a.MUTED_BY_ADMIN}return Zt.a.CONNECTING}get participants(){return p.a.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==Zt.a.UNMUTED}get isClosing(){const{state:e}=this;return e===Zt.a.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){Object(n.e)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),Object(n.e)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return Te.c===e?this.participant:this.participants.get(e)}toggleMuted(){return this.requestAudioSource(!0).then(()=>p.a.toggleMuted())}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let a;if(e.pFlags.self){a="video"===t?"main":"presentation"}else{a=e[t].source_groups[0].sources[0]}const s=this.getElement(a);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,n.setAttribute("playsinline","true"),n.muted=!0,{video:n,source:a}}createConnectionInstance(e){return this.connections[e.type]=new Yt(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type)},e))}changeRaiseHand(e){return p.a.editParticipant(this.id,this.participant,{raiseHand:e})}startScreenSharingInternal(){return ta(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Oe({video:{width:{max:1920},height:{max:1080},frameRate:{max:30}},audio:!0}),a=new je.a,s=this.createConnectionInstance({streamManager:a,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",()=>{s.negotiate()}),t.getVideoTracks()[0].addEventListener("ended",()=>{this.connections.presentation&&this.stopScreenSharing()},{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){return this.startScreenSharingPromise||(this.startScreenSharingPromise=this.startScreenSharingInternal().finally(()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,p.a.saveApiParticipant(this.id,this.participant),Ee.invokeApi("phone.leaveGroupCallPresentation",{call:p.a.getGroupCallInput(this.id)}).then(e=>{o.a.processUpdateMessage(e)})):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return ta(this,void 0,void 0,(function*(){const e={video:Object(Ve.a)()};try{const t=yield Object(Fe.a)(e,!1);this.connections.main.addInputVideoStream(t),yield p.a.editParticipant(this.id,this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){return this.startVideoSharingPromise||(this.startVideoSharingPromise=this.startVideoSharingInternal().finally(()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return ta(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&(Object(ea.a)(t),e.streamManager.appendToConference(e.description),yield p.a.editParticipant(this.id,this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,a=!1){return ta(this,void 0,void 0,(function*(){for(const e in this.connections){this.connections[e].closeConnectionAndStream(!t)}if(this.dispatchEvent("state",this.state),!a&&!t){let t;const a=p.a.getGroupCallInput(this.id);if(e)this.log("[api] discardGroupCall id="+this.id),t=Ee.invokeApi("phone.discardGroupCall",{call:a});else if(this.joined){this.log("[api] leaveGroupCall id="+this.id);const e=this.connections.main;t=Ee.invokeApi("phone.leaveGroupCall",{call:a,source:e.sources.audio.source})}else this.log(`[api] id=${this.id} payload=null`),t=Ee.invokeApi("phone.joinGroupCall",{call:a,join_as:{_:"inputPeerSelf"},muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}});const s=yield t;o.a.processUpdateMessage(s)}}))}tryAddTrack(e){const{description:t}=this,a=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+a),s=this.participants.get(e.peerId);s&&De.default.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:s})}return a}onParticipantUpdate(e,t){const a=this.connections.main,{connection:s,description:n}=a,i=d.a.getPeerId(e.peer),r=!!e.pFlags.left,o=this.participantsSsrcs.get(i)||[];if(e.presentation&&!r){const{source:t}=p.a.makeSsrcFromParticipant(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,a.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==i&&this.dispatchEvent("state",this.state))}const c=r?[]:p.a.makeSsrcsFromParticipant(e);r?this.participantsSsrcs.delete(i):this.participantsSsrcs.set(i,c);const l=new Set;o.forEach(e=>{const t=e.source;if(!c.find(e=>e.source===t)){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}}),c.forEach(e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,i),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))}),l.size&&(l.has("video")&&(a.updateConstraints=!0),a.negotiateThrottled())}}},,function(e,t,a){"use strict";a.d(t,"a",(function(){return i}));var s=a(16);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks"};function i(e,t){const a=function(e,t=2){e||(e=1);let a=[];const s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach((t,i)=>{if(n*=t.m,e=0;--e)0===i[e].duration&&i.splice(e,1);return i}(e,2);if(t){const e=a.map(e=>s.default.format(n[e.type],!0,[e.duration]));return Object(s.join)(e,!1,t)}const i=a.map(e=>Object(s.i18n)(n[e.type],[e.duration])),r=document.createElement("span");return r.append(...Object(s.join)(i,!1)),r}},function(e,t,a){"use strict";var s=a(0);var n=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE;const i=new Set(["image/gif","video/mp4","video/webm"]);n&&i.add("video/quicktime");t.a=i},function(e,t,a){"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach(t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)}),e}a.d(t,"a",(function(){return s}))},function(e,t,a){"use strict";a.d(t,"b",(function(){return i})),a.d(t,"c",(function(){return o})),a.d(t,"a",(function(){return p}));var s=a(0);var n=a(137);const i="9";function r(e){return"application"===e?"DTLS/SCTP":"RTP/SAVPF"}function o(e,t=i,a){return`m=${e} ${t} ${r(e)} ${a.join(" ")}`}class p extends class{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(" generation "+e.generation),t.join("")}(e))}addHeader(e,t){const a=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed","a=group:BUNDLE "+a,"a=ice-options:trickle","a=ice-lite","a=msid-semantic:WMS *")}addTransport(e,t){this.add("a=ice-ufrag:"+e.ufrag,"a=ice-pwd:"+e.pwd,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,"a=setup:"+t.setup);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:a,sourceGroups:s}=e;const i=Object(n.a)(e.source);t+=i,a+=i;const r=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${a}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${a}`)};return(()=>{this.add(`a=msid:${t} ${a}`)})(),(null==s?void 0:s.length)?s.forEach(e=>{if(e.sources.length){const t=e.sources.map(n.a);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(r)}}):r(i),this}addSsrcEntry(e,t,a){const s=(...e)=>this.add(...e),{type:n,mid:i,direction:p,port:d}=e,c=t.transport,l="application"===n,m=l?void 0:t[n],g="inactive"===p;if(e.shouldBeSkipped(a))return s(`m=${n} 0 ${r(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive","a=mid:"+i);const h=l?[{id:5e3}]:m["payload-types"],u=h.map(e=>e.id);s(o(n,d,u),"c=IN IP4 0.0.0.0",`a=rtcp:${d} IN IP4 0.0.0.0`),c["rtcp-mux"]&&s("a=rtcp-mux"),s("a=mid:"+i);let y=p;if("sendrecv"===p||!a||g||l||(y="sendonly"===p?"recvonly":"sendonly"),s("a="+y),this.addTransport(c),l)s(`a=sctpmap:${h[0].id} webrtc-datachannel 256`);else{const e=m["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach(e=>{s(`a=extmap:${e.id} ${e.uri}`)}),h.forEach(e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?"/"+e.channels:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const a=[];for(const e in t)a.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${a.join(";")}`)}const a=e["rtcp-fbs"];(null==a?void 0:a.length)&&a.forEach(t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)})})}return!e.source||"sendonly"!==y&&"sendrecv"!==y||this.addSsrc(e),this}addConference(e){const{conference:t,entries:a,bundle:n,isAnswer:i}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of a)this.addSsrcEntry((i?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,i);return this}static fromConference(e){return(new p).addConference(e).finalize()}}}])]); +//# sourceMappingURL=5.4c631eb421e5df7ab421.chunk.js.map \ No newline at end of file diff --git a/public/5.65a3414c4ad3195165a3.chunk.js.map b/public/5.4c631eb421e5df7ab421.chunk.js.map similarity index 99% rename from public/5.65a3414c4ad3195165a3.chunk.js.map rename to public/5.4c631eb421e5df7ab421.chunk.js.map index aef0d77c6..cb3c1e28c 100644 --- a/public/5.65a3414c4ad3195165a3.chunk.js.map +++ b/public/5.4c631eb421e5df7ab421.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/files.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/helpers/audioAssetPlayer.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/lib/calls/helpers/createMainStreamManager.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/calls/helpers/getStream.ts","webpack:///./src/lib/calls/helpers/getVideoConstraints.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/environment/vibrateSupport.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/calls/helpers/stopTrack.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/calls/helpers/getScreenStream.ts","webpack:///./src/lib/calls/helpers/getStreamCached.ts","webpack:///./src/lib/calls/callInstanceBase.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack:///./src/lib/calls/helpers/parseSourceGroups.ts","webpack:///./src/lib/calls/helpers/fixLocalOffer.ts","webpack:///./src/lib/calls/groupCallConnectionInstance.ts","webpack:///./src/lib/calls/callConnectionInstanceBase.ts","webpack:///./src/lib/calls/helpers/createPeerConnection.ts","webpack:///./src/lib/calls/helpers/createDataChannel.ts","webpack:///./src/lib/calls/helpers/processMediaSection.ts","webpack:///./src/lib/calls/helpers/filterServerCodecs.ts","webpack:///./src/lib/calls/groupCallInstance.ts","webpack:///./src/lib/calls/helpers/getScreenConstraints.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/calls/helpers/getAudioConstraints.ts","webpack:///./src/environment/constraintSupport.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","photo","photo_id","forceUserOnline","date","_","toPeerId","console","warn","updateUserName","saveApiUser","Object","assign","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","setUserNameToCache","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","add","requestPeerSingle","releaseSinglePeer","phone","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","oldSearchUsername","searchUsername","min","initials","fullName","deleted","cleanSearchText","getAbbreviation","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","access_hash","key","args","isBot","support","today","Date","diff","getTime","getDate","dateEl","timeEl","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","now","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","lat","long","accuracy_radius","background","self_expires","geo_point","updates","processUpdateMessage","invokeApiCacheable","q","cacheSeconds","my_results","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","freezeSaving","setDialogsFromState","bind","allDialogsLoaded","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","Math","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","idx","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","size","keys","kicked","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","reloadDialogs","inputPeer","reloadPromises","reloadPromise","overwrite","from","to","oldFilter","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","split","threadsStorage","good","isInChat","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","channel_id","top_msg_id","chat_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","setDialogToStateIfMessageIsTop","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","messageId","inbox_date","media","entities","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","text","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","trim","replyToMsgId","MAX_LENGTH","message_length_max","splitted","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","apiPromise","afterMessageId","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","silent","wrapMessageEntities","seq","local","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","document","actionName","isVoiceMessage","attribute","voice","waveform","duration","isMedia","photoSize","w","width","h","height","location","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","url","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","err","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","code","files","sendFile","sendFileDetails","groupId","details","o","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","contactPeerId","sendOther","getContactMediaInput","pollId","savePoll","total_voters","recent_voters","getPoll","getPhoto","getDoc","geo","geoPoint","title","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","chatsFull","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","from_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","s","m","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","getMidsByAlbum","verify","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","ttl_seconds","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","video","reason","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","parseEntities","mergeEntities","usingMids","plain","highlightWord","withoutMediaType","parts","hasAlbumKey","addPart","langKey","part","el","createElement","innerHTML","append","assumeType","usingFullAlbum","getMidsByMessage","albumText","getAlbumText","emoticon","wrapEmojiText","question","rReply","game","stickerEmojiRaw","stickerEmoji","performer","actionWrapped","wrapMessageActionTextNew","wrapPlainText","match","found","regExp","RegExp","exec","sortEntities","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","htmlToDocumentFragment","fragment","createDocumentFragment","senderTitle","classList","fromMe","getMessageSenderPeerIdOrName","element","peerTitle","fromName","onclick","wrapUrl","href","setAttribute","unsafeMessage","langPackKey","getNameDivHTML","getPeerTitle","formatCallDuration","endsWith","wrapJoinVoiceChatAnchor","daysToStart","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","t","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","wrapMessageActionTextNewUnsafe","botId","startParam","start_param","inviteToChannel","addChatUser","str","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","func","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","filterMessagesByInputFilter","next_rate","offset_id_offset","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","msg_id","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","fixUnreadMentionsCountIfNeeded","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mute","mute_until","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","getInputFileName","polls","handleReleasingMessage","increment","notification","peerString","notificationMessage","show_previews","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","haveSlice","sliceMe","fulfilled","Both","fillHistoryStorage","constructSlice","offsetIdOffset","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","noforwards","noForwards","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","getUserString","getChatString","isPeerId","charAt","peerParams","substr","isMegagroup","ignorePeerId","getInputPeer","getUserInputPeer","pic","abs","getDialogType","getChatTyped","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","participants_count","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","getChannelInputPeer","getChatInputPeer","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","about","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","AppPhotosManager","photos","context","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","inputUser","photosResult","photoIds","bytes","isSticker","arr","mimeType","Uint8Array","jpegHeader","jpegTail","URL","createObjectURL","path","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","fullHeight","download","getDownload","getInput","fullPhotoSize","downloadToDisc","bytesToHex","bytesFromHex","hexString","len","ceil","start","parseInt","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","replace","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","bytesFromWordss","bytesToWordss","words","Uint32Array","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","stickerset","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","shift","downloadDoc","cachedSet","documents","refreshTime","useCache","saveStickers","getStickerSetInput","saveById","getStickerSet","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","getAppConfig","appConfig","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","invokeApiHashable","processResult","res","stickers","isAnimation","cleanEmoji","pack","packs","preloadEmojiPromise","getAnimatedEmojiSticker","json","mediaSize","active","emojiSticker","toneIndex","animation","loadAnimationWorker","container","animationData","autoplay","loop","saveLottiePreview","canvas","once","preloadAnimatedEmojiStickerAnimation","soundDoc","getAnimatedEmojiSoundDocument","newSet","setToCache","needSave","installed_date","thumb_dc_id","isAnimated","animated","thumb_version","short_name","sets","covered","archived","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","includeOurStickers","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docId","docEmoticon","_doc","AppProfileManager","usersFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","userFull","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","chat_photo","refreshFullPeer","invalidateChannelParticipants","invokeApiSingleProcess","usersUserFull","full_user","profile_photo","rAbout","getProfile","getCachedFullUser","getCachedFullChat","getProfileByPeerId","profile","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","previous","deletedList","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","target","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","stickerCachedThumbs","toBlob","createDownloadAnchor","addTaskListener","task","payload","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","prefixes","maxPrefixLength","setPrefix","country","prefix","country_code","originalStr","countriesList","country_codes","prefixCountry","phoneCode","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","x","html","span","isObject","object","intToUint","val","longFromInts","high","low","bigInt","sortLongsArray","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","randomize","buffer","windowSize","visualViewport","innerWidth","innerHeight","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","requestPermission","Notification","removeEventListener","navigator","vibrate","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","toDataURL","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","peerNotifySettings","isMuted","respectType","n","notifySettings","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","isImage","loader","renderImageFromUrlPromise","fixBase64String","toUrl","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","quality","aspectFitted","drawImage","createPosterFromVideo","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","radix","bpe","mask","digitsStr","buff","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","z","expand","ans","copy_","mod","dup","mod_","mult","y","copyInt_","linCombShift_","mult_","powMod","powMod_","pow","sub","sub_","add_","eGCD_","g","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","r","y1","y2","subShift_","addShift_","rightShift_","modInt","bits","minSize","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","stripped_thumb","childElementCount","mutateElement","renderPromise","isDialog","getPeerColorById","avatarAvailable","avatarRendered","abbr","getMiddleware","cleanupObj","cleaned","additionalCallback","_cleanupObj","GROUP_CALL_STATE","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","capture","passive","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","half2","removeAttribute","measureText","MiddleEllipsisElement","HTMLElement","customElements","define","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","combined","emptyDraft","syncDraft","AudioAssetPlayer","assets","createAudio","play","Audio","pause","playSound","makeSsrcsFromParticipant","makeSsrcFromParticipant","source","audio_source","source_groups","endpoint","presentation","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","skipCounterUpdating","getCachedParticipants","oldParticipant","hasLeft","muted","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","saveApiParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","sources","setMuted","getGroupCallInput","getInputPeerSelf","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","stopConnectingSound","playSoundWithTimeout","stopSound","cancelDelayedPlay","rejoin","joinVideo","streamManager","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","CLOSED","setCurrentGroupCall","getGroupCallFull","connectionInstance","createConnectionInstance","connection","createPeerConnection","negotiate","event","onTrack","iceConnectionState","startConnectingSound","getGroupCallParticipants","values","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","sourceGroups","mainSources","presentationSources","tsNow","prepareToSavingNextOffset","ids","groupCallParticipants","next_offset","discard","changeUserMuted","getParticipantByPeerId","editParticipant","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","hasTag","processSearchText","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","slices","end","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","updateMessagePoll","poll_id","saveResults","rQuestion","chosenIndexes","answer","chosen","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","toTelegramSource","fromTelegramSource","getAmplitude","array","scale","rms","sqrt","ConferenceEntry","port","direction","originalDirection","setDirection","transceiver","addTransceiver","isAnswer","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","setSource","setPeerId","isSending","sendEntry","recvEntry","createEntry","fromConference","conference","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","apply","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","next","refreshEmojiesSoundsPromise","hex","newHex","newContext","template","content","ConnectionStatus","mediaDevices","getUserMedia","getTracks","frameRate","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","streamAnalyser","track","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","canCreateConferenceEntry","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","oldTrack","timer","lol","transceiverInit","streams","types","tracks","findEntry","createTransceiver","sender","replaceTrack","IS_VIBRATE_SUPPORTED","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","stopTrack","subtle","crypto","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","encryptedBytes","encrypt","aesDecryptSync","decryptedBytes","decrypt","rsaEncrypt","publicKey","N","modulus","E","exponent","X","encryptedBigInt","hash_pbkdf2","salt","importKey","deriveBits","pqPrimeFactorization","pqBytes","lim","P","Q","minLen","it","pqPrimeLeemon","bytesModPow","xBigInt","yBigInt","mBigInt","resBigInt","gzipUncompress","inflate","boolFalse","API","constructors","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","Int32Array","byteView","resultBuffer","resultInt32","subarray","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","checkLength","writeInt","iHigh","iLow","sLong","storeLongP","storeIntBytes","storeRawBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","methodData","methods","storeInt","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","schema","isBare","constructorData","readInt","doubleView","longDec","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","kHash","k_v","is_good_mod_exp_first","modexp","prime","a_for_hash","secure_random","A","generate_and_check_random","g_b","ux","a_ux","S","K","h1","h2","M1","srp_id","webWorker","taskId","awaiting","utils","timeManager","lastMessageId","timeOffset","sessionStorage","timeTicks","serverTime","localTime","newTimeOffset","server_time_offset","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","Obfuscation","codec","initPayload","val2","reversedPayload","encKey","encIv","decKey","decIv","encNew","decNew","obfuscateTag","Connection","logSuffix","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","readPacket","parseResponse","response","processMessage","onClose","needTimeout","retryAt","time","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","Connecting","bodySent","logTypes","setTransportClosed","setAutoReconnect","toEncode","encodePacket","socketId","socketsProxied","TEST_SUFFIX","test","sslSubdomains","dcOptions","host","chosenServers","transportSocket","connectionType","chosenServer","oooohLetMeLive","transportHTTP","ssl","http","dcOption","transportType","transport","reuse","client","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","baseDcId","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","mode","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingId","storeMethod","ping_id","pingMessage","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","userAgent","platform","isMainDomain","language","resultType","isAPI","oldTransport","removeTransport","nextReqTimeout","longPollInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","pushResend","shouldResolve","noSchedule","TimedOut","noop","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","messageByteLength","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","messageBodyLength","messageBody","mt_message","seqno","stack","setOffset","mt_rpc_result","newServerSalt","bigIntBytes","longToBytes","cb","performScheduledRequest","notEmpty","rawError","error_message","error_code","msg","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","networkerFactory","networkers","langPackCode","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","foundKey","fingerprint","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_two","_twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","iterateNetworkers","info","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","ignoreErrors","closeDatabases","maxNetworkers","generateNetworkerGetKey","ak","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","removeNetworker","prepareTempMessageId","cachedNetworker","rejectPromise","logOut","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","stopTime","waitTime","floodMaxTimeout","getScreenStream","getDisplayMedia","getStreamCached","_cache","screen","isScreen","player","elements","hasInputTrackKind","requestInputSource","isAudioGood","isVideoGood","isSharingVideo","getVideoTracks","saveInputVideoStream","onInputStream","cleanup","tryAddTrack","isOutput","tagName","isVideo","elementEndpoint","useStream","paused","srcObject","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","appendToConference","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","SDPAttributeSplitted","SDPMediaLineParts","protocol","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","lookupAttributeKeys","setup","ssrc","telegramSourceGroups","sdpLines","semantics","parseSourceGroups","raw","ufrag","pwd","fixLocalOffer","offer","hasMunged","skipAddingMulticast","generator","mediaType","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","mediaLine","localMLine","codecIds","sectionInfo","newData","candidates","setPort","newChannel","addSsrcEntry","mungedSdp","RTCPeerConnection","signalingState","connectionState","dict","dataChannel","stopStream","closeConnection","negotiating","negotiateInternal","JSON","stringify","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","processMediaSection","audioChannel","videoChannel","useChannel","channels","setEntrySource","setEntryPeerId","parse","groupCallInput","join_as","setData","extmap","performExtmap","uri","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","setLocalDescription","invokeJoinGroupCall","entriesToDelete","bundle","shouldBeSkipped","answerDescription","generateSdp","deleteEntry","iceGatheringState","setRemoteDescription","updateConstraints","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","sendDataChannelData","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","requestAudioSource","toggleMuted","getElement","clone","raise","stopScreenSharing","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","isSharingScreen","startScreenSharing","startVideoSharingPromise","startVideoSharingInternal","stopVideoSharing","startVideoSharing","isDiscarded","getEntryBySource","oldSsrcs","pinSource","modifiedTypes","oldSsrc","oldSource","oldEntry","setEndpoint","CALL_DURATION_LANG_KEYS","showLast","formatDuration","strings","VIDEO_MIME_TYPES_SUPPORTED","channelCount","constraint","getSupportedConstraints","constraintSupported","WEBRTC_MEDIA_PORT","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","joiner","newLine","strs","foundation","component","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","skipCandidates","candidate","addCandidate","streamName","addSource","addMsid","ssrcGroup","isApplication","isInactive","payloadTypes","addTransport","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addSsrc","addHeader","addConference"],"mappings":"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","file":"5.65a3414c4ad3195165a3.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { filterUnique, indexOfAndSplice } from \"../../helpers/array\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { safeReplaceObject, isObject } from \"../../helpers/object\";\nimport { Chat, InputContact, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus, InputGeoPoint } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto).photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser(Object.assign({}, user, {\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }), true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport { forEachReverse, indexOfAndSplice, insertInDescendSortedArray } from \"../../helpers/array\";\nimport rootScope from \"../rootScope\";\nimport { defineNotNumerableProperties, safeReplaceObject } from \"../../helpers/object\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, wasIndex);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', pos);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, safeReplaceObject } from \"../../helpers/object\";\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { forEachReverse } from \"../../helpers/array\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { copy, getObjectKeysAndSort } from \"../../helpers/object\";\nimport { randomLong } from \"../../helpers/random\";\nimport { splitStringByLength, limitSymbols, escapeRegExp } from \"../../helpers/string\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.chatsFull[peerId.toChatId()] as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n if(originalMessage.fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.from_id = appPeersManager.getOutputPeer(originalMessage.fromId);\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n // * there is no way to detect whether user profile is hidden\n if(peerId === myId) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message = {\n _: 'messageService',\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n } as Message.messageService;\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n } \n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: any, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.document = appDocsManager.saveDoc(message.media.document, mediaContext); // 11.04.2020 warning\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n break;\n }\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n /* for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n } */\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peerId.isUser() && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.fromId === rootScope.myId \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true) {\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0], message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n\n Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(appNotificationsManager.isPeerLocalMuted(peerId, true) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, mute?: boolean) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n \n settings.mute_until = mute ? MUTE_UNTIL : 0;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(peerId.isAnyChat() && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { isObject } from \"../../helpers/object\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : null;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { isObject, safeReplaceObject, copy, deepEqual } from \"../../helpers/object\";\nimport { ChannelParticipant, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates, ChannelsCreateChannel } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n if(this.fromName !== undefined) {\r\n this.element.innerHTML = RichTextProcessor.wrapEmojiText(this.fromName);\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { bytesFromHex } from \"../../helpers/bytes\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { safeReplaceArrayInObject, isObject } from \"../../helpers/object\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { forEachReverse } from '../../helpers/array';\nimport DATABASE_STATE from '../../config/databases/state';\nimport { readBlobAsText } from '../../helpers/blob';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n getAnimatedEmojiSoundsPromise: Promise;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n return this.getAnimatedEmojiSoundsPromise = apiManager.getAppConfig(overwrite).then(appConfig => {\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(readBlobAsText)\n .then(async(json) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: json,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false\n }, 'none', toneIndex);\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({method: 'messages.getAllStickers'});\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n }\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport { numberThousandSplitter } from \"../../helpers/number\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n public usersFull: {[id: UserId]: UserFull.userFull} = {};\n public chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = fullChat.chat_photo?._ !== 'photoEmpty';\n if(hasChatPhoto !== hasFullChatPhoto || (photo as ChatPhoto.chatPhoto).photo_id !== fullChat.chat_photo?.id) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true): Promise {\n if(this.usersFull[id] && !override) {\n return Promise.resolve(this.usersFull[id]);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n if(userFull.about !== undefined) {\n userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true): Promise {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public getFullPhoto(peerId: PeerId) {\n return this.getProfileByPeerId(peerId).then(profile => {\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n });\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true): Promise {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return Promise.resolve(fullChat);\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public getChatInviteLink(id: ChatId, force?: boolean) {\n return this.getChatFull(id).then((chatFull) => {\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true): Promise {\n if(this.chatsFull[id] !== undefined && !override) {\n return Promise.resolve(this.chatsFull[id] as ChatFull.channelFull);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = (this.getChatFull(chatId) as Promise).then(chatFull => {\n return (chatFull.participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) delete this.usersFull[peerId.toUserId()];\n else delete this.chatsFull[peerId.toChatId()];\n\n rootScope.dispatchEvent('peer_full_update', peerId);\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name: string, last_name: string, about: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n appProfileManager.getChatFull(update.chat_id).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version alpha ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { safeReplaceArrayInObject, defineNotNumerableProperties, isObject } from '../../helpers/object';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n doc.attributes.forEach(attribute => {\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n });\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport { findAndSpliceAll, indexOfAndSplice } from \"../helpers/array\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n ((peerNotifySettings.mute_until * 1000) > tsNow() || peerNotifySettings.silent);\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', callback);\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1< ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\nimport { clamp } from \"../helpers/number\";\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst testQueueElements = () => {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n};\r\n\r\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n testQueue.add(this);\r\n setTestQueue();\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { isObject } from \"../mtproto/bin_utils\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n \n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n this.audio?.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport { safeReplaceObject } from \"../../helpers/object\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end ^= side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: ItemType[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: ItemType[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(slice[0] > s[0]) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: ItemType) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: number) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; offset++) {\r\n if(maxId >= slice[offset]) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: ItemType[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { indexOfAndSplice } from '../../helpers/array';\nimport { safeAssign } from '../../helpers/object';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(this.type, init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { bytesToHex } from \"../../helpers/bytes\";\nimport { deepEqual } from \"../../helpers/object\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public lol: boolean;\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.lol) {\n return;\n }\n // return;\n const {inputStream, direction, canCreateConferenceEntry} = this;\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendrecv';\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendonly';\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types: ['audio' | 'video', RTCRtpTransceiverInit][] = [\n ['audio' as const, transceiverInit], \n ['video' as const, transceiverInit/* {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} */]\n ];\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const track = tracks.find(track => track.kind === type);\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { safeReplaceObject } from \"../../helpers/object\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":739712882,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":142306870,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactons\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":-1826077446,\"predicate\":\"messageUserReaction\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessageUserReaction\"},{\"id\":-1553558980,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"}]},\"layer\":137} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n\nexport function sha256HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n let bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\nimport { addPadding, isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, bigInt2str, int2bigInt, sub_ } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n /* let perf = performance.now();\n const jsbnBytes: Uint8Array = new Uint8Array(8);\n const jsbnBigInt = bigStringInt(sLong);\n for(let i = 0; i < 8; i++) {\n jsbnBytes[i] = +jsbnBigInt.shiftRight(8 * i).and(bigint(255)).toString(10);\n }\n console.log('perf1', performance.now() - perf); */\n\n // perf = performance.now();\n let bigInt: number[];\n if(sLong[0] === '-') { // leemon library can't parse signed numbers\n bigInt = int2bigInt(0, 64, 8);\n sub_(bigInt, str2bigInt(sLong.slice(1), 10, 64));\n } else {\n bigInt = str2bigInt(sLong, 10, 64);\n }\n\n const hex = bigInt2str(bigInt, 16).slice(-16);\n const bytes = addPadding(bytesFromHex(hex).reverse(), 8, true, true, false);\n\n // console.log('perf2', performance.now() - perf);\n\n this.storeRawBytes(bytes);\n\n // if(jsbnBytes.hex !== bytes.hex) {\n // console.error(bigInt, sLong, bigInt2str(bigInt, 10), negative(bigInt), jsbnBytes.hex, bigInt2str(bigInt, 16), bytes.hex);\n // }\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\r\n \r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = powMod(g, x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n \r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await CryptoWorker.invokeCrypto('sha256-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport { indexOfAndSplice } from '../../helpers/array';\r\nimport App from '../../config/app';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256-hash', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n result.result = deserializer.fetchObject(type, field + '[result]');\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\n\n \nimport transportController from \"./transports/controller\";\n \n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1-hash', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1-hash', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n info.networker.changeTransport(transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n networker.changeTransport(transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n return screenStream;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then(stream => {\n if(stream.getVideoTracks().length) {\n this.saveInputVideoStream(stream, 'main');\n }\n \n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport { copy } from \"../../../helpers/object\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../helpers/array\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/apiManager\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { safeAssign } from \"../../helpers/object\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { safeAssign } from \"../../helpers/object\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/apiManager\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n clone.setAttribute('playsinline', 'true');\n clone.muted = true;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","export default function getScreenConstraints(): DisplayMediaStreamConstraints {\n return {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n },\n audio: true\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\nexport type WebRTCLineType = 'video' | 'audio' | 'application';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${mediaType} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${type} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[] = [];\n private newLine: string[] = [];\n\n constructor(private joiner = '\\r\\n') {\n\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/cleanUsername.ts","webpack:///./src/lib/appManagers/appUsersManager.ts","webpack:///./src/lib/storages/dialogs.ts","webpack:///./src/lib/storages/filters.ts","webpack:///./src/lib/appManagers/appMessagesManager.ts","webpack:///./src/lib/appManagers/appPeersManager.ts","webpack:///./src/lib/appManagers/appChatsManager.ts","webpack:///./src/components/peerTitle.ts","webpack:///./src/lib/appManagers/appPhotosManager.ts","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/appManagers/appStickersManager.ts","webpack:///./src/lib/appManagers/appProfileManager.ts","webpack:///./src/lib/appManagers/apiUpdatesManager.ts","webpack:///./src/lib/appManagers/appDocsManager.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/components/visibilityIntersector.ts","webpack:///./src/components/lazyLoadQueue.ts","webpack:///./src/helpers/formatPhoneNumber.ts","webpack:///./src/helpers/assumeType.ts","webpack:///./src/helpers/dom/htmlToSpan.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/helpers/windowSize.ts","webpack:///./src/lib/appManagers/appMessagesIdsManager.ts","webpack:///./src/lib/appManagers/appNotificationsManager.ts","webpack:///./src/helpers/dom/renderImageFromUrl.ts","webpack:///./src/helpers/fixBase64String.ts","webpack:///./src/components/preloader.ts","webpack:///./src/helpers/files.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/helpers/middleware.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/components/middleEllipsis.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/helpers/audioAssetPlayer.ts","webpack:///./src/lib/appManagers/appGroupCallsManager.ts","webpack:///./src/lib/calls/helpers/createMainStreamManager.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/slicedArray.ts","webpack:///./src/lib/appManagers/appPollsManager.ts","webpack:///./src/lib/calls/utils.ts","webpack:///./src/lib/calls/localConferenceDescription.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/lib/mtproto/referenceDatabase.ts","webpack:///./src/helpers/dom/htmlToDocumentFragment.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/calls/helpers/getStream.ts","webpack:///./src/lib/calls/helpers/getVideoConstraints.ts","webpack:///./src/lib/calls/streamManager.ts","webpack:///./src/environment/vibrateSupport.ts","webpack:///./src/lib/opusDecodeController.ts","webpack:///./src/lib/appManagers/appWebPagesManager.ts","webpack:///./src/environment/imageMimeTypesSupport.ts","webpack:///./src/lib/calls/constants.ts","webpack:///./src/lib/calls/helpers/stopTrack.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/calls/helpers/getScreenStream.ts","webpack:///./src/lib/calls/helpers/getStreamCached.ts","webpack:///./src/lib/calls/callInstanceBase.ts","webpack:///./src/lib/calls/sdp/index.ts","webpack:///./src/helpers/string/splitStringByLimitWithRest.ts","webpack:///./src/helpers/uniqueNumberGenerator.ts","webpack:///./src/lib/calls/sdp/attributeSplitted.ts","webpack:///./src/lib/calls/sdp/mediaLineParts.ts","webpack:///./src/lib/calls/sdp/line.ts","webpack:///./src/lib/calls/sdp/attributeInner.ts","webpack:///./src/lib/calls/sdp/attributes.ts","webpack:///./src/lib/calls/sdp/mediaSection.ts","webpack:///./src/lib/calls/sdp/sessionSection.ts","webpack:///./src/lib/calls/sdp/utils.ts","webpack:///./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack:///./src/lib/calls/helpers/parseSourceGroups.ts","webpack:///./src/lib/calls/helpers/fixLocalOffer.ts","webpack:///./src/lib/calls/groupCallConnectionInstance.ts","webpack:///./src/lib/calls/callConnectionInstanceBase.ts","webpack:///./src/lib/calls/helpers/createPeerConnection.ts","webpack:///./src/lib/calls/helpers/createDataChannel.ts","webpack:///./src/lib/calls/helpers/processMediaSection.ts","webpack:///./src/lib/calls/helpers/filterServerCodecs.ts","webpack:///./src/lib/calls/groupCallInstance.ts","webpack:///./src/lib/calls/helpers/getScreenConstraints.ts","webpack:///./src/helpers/formatCallDuration.ts","webpack:///./src/helpers/formatDuration.ts","webpack:///./src/environment/movSupport.ts","webpack:///./src/environment/videoMimeTypesSupport.ts","webpack:///./src/lib/calls/helpers/getAudioConstraints.ts","webpack:///./src/environment/constraintSupport.ts","webpack:///./src/lib/calls/sdpBuilder.ts","webpack:///./src/lib/calls/stringFromLineBuilder.ts"],"names":["cleanUsername","username","toLowerCase","appUsersManager","storage","appStateManager","storages","users","updateUsersStatuses","timestampNow","i","this","user","updateUserStatus","clear","setInterval","rootScope","addEventListener","addMultipleEventsListeners","update","userId","user_id","status","expires","serverTimeManager","serverTimeOffset","was_online","dispatchEvent","setUserToStateIfNeeded","updateUserPhoto","photo","photo_id","forceUserOnline","date","_","toPeerId","console","warn","updateUserName","saveApiUser","Object","assign","first_name","last_name","e","getSelf","id","contactsIndex","indexObject","getUserSearchText","getState","then","state","storagesResults","length","setUserNameToCache","contactsList","Array","isArray","forEach","pushContact","contactsFillPromise","resolve","peerId","appPeersManager","isUser","toUserId","getFromCache","set","getUser","delete","init","usernames","isPeerNeeded","findAndSplice","getTopPeersPromises","createSearchIndex","undefined","Set","updatedContactsList","pushToState","cached","isFulfilled","promise","invokeApi","result","saveApiUsers","contacts","contact","onContactsModified","slice","Promise","resolvedPeer","appChatsManager","saveApiChats","chats","getPeer","getPeerId","peer","add","requestPeerSingle","releaseSinglePeer","phone","pFlags","self","format","filter","Boolean","join","query","includeSaved","sortBy","fillContacts","_contactsList","results","search","has","sort","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","myId","testSelfSearch","unshift","getContacts","userIds","map","block","invokeApiSingle","getInputPeerById","value","apiUpdatesManager","processLocalUpdate","peer_id","getOutputPeer","blocked","index","clearBadChars","ignoreCase","latinize","includeTag","apiUsers","override","saved","oldUser","oldSearchUsername","searchUsername","min","initials","fullName","deleted","cleanSearchText","getAbbreviation","changedPhoto","changedTitle","wasContact","newContact","onContactUpdated","formatPhoneNumber","formatted","access_hash","key","args","isBot","support","today","Date","diff","getTime","getDate","dateEl","timeEl","bot","isRegularUser","isContact","allowMin","phone_number","vcard","eventTimestamp","timestamp","updatesState","syncLoading","importContacts","phones","error","Error","type","inputContacts","j","push","client_id","toString","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","now","peers","offset","limit","hash","topPeers","categories","topPeer","requestPeer","rating","contactsBlocked","count","peerIds","u","concat","c","lat","long","accuracy_radius","background","self_expires","geo_point","updates","processUpdateMessage","invokeApiCacheable","q","cacheSeconds","my_results","p","curIsContact","popContact","offline","showPhone","getUserInput","add_phone_privacy_exception","appMessagesManager","appDraftsManager","appNotificationsManager","appMessagesIdsManager","folders","onUpdateFolderPeers","folder_peers","folderPeer","folder_id","dialog","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","folderId","getDialogOnly","onUpdatePinnedDialogs","handleOrder","order","pinnedOrders","reverse","newPinned","dialogs","getFolderDialogs","dialogsResult","applyDialogs","d","getCache","peerText","getPeerSearchText","dialogsIndex","onFilterUpdate","getCachedDialogs","processDialogForFilter","filterId","processDialogForFilters","indexKey","orderIndex","chatId","chat","getChat","left","dropDialogOnDeletion","updateFolderPeers","updateDialogPinned","updatePinnedDialogs","freezeSaving","setDialogsFromState","bind","allDialogsLoaded","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","getMessageByPeer","reloadConversation","loaded","0","1","setDialogsLoaded","savePinnedOrders","dialogsOffsetDate","dialogsNum","cachedResults","offsetDate","Math","getOffsetDate","unreadMessagesCount","unreadDialogsCount","skipMigrated","folder","getFolder","migratedTo","filtersStorage","testDialogForFilter","pinnedIndex","pinnedPeerIds","indexOf","generateDialogIndex","generateDialogPinnedDateByIndex","pinned_peers","skipped","isPinned","filters","getDialogIndexKey","wasIndex","findIndex","wasDialog","wasDialogIndex","newDialogIndex","setDialogIndexInFilter","prepareFolderUnreadCountModifyingByDialog","splice","callbacks","callback","toggle","wasUnreadCount","getDialogUnreadCount","newUnreadCount","addMessagesCount","addDialogsCount","modifyFolderUnreadCount","max","dispatchUnreadTimeout","ctx","setTimeout","justReturn","message","topDate","generateDialogPinnedDate","channelId","isChannel","toChatId","channel","draft","foundIndex","pts","historyStorage","getHistoryStorage","messagesStorage","getMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","fromId","viaBotId","isAnyChat","newPts","getChannelState","ignoreOffsetDate","saveGlobalOffset","pos","setDialogToState","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","isDialogsLoaded","clearDialogFromState","foundDialog","getDialog","wasPinned","keepLocal","dropped","dropDialogWithEvent","idx","messages","updatedDialogs","topPendingMessage","pendingTopMsgs","maxId","newUpdatesAfterReloadToHandle","saveUpdate","size","keys","kicked","wasDialogBefore","generateMessageId","wasTopMessage","generateTempMessageId","from_id","out","isOutgoing","log","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","Bottom","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","settings","notify_settings","addChannelState","getFilter","offsetIndex","ret","promises","fillContactsResult","reloadMissingDialogsPromise","reloadMissingPeerIds","all","getDialogs","realFolderId","curDialogStorage","indexStr","d1","d2","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","convertment","onUpdateDialogFilter","saveDialogFilter","onUpdateDialogFilterOrder","setOrderIndex","hasOwnProperty","updateDialogFilter","updateDialogFilters","oldFilters","getDialogFilters","_filterId","find","updateDialogFilterOrder","reloadedPeerIds","excludePeerIds","includes","includePeerIds","exclude_archived","exclude_read","isDialogUnread","exclude_muted","isPeerLocalMuted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","bots","non_contacts","config","pinned_infolder_count_max","reject","prepend","remove","flags","getOutputDialogFilter","bool","f","a","b","filterIncludedPinnedPeers","include_peers","reloadDialogs","inputPeer","reloadPromises","reloadPromise","overwrite","from","to","oldFilter","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","Map","fetchSingleMessagesPromise","maxSeenId","newMessagesHandleTimeout","newMessagesToHandle","newDialogsToHandle","notificationsHandlePromise","notificationsToHandle","reloadConversationsPeers","logger","Debug","Log","Warn","groupedTempId","typings","unreadMentions","goToNextMentionPromises","handleNewMessages","clearTimeout","handleNewDialogs","newMaxSeenId","obj","dialogsStorage","incrementMaxSeenId","handleNotifications","window","_peerId","idle","isIDLE","notifyPeerToHandle","getNotifyPeerTypeSettings","getNotifySettings","getInputNotifyPeerById","peerTypeNotifySettings","notifyAboutMessage","fwdCount","onUpdateMessageId","randomId","random_id","pendingData","tempId","threadId","finalizePendingMessageCallbacks","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","threadKey","getThreadKey","split","threadsStorage","good","isInChat","ignoreExisting","pendingMessage","checkPendingMessage","updateMessageRepliesIfNeeded","findSlice","firstSlice","first","action","channel_id","top_msg_id","chat_id","handleNewMessage","inboxUnread","releaseUnreadCount","prepareDialogUnreadCountModifying","mentioned","modifyCachedMentions","setDialogTopMessage","notifyPeer","fwd_from","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","grouped_id","onUpdateReadHistory","max_id","read_max_id","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","threadsToReplies","updateMessage","get","replyTo","reply_to","reply_to_top_id","reply_to_msg_id","cancel","setCount","getReadMaxIdIfUnread","threadKeyPart","onUpdateReadMessagesContents","mids","getMessageById","fixDialogUnreadMentionsIfNoMessage","media_unread","setDialogToStateIfMessageIsTop","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","clearCache","params","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","historiesStorage","onUpdateChannelReload","onUpdateChannelMessageViews","views","onUpdateServiceNotification","messageId","inbox_date","media","entities","hasUser","verified","pts_count","onUpdatePinnedMessages","missingMessages","wrapSingleMessage","finally","werePinned","pinnedMessages","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","scheduledMessagesStorage","isScheduled","onUpdateDeleteScheduledMessages","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getWebPage","drop","poll","appPollsManager","pollToMessages","maxSeenMsgId","middleware","clean","messagesStorageByPeerId","groupedMessagesStorage","searchesStorage","threadsServiceMessagesIdsStorage","sendEntites","entity","callbackName","finalize","deferred","text","options","invokeAfterMessageIsSent","editMessage","parseMarkdown","schedule_date","scheduleDate","is_scheduled","newMedia","getInputEntities","no_webpage","noWebPage","handled","trim","replyToMsgId","MAX_LENGTH","message_length_max","splitted","webPage","sendText","getPeerMigratedTo","generateOutgoingMessage","toggleError","on","send","sentRequestOptions","apiPromise","afterMessageId","invokeApiAfter","query_id","queryId","resultId","clear_draft","clearDraft","silent","wrapMessageEntities","seq","local","beforeMessageSending","file","attachType","apiFileName","fileType","mime_type","fileName","File","name","isDocument","Blob","caption","attributes","isPhoto","document","actionName","isVoiceMessage","attribute","voice","waveform","duration","isMedia","photoSize","w","width","h","height","location","sizes","cacheContext","appDownloadManager","getCacheContext","downloaded","url","objectURL","appPhotosManager","savePhoto","videoAttribute","round_message","isRoundMessage","supports_streaming","noSound","file_name","thumbs","thumb","blob","thumbCacheContext","appDocsManager","saveDoc","preloader","attachMethod","tryAgainOnFail","isUpload","sentDeferred","attachPromise","catch","err","uploaded","cancelPendingMessage","setTyping","uploadPromise","file_reference","inputMedia","load","thumbUploadPromise","upload","notifyAll","done","total","inputFile","force_file","addNotifyListener","progress","percents","floor","isGroupedItem","code","files","sendFile","sendFileDetails","groupId","details","o","invoke","multiMedia","multi_media","messageMedia","getMediaInput","doc","inputSingleMedia","inputs","contactPeerId","sendOther","getContactMediaInput","pollId","savePoll","total_voters","recent_voters","getPoll","getPhoto","getDoc","geo","geoPoint","title","address","provider","venue_id","venue_type","postAuthor","signatures","generateFromId","post_author","generateFlags","random","generateReplyHeader","via_bot_id","reply_markup","replyMarkup","replies","generateReplies","pending","replyToTopId","header","channelFull","appProfileManager","chatsFull","linked_chat_id","comments","replies_pts","isAnonymousSending","post","originalMessage","fwdHeader","from_name","channel_post","saved_from_msg_id","saved_from_peer","Number","MAX_SAFE_INTEGER","admin_rights","anonymous","chatHistoryStorage","offset_date","offset_id","offset_peer","offsetPeerId","noErrorBox","resetPinnedOrder","telegramMeWebManager","setAuthorized","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","folderDialogs","dialogsLength","slicedDialogs","fromPeerId","dropCaptions","dropAuthor","newMessages","generateForwardHeader","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","createMessageStorage","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","fullfillLeft","just_clear","revoke","affectedHistory","doFlushHistory","justClear","getHistory","historyResult","getChannelInput","s","m","ss","getPinnedMessage","getSearch","inputFilter","unpin","pm_oneside","unpinAll","unpinAllMessages","totalEntities","foundMessages","getMidsByAlbum","verify","isMessage","reply_to_mid","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","fwdFromId","mediaContext","ttl_seconds","messageKey","getMessageKeyForPendingWebPage","saveWebPage","migrateFrom","migrateTo","suffix","video_sizes","appGroupCallsManager","saveGroupCall","call","video","reason","migrateChecks","saveMessage","apiEntities","fixEmoji","myEntities","parseEntities","mergeEntities","usingMids","plain","highlightWord","withoutMediaType","parts","hasAlbumKey","addPart","langKey","part","el","createElement","innerHTML","append","assumeType","usingFullAlbum","getMidsByMessage","albumText","getAlbumText","emoticon","wrapEmojiText","question","rReply","game","stickerEmojiRaw","stickerEmoji","performer","actionWrapped","wrapMessageActionTextNew","wrapPlainText","match","found","regExp","RegExp","exec","sortEntities","messageWrapped","wrapRichText","noLinebreaks","noLinks","noTextFormat","htmlToDocumentFragment","fragment","createDocumentFragment","senderTitle","classList","fromMe","getMessageSenderPeerIdOrName","element","peerTitle","fromName","onclick","wrapUrl","href","setAttribute","unsafeMessage","langPackKey","getNameDivHTML","getPeerTitle","formatCallDuration","endsWith","wrapJoinVoiceChatAnchor","daysToStart","tomorrowDate","setDate","k","_args","IntlDateElement","day","month","year","t","pinnedMessage","fetchMessageReplyTo","isMessageIsTopMessage","dataset","dir","wrapMessageForReply","htmlToSpan","joined","anchorHTML","domain","langPack","wrapMessageActionTextNewUnsafe","botId","startParam","start_param","inviteToChannel","addChatUser","str","toggleDialogPin","pinned_dialogs_count_max","getPinnedOrders","getDialogPeer","read","hasChat","fromChat","kind","goodMedias","sticker","canMessageBeEdited","edit_time_limit","hasRights","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","hidden","canCache","func","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","filterMessagesByInputFilter","next_rate","offset_id_offset","method","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","getDiscussionMessage","maxMessageId","serviceStartMessage","is_single","msg_id","filterMessages","generateThreadServiceStartMessage","newDialogsHandlePromise","localMessageIds","creator","delete_messages","affectedMessages","force","triedToReadMaxId","readPromise","soundReset","getPeerString","readHistory","slicedArray","Top","fixUnreadMentionsCountIfNeeded","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","msgIds","threadMessage","broadcastEventName","finalizePendingMessage","mute","mute_until","canSendToUser","finalMessage","tempMessage","newPhoto","newDoc","newPhotoSize","oldCacheContext","downloadOptions","getPhotoDownloadOptions","fakeDownload","getInputFileName","polls","handleReleasingMessage","increment","notification","peerString","notificationMessage","show_previews","tag","peerPhoto","getPeerPhoto","appAvatarsManager","loadAvatar","loadPromise","image","notify","canSendToPeer","isFetchIntervalNeeded","unsetEnd","haveSlice","sliceMe","fulfilled","Both","fillHistoryStorage","constructSlice","offsetIdOffset","topWasMeantToLoad","isBottomEnd","isHistoryResultEnd","requestHistory","oldestMessage","foundSlice","_historyResult","requestPromises","after","getMessagesResult","fetchSingleMessages","replyToPeerId","reply_to_peer_id","typing","timeout","smth","referenceDatabase","deleteContext","deleteWebPageFromPending","updatePollToMessage","groupedId","groupedStorage","albums","peerMessagesToHandle","deletedMids","noforwards","noForwards","DialogColorsFg","DialogColors","DialogColorsMap","newMethod","originMethod","String","prototype","getUserPhoto","getChatPhoto","plainText","onlyFirstName","getUserString","getChatString","isPeerId","charAt","peerParams","substr","isMegagroup","ignorePeerId","getInputPeer","getUserInputPeer","pic","abs","getDialogType","getChatTyped","onChatUpdated","updateChannelParticipant","updateChatDefaultBannedRights","default_banned_rights","apiChats","saveApiChat","oldChat","participants_count","rights","defaultRights","isThread","isCheckingRightsForSelf","megagroup","banned_rights","myFlags","post_messages","broadcast","until_date","getChannelInputPeer","getChatInputPeer","input","usersInputs","fwdLimit","fwd_limit","deleteChatUser","leaveChannel","leaveChat","deleteChannel","deleteChat","inputChatPhoto","about","participant","getParticipantPeerId","actor_id","qts","prev_participant","new_participant","kicked_by","editBanned","view_messages","kickFromChannel","messagesChats","enabled","migrateChat","weakMap","WeakMap","peerTitleWeakMap","querySelectorAll","PeerTitle","AppPhotosManager","photos","context","oldPhoto","saveContext","boxWidth","boxHeight","useBytes","pushDocumentSize","devicePixelRatio","bestPhotoSize","inputUser","photosResult","photoIds","bytes","isSticker","arr","mimeType","Uint8Array","jpegHeader","jpegTail","URL","createObjectURL","path","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","fullHeight","download","getDownload","getInput","fullPhotoSize","downloadToDisc","bytesToHex","bytesFromHex","hexString","len","ceil","start","parseInt","bytesToBase64","mod3","nLen","nUint24","nIdx","fromCharCode","uint6ToBase64","replace","nUint6","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","reduce","acc","v","byteLength","tmp","lastLength","ArrayBuffer","bytesFromWordss","bytesToWordss","words","Uint32Array","LOCAL_IDS_SET","appStickersManager","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","updateNewStickerSet","stickerSet","stickerset","saveStickerSet","getGreetingStickersTimeout","getGreetingSticker","justPreload","getGreetingStickersPromise","getStickersByEmoticon","docs","greetingStickers","shift","downloadDoc","cachedSet","documents","refreshTime","useCache","saveStickers","getStickerSetInput","saveById","getStickerSet","getAnimatedEmojiSounds","emoji","animations","getAnimatedEmojiSoundsPromise","getAppConfig","appConfig","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","invokeApiHashable","processResult","res","stickers","isAnimation","cleanEmoji","pack","packs","preloadEmojiPromise","getAnimatedEmojiSticker","json","mediaSize","active","emojiSticker","toneIndex","animation","loadAnimationWorker","container","animationData","autoplay","loop","saveLottiePreview","canvas","once","preloadAnimatedEmojiStickerAnimation","soundDoc","getAnimatedEmojiSoundDocument","newSet","setToCache","needSave","installed_date","thumb_dc_id","isAnimated","animated","thumb_version","short_name","sets","covered","archived","excludeFeatured","exclude_featured","foundSaved","cache","cover","getAllStickers","allStickers","includeOurStickers","preloadStickerSets","getRecentStickers","messagesStickers","installedSets","recentStickers","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","docId","docEmoticon","_doc","AppProfileManager","usersFull","onUpdateUserTyping","typingsInPeer","cancelAction","getChatFull","onUpdatePeerBlocked","userFull","updateChatParticipants","participants","chatFull","updateChatParticipantAdd","_participants","inviter_id","version","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","chat_photo","refreshFullPeer","invalidateChannelParticipants","invokeApiSingleProcess","usersUserFull","full_user","profile_photo","rAbout","getProfile","getCachedFullUser","getCachedFullChat","getProfileByPeerId","profile","getChannelFull","full_chat","exported_invite","link","exportedInvite","channelParticipant","fullChannel","processError","getChannelParticipants","cP","getTopPeers","ratingMap","processUserIds","updateResult","previous","deletedList","verifyParticipantForOnlineCount","chatInfo","channelParticipants","reduceParticipantsForOnlineCount","onlines","pendingPtsUpdates","pendingSeqUpdates","syncPending","channelStates","attached","debug","processOpts","seqStart","seq_start","forceGetDifference","processUpdate","toId","Proxy","target","saveUpdatesState","us","nextSeq","pendingUpdatesData","popPendingSeqUpdate","seqAwaiting","ptsAwaiting","curState","curPts","goodPts","goodIndex","getDifference","wasSyncing","pts_total_limit","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","justAName","channelState","getChannelDifference","lastPtsUpdateTime","popPts","popSeq","popPendingPtsUpdate","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","EXTENSION_MIME_TYPE_MAP","mov","gif","pdf","savingLottiePreview","downloading","onServiceWorkerFail","supportsStreaming","oldDoc","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","preloadPhoto","tryNotToUseBytes","getThumbURL","originalPromise","isPlaySupported","reader","FileReader","onloadend","uint8","decode","readAsArrayBuffer","stickerCachedThumbs","toBlob","createDownloadAnchor","addTaskListener","task","payload","VisibilityIntersector","onVisibilityChange","items","locked","observer","IntersectionObserver","entries","changed","entry","isIntersecting","visible","getVisible","disconnect","targets","observe","unobserve","unlock","refresh","parallelLimit","queue","inProcess","lockPromise","unlockResolve","processQueue","throttle","_processQueue","item","loadItem","getItem","processItem","addElement","super","lock","intersector","unlockAndRefresh","div","intersectorTimeout","wasSeen","setProcessQueueTimeout","_queue","spliced","prefixes","maxPrefixLength","setPrefix","country","prefix","country_code","originalStr","countriesList","country_codes","prefixCountry","phoneCode","leftPattern","patterns","searchForPattern","pattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","x","html","span","isObject","object","intToUint","val","longFromInts","high","low","bigInt","sortLongsArray","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","randomize","buffer","windowSize","visualViewport","innerWidth","innerHeight","AppMessagesIdsManager","tempNum","temp","MESSAGE_ID_OFFSET","MESSAGE_ID_INCREMENT","clearMessageId","toServer","l","used","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","faviconEl","head","querySelector","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","volume","novibrate","nopreview","nopush","needPush","isAvailable","registeredDevice","subscribe","unsubscribe","setSettings","nosound","notifications","requestPermission","Notification","removeEventListener","navigator","vibrate","mozVibrate","webkitVibrate","notificationsUiSupport","topMessagesDeferred","notifySoundEl","body","stop","newVal","toggleToggler","tokenData","unregisterDevice","registerDevice","notificationData","period","custom","enable","resetTitle","setFavicon","clearInterval","titleInterval","getContext","beginPath","arc","PI","fillStyle","fill","fontSize","font","textBaseline","textAlign","fillText","toDataURL","getNotifyPeerTypePromise","inputKey","compare_sound","notifyContactsSignUp","prevFavicon","cloneNode","parentNode","replaceChild","peerNotifySettings","isMuted","respectType","n","notifySettings","inputNotify","typeNotifySettings","getPeerLocalSettings","permission","data","testSound","icon","setLocalNotificationsDisabled","close","focus","onclose","show","hide","nextSoundAt","prevSoundVolume","filename","audio","hidePushNotifications","token_type","tokenType","token","tokenValue","other_uids","app_sandbox","secret","loadedURLs","elem","HTMLImageElement","HTMLVideoElement","src","SVGImageElement","setAttributeNS","backgroundImage","renderImageFromUrl","isImage","loader","renderImageFromUrlPromise","fixBase64String","toUrl","ProgressivePreloader","detached","cancelable","streamable","onClick","contains","loadFunc","color","bold","constructContainer","construct","totalLength","downloadSvg","lastElementChild","cancelSvg","previousElementSibling","circle","firstElementChild","setProgress","startTime","onEnd","elapsedTime","delay","TRANSITION_TIME","detach","attach","parentElement","setManual","reset","useRafs","getTotalLength","strokeDasharray","createPosterFromMedia","videoWidth","videoHeight","naturalWidth","naturalHeight","quality","aspectFitted","drawImage","createPosterFromVideo","onseeked","currentTime","onerror","createPosterForVideo","preloadVideo","race","onMediaLoad","readyState","HAVE_METADATA","useCanplayOnIos","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","clipboardData","originalEvent","webkitGetAsEntry","requestFile","accept","display","click","radix","bpe","mask","digitsStr","buff","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","z","expand","ans","copy_","mod","dup","mod_","mult","y","copyInt_","linCombShift_","mult_","powMod","powMod_","pow","sub","sub_","add_","eGCD_","g","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","r","y1","y2","subShift_","addShift_","rightShift_","modInt","bits","minSize","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","stripped_thumb","childElementCount","mutateElement","renderPromise","isDialog","getPeerColorById","avatarAvailable","avatarRendered","abbr","getMiddleware","cleanupObj","cleaned","additionalCallback","_cleanupObj","GROUP_CALL_STATE","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","testQueue","fontFamily","timeoutId","setTestQueue","cancelAnimationFrame","requestAnimationFrame","testQueueElements","testElement","capture","passive","mapped","firstTime","textLength","multiplier","textWidth","elementWidth","textContent","fontWeight","getTextWidth","getBoundingClientRect","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","half2","removeAttribute","measureText","MiddleEllipsisElement","HTMLElement","customElements","define","drafts","getAllDraftPromise","updateDraftMessage","peerID","getKey","getAllDrafts","apiDraft","processApiDraft","draft1","draft2","rMessage","wrapDraftText","localDraft","saveOnServer","serverDraft","getDraft","draftsAreEqual","draftObj","isEmptyDraft","saveLocalDraft","combined","emptyDraft","syncDraft","AudioAssetPlayer","assets","createAudio","play","Audio","pause","playSound","makeSsrcsFromParticipant","makeSsrcFromParticipant","source","audio_source","source_groups","endpoint","presentation","groupCalls","nextOffsets","updateGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","currentGroupCall","hangUp","audioAsset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","skipCounterUpdating","getCachedParticipants","oldParticipant","hasLeft","muted","can_self_unmute","isCurrentGroupCall","onParticipantUpdate","doNotDispatchParticipantUpdate","getGroupCall","modified","just_joined","apiParticipants","saveApiParticipant","isUpdatingMeInCurrentCall","isSharingAudio","raiseHand","raise_hand_rating","videoStopped","generateSelfVideo","connections","main","sources","setMuted","getGroupCallInput","getInputPeerSelf","raise_hand","video_paused","videoPaused","video_stopped","presentation_paused","presentationPaused","participants_next_offset","oldCall","shouldUpdate","stopConnectingSound","playSoundWithTimeout","stopSound","cancelDelayedPlay","rejoin","joinVideo","streamManager","constraints","getAudioConstraints","getVideoConstraints","stream","getStream","addStream","inputStream","MediaStream","createMainStreamManager","joinGroupCallInternal","bindPrefix","fixSafariAudio","CLOSED","setCurrentGroupCall","getGroupCallFull","connectionInstance","createConnectionInstance","connection","createPeerConnection","negotiate","event","onTrack","iceConnectionState","startConnectingSound","getGroupCallParticipants","values","createDescription","createDataChannel","appendStreamToConference","handleUpdateGroupCallParticipants","updatingSdp","audioSource","sourceGroups","mainSources","presentationSources","tsNow","prepareToSavingNextOffset","ids","groupCallParticipants","next_offset","discard","changeUserMuted","getParticipantByPeerId","editParticipant","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","LatinizeMap","hasTag","processSearchText","SliceEnd","SlicedArray","sliceConstructor","getSliceConstructor","slices","end","None","side","deleteCount","flatten","lowerBound","upperBound","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","prevSlice","nextSlice","sliceOffset","findSliceOffset","sliceStart","sliceEnd","bottomWasMeantToLoad","topFulfilled","bottomFulfilled","updateMessagePoll","poll_id","saveResults","rQuestion","chosenIndexes","answer","chosen","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","optionIds","answers","option","sendVote","votesList","closed","newPoll","getInputMediaPoll","toTelegramSource","fromTelegramSource","getAmplitude","array","scale","rms","sqrt","ConferenceEntry","port","direction","originalDirection","setDirection","transceiver","addTransceiver","isAnswer","generateSsrc","LocalConferenceDescription","sessionId","entriesByMid","entriesBySource","entriesByPeerId","setSource","setPeerId","isSending","sendEntry","recvEntry","createEntry","fromConference","conference","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","apply","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","contexts","links","originalPayload","refreshReference","postMessage","reference","getContexts","_context","getReferenceByLink","next","refreshEmojiesSoundsPromise","hex","newHex","newContext","template","content","ConnectionStatus","mediaDevices","getUserMedia","getTracks","frameRate","AudioStreamAnalyser","streamSource","createMediaStreamSource","analyser","createAnalyser","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","fftSize","connect","StreamManager","interval","streamAnalyser","track","frequencyBinCount","getByteFrequencyData","analyse","counter","amplitudes","AudioContext","webkitAudioContext","outputStream","canCreateConferenceEntry","addTrack","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","oldTrack","timer","lol","transceiverInit","streams","types","tracks","findEntry","createTransceiver","sender","replaceTrack","IS_VIBRATE_SUPPORTED","opusDecodeController","sampleRate","tasks","keepAlive","isPlaySupportedResult","canPlayType","wavWorker","Worker","page","onTaskEnd","worker","command","buffers","typedArray","loadWorker","loadWavWorker","terminateWorkers","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","dataBlob","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","stopTrack","subtle","crypto","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","encryptedBytes","encrypt","aesDecryptSync","decryptedBytes","decrypt","rsaEncrypt","publicKey","N","modulus","E","exponent","X","encryptedBigInt","hash_pbkdf2","salt","importKey","deriveBits","pqPrimeFactorization","pqBytes","lim","P","Q","minLen","it","pqPrimeLeemon","bytesModPow","xBigInt","yBigInt","mBigInt","resBigInt","gzipUncompress","inflate","boolFalse","API","constructors","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","Int32Array","byteView","resultBuffer","resultInt32","subarray","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","checkLength","writeInt","iHigh","iLow","sLong","storeLongP","storeIntBytes","storeRawBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","methodData","methods","storeInt","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","schema","isBare","constructorData","readInt","doubleView","longDec","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","kHash","k_v","is_good_mod_exp_first","modexp","prime","a_for_hash","secure_random","A","generate_and_check_random","g_b","ux","a_ux","S","K","h1","h2","M1","srp_id","webWorker","taskId","awaiting","utils","timeManager","lastMessageId","timeOffset","sessionStorage","timeTicks","serverTime","localTime","newTimeOffset","server_time_offset","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","Obfuscation","codec","initPayload","val2","reversedPayload","encKey","encIv","decKey","decIv","encNew","decNew","obfuscateTag","Connection","logSuffix","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","readPacket","parseResponse","response","processMessage","onClose","needTimeout","retryAt","time","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","Connecting","bodySent","logTypes","setTransportClosed","setAutoReconnect","toEncode","encodePacket","socketId","socketsProxied","TEST_SUFFIX","test","sslSubdomains","dcOptions","host","chosenServers","transportSocket","connectionType","chosenServer","oooohLetMeLive","transportHTTP","ssl","http","dcOption","transportType","transport","reuse","client","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","baseDcId","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","mode","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingId","storeMethod","ping_id","pingMessage","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","userAgent","platform","isMainDomain","language","resultType","isAPI","oldTransport","removeTransport","nextReqTimeout","longPollInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","pushResend","shouldResolve","noSchedule","TimedOut","noop","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","messageByteLength","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","messageBodyLength","messageBody","mt_message","seqno","stack","setOffset","mt_rpc_result","newServerSalt","bigIntBytes","longToBytes","cb","performScheduledRequest","notEmpty","rawError","error_message","error_code","msg","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","networkerFactory","networkers","langPackCode","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","foundKey","fingerprint","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_two","_twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","iterateNetworkers","info","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","ignoreErrors","closeDatabases","maxNetworkers","generateNetworkerGetKey","ak","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","removeNetworker","prepareTempMessageId","cachedNetworker","rejectPromise","logOut","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","stopTime","waitTime","floodMaxTimeout","getScreenStream","getDisplayMedia","getStreamCached","_cache","screen","isScreen","player","elements","hasInputTrackKind","requestInputSource","isAudioGood","isVideoGood","isSharingVideo","getVideoTracks","saveInputVideoStream","onInputStream","cleanup","tryAddTrack","isOutput","tagName","isVideo","elementEndpoint","useStream","paused","srcObject","sinkId","outputDeviceId","setSinkId","appendChild","getAudioTracks","isClosing","appendToConference","SDP","session","mediaSections","lines","line","parsed","section","splitStringByLimitWithRest","separator","UniqueNumberGenerator","maxTries","SDPAttributeSplitted","SDPMediaLineParts","protocol","missed","rest","nestedMap","makeAttributes","innerParts","fillAttributes","attributesMap","linesArray","mediaLineParts","exists","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","parseMediaSectionInfo","sdp","clientInfo","lookupAttributeKeys","setup","ssrc","telegramSourceGroups","sdpLines","semantics","parseSourceGroups","raw","ufrag","pwd","fixLocalOffer","offer","hasMunged","skipAddingMulticast","generator","mediaType","originalSsrcs","ssrcs","generate","ssrcs2","ssrcsStrLines","ssrc2","addSimulcast","mediaLine","localMLine","codecIds","sectionInfo","newData","candidates","setPort","newChannel","addSsrcEntry","mungedSdp","RTCPeerConnection","signalingState","connectionState","dict","dataChannel","stopStream","closeConnection","negotiating","negotiateInternal","JSON","stringify","negotiateThrottled","iceServers","iceTransportPolicy","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","localSdp","mainChannels","processedChannels","processed","processMediaSection","audioChannel","videoChannel","useChannel","channels","setEntrySource","setEntryPeerId","parse","groupCallInput","join_as","setData","extmap","performExtmap","uri","filterServerCodecs","isNewConnection","getEntryByMid","originalOffer","createOffer","iceRestart","setLocalDescription","invokeJoinGroupCall","entriesToDelete","bundle","shouldBeSkipped","answerDescription","generateSdp","deleteEntry","iceGatheringState","setRemoteDescription","updateConstraints","colibriClass","defaultConstraints","maxHeight","onStageEndpoints","minHeight","sendDataChannelData","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","pinnedSource","MUTED","UNMUTED","MUTED_BY_ADMIN","CONNECTING","requestAudioSource","toggleMuted","getElement","clone","raise","stopScreenSharing","addInputVideoStream","startScreenSharingPromise","startScreenSharingInternal","unpinSource","closeConnectionAndStream","isSharingScreen","startScreenSharing","startVideoSharingPromise","startVideoSharingInternal","stopVideoSharing","startVideoSharing","isDiscarded","getEntryBySource","oldSsrcs","pinSource","modifiedTypes","oldSsrc","oldSource","oldEntry","setEndpoint","CALL_DURATION_LANG_KEYS","showLast","formatDuration","strings","VIDEO_MIME_TYPES_SUPPORTED","channelCount","constraint","getSupportedConstraints","constraintSupported","WEBRTC_MEDIA_PORT","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","joiner","newLine","strs","foundation","component","toUpperCase","priority","ip","generation","performCandidate","sId","bundleMids","skipCandidates","candidate","addCandidate","streamName","addSource","addMsid","ssrcGroup","isApplication","isInactive","payloadTypes","addTransport","hdrexts","hdrext","clockrate","parameters","fbs","fb","subtype","addSsrc","addHeader","addConference"],"mappings":"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","file":"5.4c631eb421e5df7ab421.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport default function cleanUsername(username: string) {\r\n return username && username.toLowerCase() || '';\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { filterUnique, indexOfAndSplice } from \"../../helpers/array\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport cleanSearchText from \"../../helpers/cleanSearchText\";\nimport cleanUsername from \"../../helpers/cleanUsername\";\nimport { formatFullSentTimeRaw, tsNow } from \"../../helpers/date\";\nimport { formatPhoneNumber } from \"../../helpers/formatPhoneNumber\";\nimport { safeReplaceObject, isObject } from \"../../helpers/object\";\nimport { Chat, InputContact, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus, InputGeoPoint } from \"../../layer\";\nimport I18n, { i18n, LangPackKey } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager {\n private storage = appStateManager.storages.users;\n \n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: UserId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n \n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n constructor() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n rootScope.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= serverTimeManager.serverTimeOffset;\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } //////else console.warn('No user by id:', userId);\n },\n\n updateUserPhoto: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto).photo_id) {\n return;\n }\n\n this.forceUserOnline(userId, update.date);\n\n if(update.photo._ === 'userProfilePhotoEmpty') {\n delete user.photo;\n } else {\n user.photo = safeReplaceObject(user.photo, update.photo);\n }\n\n this.setUserToStateIfNeeded(user);\n\n rootScope.dispatchEvent('user_update', userId);\n rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n } else console.warn('No user by id:', userId);\n },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n \n this.saveApiUser(Object.assign({}, user, {\n first_name: update.first_name,\n last_name: update.last_name,\n username: update.username\n }), true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n appStateManager.getState().then((state) => {\n const users = appStateManager.storagesResults.users;\n if(users.length) {\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(user) {\n this.users[user.id] = user;\n this.setUserNameToCache(user);\n }\n }\n }\n\n const contactsList = state.contactsList;\n if(contactsList && Array.isArray(contactsList)) {\n contactsList.forEach(userId => {\n this.pushContact(userId);\n });\n\n if(contactsList.length) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n \n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(!appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const users = appStateManager.storagesResults.users;\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!appStateManager.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n if(user.username) {\n delete this.usernames[cleanUsername(user.username)];\n }\n\n users.findAndSplice((user) => user.id === userId);\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n \n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n }\n\n private onContactsModified() {\n const contactsList = [...this.contactsList];\n appStateManager.pushToState('contactsList', contactsList);\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n \n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified();\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise || (this.contactsFillPromise = promise)\n };\n }\n\n public resolveUsername(username: string): Promise {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n if(this.usernames[username]) {\n return Promise.resolve(this.users[this.usernames[username]]);\n }\n\n return apiManager.invokeApi('contacts.resolveUsername', {username}).then(resolvedPeer => {\n this.saveApiUsers(resolvedPeer.users);\n appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return appPeersManager.getPeer(appPeersManager.getPeerId(resolvedPeer.peer));\n });\n }\n\n public pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n appStateManager.requestPeerSingle(id.toPeerId(), 'contact');\n }\n\n public popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n appStateManager.releaseSinglePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n user.username,\n user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then(_contactsList => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter(id => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId1).status);\n const status2 = appUsersManager.getUserStatusForSort(appUsersManager.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = rootScope.myId.toUserId();\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0], \n includeSaved?: Parameters[1], \n sortBy?: Parameters[2]) {\n return this.getContacts(query, includeSaved, sortBy).then(userIds => {\n return userIds.map(userId => userId.toPeerId(false));\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: appPeersManager.getInputPeerById(peerId)\n }).then(value => {\n if(value) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n private setUserNameToCache(user: MTUser.user, oldUser?: MTUser.user) {\n if(!oldUser || oldUser.username !== user.username) {\n if(oldUser?.username) {\n const oldSearchUsername = cleanUsername(oldUser.username);\n delete this.usernames[oldSearchUsername];\n }\n\n if(user.username) {\n const searchUsername = cleanUsername(user.username);\n this.usernames[searchUsername] = user.id;\n }\n }\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n if(user.pFlags === undefined) {\n user.pFlags = {};\n }\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n this.setUserNameToCache(user, oldUser);\n\n if(!oldUser \n || oldUser.initials === undefined \n || oldUser.sortName === undefined \n || oldUser.first_name !== user.first_name \n || oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false); \n user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= serverTimeManager.serverTimeOffset;\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= serverTimeManager.serverTimeOffset;\n }\n }\n\n //user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n let changedPhoto = false, changedTitle = false;\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n if(user.first_name !== oldUser.first_name \n || user.last_name !== oldUser.last_name \n || user.username !== oldUser.username) {\n changedTitle = true;\n }\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n \n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n }\n\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', user.id.toPeerId());\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', user.id.toPeerId());\n }\n\n this.setUserToStateIfNeeded(user);\n }\n\n public setUserToStateIfNeeded(user: User) {\n if(appStateManager.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n status = this.getUser(status).status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id] || {id, pFlags: {deleted: true}, access_hash: ''} as User;\n }\n\n public getSelf() {\n return this.getUser(rootScope.myId);\n }\n\n public getUserStatusString(id: UserId): HTMLElement {\n let key: LangPackKey;\n let args: any[];\n\n switch(id) {\n case REPLIES_PEER_ID:\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID:\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(this.isBot(id)) {\n key = 'Bot';\n break;\n }\n\n const user = this.getUser(id);\n if(!user) {\n key = '' as any;\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n \n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n \n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n \n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n \n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n \n break;\n }\n \n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n \n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n \n return i18n(key, args);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n \n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id.toPeerId() !== rootScope.myId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public canSendToUser(id: UserId) {\n const user = this.getUser(id);\n return !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID;\n }\n\n public getUserPhoto(id: UserId) {\n const user = this.getUser(id);\n\n return user && user.photo || {\n _: 'userProfilePhotoEmpty'\n };\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputPeerSelf'};\n }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n public updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n public updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user &&\n user.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n \n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then(userIds => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n //console.log(result);\n this.saveApiUsers(result.users);\n appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = appPeersManager.getPeerId(topPeer.peer);\n appStateManager.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n \n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n appStateManager.pushToState('topPeersCache', state.topPeersCache);\n \n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then(contactsBlocked => {\n this.saveApiUsers(contactsBlocked.users);\n appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map(u => u.id.toPeerId()).concat(contactsBlocked.chats.map(c => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number, \n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return apiManager.invokeApi('contacts.getLocated', {\n geo_point, \n background\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then(results => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map(p => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map(p => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n return apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then(peers => {\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map(p => appPeersManager.getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map(p => appPeersManager.getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n //user.sortStatus = this.getUserStatusForSort(user.status);\n rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, showPhone?: true) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: showPhone\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map(userId => this.getUserInput(userId))\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach(userId => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n}\n\nconst appUsersManager = new AppUsersManager();\nMOUNT_CLASS_TO.appUsersManager = appUsersManager;\nexport default appUsersManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { Chat, DialogPeer, Message, MessagesPeerDialogs, Update } from \"../../layer\";\nimport type { AppChatsManager } from \"../appManagers/appChatsManager\";\nimport type { AppMessagesManager, Dialog, MyMessage } from \"../appManagers/appMessagesManager\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\nimport type { AppDraftsManager } from \"../appManagers/appDraftsManager\";\nimport type { AppNotificationsManager } from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport type { ServerTimeManager } from \"../mtproto/serverTimeManager\";\nimport type { AppMessagesIdsManager } from \"../appManagers/appMessagesIdsManager\";\nimport { tsNow } from \"../../helpers/date\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport SearchIndex from \"../searchIndex\";\nimport { forEachReverse, indexOfAndSplice, insertInDescendSortedArray } from \"../../helpers/array\";\nimport rootScope from \"../rootScope\";\nimport { defineNotNumerableProperties, safeReplaceObject } from \"../../helpers/object\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport { SliceEnd } from \"../../helpers/slicedArray\";\nimport { MyDialogFilter } from \"./filters\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport { NoneToVoidFunction } from \"../../types\";\nimport ctx from \"../../environment/ctx\";\nimport AppStorage from \"../storage\";\nimport type DATABASE_STATE from \"../../config/databases/state\";\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: Dialog[],\n id: number,\n unreadMessagesCount: number,\n unreadDialogsCount: number,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: number = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage {\n private storage: AppStateManager['storages']['dialogs'];\n \n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder} = {};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n constructor(\n private appMessagesManager: AppMessagesManager, \n private appChatsManager: AppChatsManager, \n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager,\n private appDraftsManager: AppDraftsManager,\n private appNotificationsManager: AppNotificationsManager,\n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager,\n private serverTimeManager: ServerTimeManager,\n private appMessagesIdsManager: AppMessagesIdsManager\n ) {\n this.storage = this.appStateManager.storages.dialogs;\n this.dialogs = this.storage.getCache();\n this.clear(true);\n\n rootScope.addEventListener('language_change', () => {\n const peerId = appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n for(let i = 0; i <= 10; ++i) {\n const indexKey = `index_${i}` as ReturnType;\n dialog[indexKey] = undefined;\n }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n rootScope.addEventListener('filter_update', onFilterUpdate);\n rootScope.addEventListener('filter_new', onFilterUpdate);\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = `index_${filter.orderIndex}` as const;\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const chat: Chat.chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if(chat.pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n });\n\n appStateManager.getState().then((state) => {\n this.pinnedOrders = state.pinnedOrders || {};\n if(!this.pinnedOrders[0]) this.pinnedOrders[0] = [];\n if(!this.pinnedOrders[1]) this.pinnedOrders[1] = [];\n \n const dialogs = appStateManager.storagesResults.dialogs;\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(dialog) {\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = this.appMessagesIdsManager.getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 10; ++i) {\n // @ts-ignore\n delete dialog[`index_${i}`];\n }\n\n this.saveDialog(dialog, undefined, true);\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(message.deleted) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[0] = loaded;\n this.allDialogsLoaded[1] = loaded;\n } else {\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(this.allDialogsLoaded[0] && this.allDialogsLoaded[1]) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear(init = false) {\n this.pinnedOrders = {\n 0: [],\n 1: []\n };\n\n if(!init) {\n const dialogs = this.appStateManager.storagesResults.dialogs;\n dialogs.length = 0;\n this.storage.clear();\n\n this.setDialogsLoaded(0, false);\n this.setDialogsLoaded(1, false);\n this.setDialogsLoaded(GLOBAL_FOLDER_ID, false);\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n }\n\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n }\n\n public handleDialogUnpinning(dialog: Dialog, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.pinnedOrders[folderId], dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.pinnedOrders[folderId] = [];\n }\n\n public getPinnedOrders(folderId: number) {\n return this.pinnedOrders[folderId];\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(this.getOffsetDate(0), this.getOffsetDate(1));\n }\n\n return offsetDate;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ?? (this.folders[id] = {dialogs: [], id, unreadMessagesCount: 0, unreadDialogsCount: 0});\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Dialog[] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n return skipMigrated ? folder.dialogs.filter(dialog => dialog.migratedTo === undefined) : folder.dialogs;\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n return this.getFolderDialogs(0, skipMigrated).concat(this.getFolderDialogs(1, skipMigrated));\n }\n\n private setDialogIndexInFilter(dialog: Dialog, indexKey: ReturnType, filter: MyDialogFilter) {\n let index: number;\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIndex = filter.pinnedPeerIds.indexOf(dialog.peerId);\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(filter.pinned_peers.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned) {\n index = this.generateIndexForDialog(dialog, true);\n } else {\n index = dialog.index;\n }\n }\n\n return dialog[indexKey] = index;\n }\n\n public getDialog(peerId: PeerId, folderId?: number, skipMigrated = true): [Dialog, number] | [] {\n const folders: Dialog[][] = [];\n\n if(folderId === undefined) {\n folders.push(this.getFolder(0).dialogs, this.getFolder(1).dialogs);\n } else {\n folders.push(this.getFolderDialogs(folderId, false));\n }\n\n for(let folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(dialog.peerId === peerId) {\n return [dialog, i - skipped];\n } else if(skipMigrated && dialog.migratedTo !== undefined) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n if(date === undefined) {\n date = tsNow(true) + this.serverTimeManager.serverTimeOffset;\n }\n\n return (date * 0x10000) + (isPinned ? 0 : ((++this.dialogsNum) & 0xFFFF));\n }\n\n public processDialogForFilters(dialog: Dialog) {\n // let perf = performance.now();\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const indexKey = this.getDialogIndexKey(filter.id);\n const folder = this.getFolder(filter.id);\n const dialogs = folder.dialogs;\n\n const wasIndex = dialogs.findIndex(d => d.peerId === dialog.peerId);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = wasDialog && wasDialog[indexKey];\n\n const newDialogIndex = this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return;\n }\n\n if((!wasDialogIndex && newDialogIndex) || (wasIndex && !newDialogIndex)) {\n this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, indexKey, wasIndex);\n }\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog) {\n const callbacks: NoneToVoidFunction[] = [\n this.prepareFolderUnreadCountModifyingByDialog(dialog.folder_id, dialog)\n ];\n\n const filters = this.appMessagesManager.filtersStorage.filters;\n for(const id in filters) {\n const filter = filters[id];\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog));\n }\n }\n\n return () => callbacks.forEach(callback => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n \n if(toggle !== undefined) {\n this.modifyFolderUnreadCount(folderId, toggle ? wasUnreadCount : -wasUnreadCount, wasUnreadCount ? (toggle ? 1 : -1) : 0);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n const addDialogsCount = (newUnreadCount && !wasUnreadCount) || (!newUnreadCount && wasUnreadCount) ? (wasUnreadCount ? -1 : 1) : 0;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, addDialogsCount);\n };\n }\n\n public modifyFolderUnreadCount(folderId: number, addMessagesCount: number, addDialogsCount: number) {\n if(!addMessagesCount && !addDialogsCount) {\n return;\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n \n if(addDialogsCount) {\n folder.unreadDialogsCount = Math.max(0, folder.unreadDialogsCount + addDialogsCount);\n }\n\n if(folder.dispatchUnreadTimeout === undefined) {\n folder.dispatchUnreadTimeout = ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n rootScope.dispatchEvent('folder_unread', folder);\n }, 0);\n }\n }\n\n public generateIndexForDialog(dialog: Dialog, justReturn = false, message?: MyMessage) {\n let topDate = 0, isPinned: boolean;\n if(dialog.pFlags.pinned && !justReturn) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n if(!message) {\n message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n }\n \n topDate = (message as Message.message).date || topDate;\n\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel: Chat.channel = this.appChatsManager.getChat(channelId);\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n \n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n if(!topDate) {\n topDate = tsNow(true);\n }\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n dialog.index = index;\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog) {\n const order = this.pinnedOrders[dialog.folder_id];\n\n const foundIndex = order.indexOf(dialog.peerId);\n let pinnedIndex = foundIndex;\n if(foundIndex === -1) {\n pinnedIndex = order.push(dialog.peerId) - 1;\n this.savePinnedOrders();\n }\n\n return this.generateDialogPinnedDateByIndex(pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog) {\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(!message.pFlags.is_outgoing && !message.deleted/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n \n const fromId = message.viaBotId || message.fromId;\n if(fromId !== peerId) {\n this.appStateManager.requestPeerSingle(fromId, 'topMessage', peerId);\n }\n \n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.appStateManager.requestPeerSingle(peerId, 'dialog');\n\n /* for(let id in this.appMessagesManager.filtersStorage.filters) {\n const filter = this.appMessagesManager.filtersStorage.filters[id];\n\n if(this.appMessagesManager.filtersStorage.testDialogForFilter(dialog, filter)) {\n \n }\n } */\n }\n\n public pushDialog(dialog: Dialog, offsetDate?: number, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const {folder_id, peerId} = dialog;\n const dialogs = this.getFolderDialogs(folder_id, false);\n const pos = dialogs.findIndex(d => d.peerId === peerId);\n if(pos !== -1) {\n dialogs.splice(pos, 1);\n }\n \n //if(!this.dialogs[peerId]) {\n this.dialogs[peerId] = dialog;\n \n this.setDialogToState(dialog);\n //}\n\n if(offsetDate === undefined) {\n offsetDate = this.getDialogOffsetDate(dialog);\n }\n\n this.processDialogForFilters(dialog);\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const savedOffsetDate = this.dialogsOffsetDate[folder_id];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folder_id)) {\n this.clearDialogFromState(dialog, true);\n return;\n }\n \n this.dialogsOffsetDate[folder_id] = offsetDate;\n }\n }\n\n if(pos === -1) {\n this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n }\n\n /* const newPos = */insertInDescendSortedArray(dialogs, dialog, 'index', pos);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialog(peerId: PeerId): ReturnType {\n const foundDialog = this.getDialog(peerId, undefined, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n delete this.dialogs[peerId];\n\n const folder = this.getFolder(dialog.folder_id);\n folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.pinnedOrders[dialog.folder_id], peerId) !== undefined;\n \n this.processDialogForFilters(dialog);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n\n this.clearDialogFromState(dialog, false);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog, keepLocal: boolean) {\n const peerId = dialog.peerId;\n this.appStateManager.releaseSinglePeer(peerId, 'topMessage');\n this.appStateManager.releaseSinglePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId) {\n const dropped = this.dropDialog(peerId);\n if(dropped.length) {\n rootScope.dispatchEvent('dialog_drop', {peerId, dialog: dropped[0]});\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId) {\n this.dropDialogWithEvent(peerId);\n rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(dialogsResult.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n dialogsResult.dialogs.splice(idx, 1);\n }\n });\n\n this.appUsersManager.saveApiUsers(dialogsResult.users);\n this.appChatsManager.saveApiChats(dialogsResult.chats);\n this.appMessagesManager.saveMessages(dialogsResult.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMessage = dialog.top_message;\n\n const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMessage) {\n if(!topMessage \n || (this.appMessagesManager.getMessageByPeer(peerId, topPendingMessage) as MyMessage).date > (this.appMessagesManager.getMessageByPeer(peerId, topMessage) as MyMessage).date) {\n dialog.top_message = topMessage = topPendingMessage;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMessage;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMessage || (dialog.draft && dialog.draft._ === 'draftMessage')) {\n this.saveDialog(dialog);\n updatedDialogs[peerId] = dialog;\n } else {\n this.dropDialogWithEvent(peerId);\n }\n\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[peerId];\n }\n }\n });\n\n if(Object.keys(updatedDialogs).length) {\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n public getDialogOffsetDate(dialog: Dialog) {\n return this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message).date || 0;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? 0, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return;\n }\n\n if(dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n \n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\n return;\n }\n }\n\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n\n const wasDialogBefore = this.getDialogOnly(peerId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = this.appMessagesIdsManager.generateMessageId(dialog.top_message);//dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(!channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n //return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === this.appMessagesIdsManager.getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? wasDialogBefore.folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft(peerId, 0, dialog.draft);\n dialog.peerId = peerId;\n\n // Because we saved message without dialog present\n if(message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId, \n settings: dialog.notify_settings\n });\n\n if(channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n defineNotNumerableProperties(dialog, [\n 'index_0',\n 'index_1',\n 'index_2',\n 'index_3',\n 'index_4',\n 'index_5',\n 'index_6',\n 'index_7',\n 'index_8',\n 'index_9',\n 'index_10'\n ]);\n\n if(wasDialogBefore) {\n safeReplaceObject(wasDialogBefore, dialog);\n }\n\n this.pushDialog(dialog, message.date, ignoreOffsetDate, saveGlobalOffset);\n }\n\n public getDialogIndexKey(filterId: number) {\n const indexStr = filterId > 1 ? \n `index_${this.appMessagesManager.filtersStorage.getFilter(filterId).orderIndex}` as const : \n 'index' as const;\n\n return indexStr;\n }\n\n public getDialogs(query = '', offsetIndex?: number, limit = 20, folderId = 0, skipMigrated = false): {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } {\n const ret: {\n cached: boolean,\n promise: Promise<{\n dialogs: Dialog[],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }>\n } = {} as any;\n\n if(folderId > 1) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.appMessagesManager.filtersStorage.reloadMissingPeerIds(folderId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n ret.cached = false;\n ret.promise = Promise.all(promises).then(() => {\n return this.getDialogs(query, offsetIndex, limit, folderId, skipMigrated).promise;\n });\n\n return ret;\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId = folderId > 1 || this.getOffsetDate(folderId) ? GLOBAL_FOLDER_ID : folderId;\n let curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n\n const indexStr = this.getDialogIndexKey(folderId);\n\n if(query) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== folderId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = folderId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === folderId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => d2[indexStr] - d1[indexStr]);\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n ret.cached = true;\n ret.promise = Promise.resolve({\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n });\n\n return ret;\n }\n\n ret.cached = false;\n ret.promise = this.appMessagesManager.getTopMessages(limit, realFolderId).then(result => {\n //const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(folderId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > curDialogStorage[offset][indexStr]) {\n break;\n }\n }\n }\n\n //this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || curDialogStorage[0][indexStr] < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n\n return ret;\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n //this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n dialog.folder_id = folder_id;\n this.generateIndexForDialog(dialog);\n this.pushDialog(dialog); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? 0;\n //this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice(p => p === peerId);\n }\n } */\n\n if(dialog) {\n if(!update.pFlags.pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n } \n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? 0;\n \n const handleOrder = (order: PeerId[]) => {\n this.pinnedOrders[folderId].length = 0;\n order.reverse(); // index must be higher\n order.forEach((peerId) => {\n newPinned[peerId] = true;\n \n const dialog = this.getDialogOnly(peerId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n \n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n \n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n const peerId = dialog.peerId;\n if(!newPinned[peerId]) {\n this.appMessagesManager.scheduleHandleNewDialogs(peerId);\n }\n }\n };\n\n //this.log('updatePinnedDialogs', update);\n const newPinned: {[peerId: PeerId]: true} = {};\n if(!update.order) {\n apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n handleOrder(dialogsResult.dialogs.map(d => d.peerId));\n\n /* dialogsResult.dialogs.forEach((dialog) => {\n newPinned[dialog.peerId] = true;\n });\n\n this.dialogsStorage.getFolder(folderId).forEach((dialog) => {\n const peerId = dialog.peerId;\n if(dialog.pFlags.pinned && !newPinned[peerId]) {\n this.newDialogsToHandle[peerId] = {reload: true};\n this.scheduleHandleNewDialogs();\n }\n }); */\n });\n\n return;\n }\n\n //this.log('before order:', this.dialogsStorage[0].map(d => d.peerId));\n\n handleOrder(update.order.map(peer => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { copy, safeReplaceObject } from \"../../helpers/object\";\nimport type { DialogFilter, Update } from \"../../layer\";\nimport type { Modify } from \"../../types\";\nimport type { AppPeersManager } from \"../appManagers/appPeersManager\";\nimport type { AppUsersManager } from \"../appManagers/appUsersManager\";\n//import type { ApiManagerProxy } from \"../mtproto/mtprotoworker\";\nimport type _rootScope from \"../rootScope\";\nimport type {AppMessagesManager, Dialog} from '../appManagers/appMessagesManager';\nimport type {AppNotificationsManager} from \"../appManagers/appNotificationsManager\";\nimport type { ApiUpdatesManager } from \"../appManagers/apiUpdatesManager\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { forEachReverse } from \"../../helpers/array\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\n\nexport type MyDialogFilter = Modify;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'], \n ['exclude_peers', 'excludePeerIds'], \n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\n// ! because 0 index is 'All Chats'\nconst START_ORDER_INDEX = 1;\n\nexport default class FiltersStorage {\n public filters: {[filterId: string]: MyDialogFilter};\n private orderIndex: number;\n private reloadedPeerIds: Set;\n\n constructor(private appMessagesManager: AppMessagesManager,\n private appPeersManager: AppPeersManager, \n private appUsersManager: AppUsersManager, \n private appNotificationsManager: AppNotificationsManager, \n private appStateManager: AppStateManager,\n private apiUpdatesManager: ApiUpdatesManager, \n /* private apiManager: ApiManagerProxy, */ \n private rootScope: typeof _rootScope) {\n this.clear(true);\n this.filters = {};\n\n this.appStateManager.getState().then((state) => {\n safeReplaceObject(this.filters, state.filters);\n\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n if(filter.hasOwnProperty('orderIndex') && filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n\n /* this.appMessagesManager.dialogsStorage.folders[+filterId] = {\n dialogs: []\n }; */\n }\n });\n\n rootScope.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: (update) => {\n //console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then(filters => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find(filter => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map(filter => filter.id)});\n });\n },\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach(arr => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(this.appPeersManager.getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n }\n\n public clear(init = false) {\n if(!init) {\n safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n } else {\n this.filters = {};\n this.reloadedPeerIds = new Set();\n }\n\n this.orderIndex = START_ORDER_INDEX;\n }\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n //this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n //console.log('updateDialogFilterOrder', update);\n\n this.orderIndex = START_ORDER_INDEX;\n update.order.forEach((filterId, idx) => {\n const filter = this.filters[filterId];\n delete filter.orderIndex;\n this.setOrderIndex(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', update.order);\n\n this.appStateManager.pushToState('filters', this.filters);\n };\n\n public testDialogForFilter(dialog: Dialog, filter: MyDialogFilter) {\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && dialog.folder_id === 1) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted(peerId) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n \n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n \n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n \n if(!wasPinned) {\n if(filter.pinned_peers.length >= this.rootScope.config.pinned_infolder_count_max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n \n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n \n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map(i => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n //console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.orderIndex;\n f.push(filter);\n }\n\n filter.orderIndex = START_ORDER_INDEX;\n\n const order = f.sort((a, b) => a.orderIndex - b.orderIndex).map(filter => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length && !overwrite) {\n return keys.map(filterId => this.filters[filterId]).sort((a, b) => a.orderIndex - b.orderIndex);\n }\n\n const filters: MyDialogFilter[] = await apiManager.invokeApiSingle('messages.getDialogFilters') as any;\n for(const filter of filters) {\n this.saveDialogFilter(filter, overwrite);\n }\n\n //console.log(this.filters);\n return filters;\n }\n\n public saveDialogFilter(filter: MyDialogFilter, update = true) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n convertment.forEach(([from, to]) => {\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n \n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n \n this.setOrderIndex(filter);\n \n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n public setOrderIndex(filter: MyDialogFilter) {\n if(filter.hasOwnProperty('orderIndex')) {\n if(filter.orderIndex >= this.orderIndex) {\n this.orderIndex = filter.orderIndex + 1;\n }\n } else {\n filter.orderIndex = this.orderIndex++ as DialogFilter['orderIndex'];\n }\n\n this.appStateManager.pushToState('filters', this.filters);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { LazyLoadQueueBase } from \"../../components/lazyLoadQueue\";\nimport ProgressivePreloader from \"../../components/preloader\";\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\nimport { formatDateAccordingToTodayNew, formatTime, tsNow } from \"../../helpers/date\";\nimport { createPosterForVideo } from \"../../helpers/files\";\nimport { copy, getObjectKeysAndSort } from \"../../helpers/object\";\nimport { randomLong } from \"../../helpers/random\";\nimport { splitStringByLength, limitSymbols, escapeRegExp } from \"../../helpers/string\";\nimport { Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer } from \"../../layer\";\nimport { InvokeApiOptions } from \"../../types\";\nimport I18n, { FormatterArguments, i18n, join, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n } from \"../langPack\";\nimport { logger, LogTypes } from \"../logger\";\nimport type { ApiFileManager } from '../mtproto/apiFileManager';\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport DialogsStorage, { GLOBAL_FOLDER_ID } from \"../storages/dialogs\";\nimport FiltersStorage from \"../storages/filters\";\n//import { telegramMeWebService } from \"../mtproto/mtproto\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager, { ChatRights } from \"./appChatsManager\";\nimport appDocsManager, { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager, { MyPhoto } from \"./appPhotosManager\";\nimport appPollsManager from \"./appPollsManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport appWebPagesManager from \"./appWebPagesManager\";\nimport appDraftsManager, { MyDraftMessage } from \"./appDraftsManager\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport appProfileManager from \"./appProfileManager\";\nimport DEBUG, { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport SlicedArray, { Slice, SliceEnd } from \"../../helpers/slicedArray\";\nimport appNotificationsManager, { NotifyOptions } from \"./appNotificationsManager\";\nimport PeerTitle from \"../../components/peerTitle\";\nimport { forEachReverse, indexOfAndSplice } from \"../../helpers/array\";\nimport htmlToDocumentFragment from \"../../helpers/dom/htmlToDocumentFragment\";\nimport htmlToSpan from \"../../helpers/dom/htmlToSpan\";\nimport { MUTE_UNTIL, NULL_PEER_ID, REPLIES_PEER_ID, SERVICE_PEER_ID } from \"../mtproto/mtproto_config\";\nimport formatCallDuration from \"../../helpers/formatCallDuration\";\nimport appAvatarsManager from \"./appAvatarsManager\";\nimport telegramMeWebManager from \"../mtproto/telegramMeWebManager\";\nimport { getMiddleware } from \"../../helpers/middleware\";\nimport assumeType from \"../../helpers/assumeType\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport type { MediaSize } from \"../../helpers/mediaSizes\";\nimport IMAGE_MIME_TYPES_SUPPORTED from \"../../environment/imageMimeTypesSupport\";\nimport VIDEO_MIME_TYPES_SUPPORTED from \"../../environment/videoMimeTypesSupport\";\nimport './appGroupCallsManager';\nimport appGroupCallsManager from \"./appGroupCallsManager\";\n\n//console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: Slice,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty' \n | 'inputMessagesFilterPhotos' \n | 'inputMessagesFilterPhotoVideo' \n | 'inputMessagesFilterVideo' \n | 'inputMessagesFilterDocument' \n | 'inputMessagesFilterVoice' \n | 'inputMessagesFilterRoundVoice' \n | 'inputMessagesFilterRoundVideo' \n | 'inputMessagesFilterMusic' \n | 'inputMessagesFilterUrl' \n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\nexport class AppMessagesManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n public groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n public pinnedMessages: {[peerId: PeerId]: PinnedStorage};\n\n public threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage\n }\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise, \n callback: (message: any) => Promise\n }>\n }\n } = {};\n \n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise = null;\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newMessagesHandleTimeout = 0;\n private newMessagesToHandle: {[peerId: PeerId]: Set} = {};\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: {[peerId: PeerId]: Dialog} = {};\n public newUpdatesAfterReloadToHandle: {[peerId: PeerId]: Set} = {};\n\n private notificationsHandlePromise = 0;\n private notificationsToHandle: {[peerId: PeerId]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n public dialogsStorage: DialogsStorage;\n public filtersStorage: FiltersStorage;\n\n private groupedTempId = 0;\n\n private typings: {[peerId: PeerId]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[peerId: PeerId]: SlicedArray} = {};\n private goToNextMentionPromises: {[peerId: PeerId]: Promise} = {};\n\n constructor() {\n this.clear();\n\n rootScope.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages\n });\n\n // ! Invalidate notify settings, can optimize though\n rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: Dialog) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => dialog.peerId.isBroadcast();\n else filterFunc = (dialog) => appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach(dialog => {\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage', \n webpage: appWebPagesManager.getWebPage(id)\n };\n\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n });\n });\n\n rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n if(threadId) return;\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n if(!threadId) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !appMessagesIdsManager.getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog(dialog);\n }\n\n rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft,\n index: dialog.index\n });\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n rootScope.addEventListener('poll_update', ({poll}) => {\n const set = appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n });\n \n appStateManager.getState().then(state => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear() {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear();\n this.filtersStorage && this.filtersStorage.clear();\n }\n\n public construct() {\n this.filtersStorage = new FiltersStorage(this, appPeersManager, appUsersManager, appNotificationsManager, appStateManager, apiUpdatesManager, /* apiManager, */ rootScope);\n this.dialogsStorage = new DialogsStorage(this, appChatsManager, appPeersManager, appUsersManager, appDraftsManager, appNotificationsManager, appStateManager, apiUpdatesManager, serverTimeManager, appMessagesIdsManager);\n }\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: any) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ?? (this.tempFinalizeCallbacks[tempId] = {});\n const obj = finalize[callbackName] ?? (finalize[callbackName] = {deferred: deferredPromise()});\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n //this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n let entities = options.entities || [];\n if(text) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return apiManager.invokeApi('messages.editMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n \n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public sendText(peerId: PeerId, text: string, options: Partial<{\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n scheduleDate: number,\n silent: true\n }> = {}) {\n if(!text.trim()) {\n return Promise.resolve();\n }\n\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const MAX_LENGTH = rootScope.config.message_length_max;\n if(text.length > MAX_LENGTH) {\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n\n if(splitted.length > 1) {\n delete options.webPage;\n }\n\n for(let i = 1; i < splitted.length; ++i) {\n setTimeout(() => {\n this.sendText(peerId, splitted[i], options);\n }, i);\n }\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n let entities = options.entities || [];\n if(!options.viaBotId) {\n text = RichTextProcessor.parseMarkdown(text, entities);\n //entities = RichTextProcessor.mergeEntities(entities, RichTextProcessor.parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError(false);\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n //this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n //this.log('sendText sent', message.mid);\n //if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n //assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n // Testing bad situations\n // var upd = angular.copy(updates)\n // updates.updates.splice(0, 1)\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n // $timeout(function () {\n // ApiUpdatesManager.processUpdateMessage(upd)\n // }, 5000)\n message.promise.resolve();\n }, (error: any) => {\n toggleError(true);\n message.promise.reject(error);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n public sendFile(peerId: PeerId, file: File | Blob | MyDocument, options: Partial<{\n isRoundMessage: true,\n isVoiceMessage: true,\n isGroupedItem: true,\n isMedia: true,\n\n replyToMsgId: number,\n threadId: number,\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n duration: number,\n background: true,\n silent: true,\n clearDraft: true,\n scheduleDate: number,\n noSound: boolean,\n\n waveform: Uint8Array,\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n let attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n \n photo = appPhotosManager.savePhoto(photo);\n } else if(VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage,\n supports_streaming: true\n }, \n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound && \n file.size > (10 * 1024) && \n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n const cacheContext = appDownloadManager.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: 'full',\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = appDownloadManager.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n \n document = appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const preloader = isDocument ? undefined : new ProgressivePreloader({\n attachMethod: 'prepend',\n tryAgainOnFail: false,\n isUpload: true\n });\n\n const sentDeferred = deferredPromise();\n\n if(preloader) {\n preloader.attachPromise(sentDeferred);\n sentDeferred.cancel = () => {\n const error = new Error('Download canceled');\n error.name = 'AbortError';\n sentDeferred.reject(error);\n };\n\n sentDeferred.catch(err => {\n if(err.name === 'AbortError' && !uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n if(uploadPromise?.cancel) {\n uploadPromise.cancel();\n }\n }\n });\n }\n\n const media = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n preloader,\n photo,\n document,\n promise: sentDeferred\n };\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file \n } as MessageMedia.messageMediaDocument : media as any;\n\n const toggleError = (on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const {id, access_hash, file_reference} = file as MyDocument;\n\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id,\n access_hash,\n file_reference\n }\n };\n \n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n uploadPromise = appDownloadManager.upload(file);\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL) {\n thumbUploadPromise = new Promise((resolve, reject) => {\n const thumbPromise = options.thumb && options.thumb.blob ? Promise.resolve(options.thumb) : createPosterForVideo(options.objectURL);\n thumbPromise.then(thumb => {\n if(!thumb) {\n resolve(null);\n } else {\n appDownloadManager.upload(thumb.blob).then(resolve, reject);\n }\n }, reject);\n });\n }\n \n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n // @ts-ignore\n delete message.media.preloader;\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto', \n file: inputFile,\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument', \n file: inputFile, \n mime_type: fileType, \n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' ? true : undefined,\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n \n sentDeferred.resolve(inputMedia);\n }, (/* error */) => {\n toggleError(true);\n });\n \n uploadPromise.addNotifyListener((progress: {done: number, total: number}) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0});\n }\n sentDeferred.notifyAll(progress);\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem, \n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then(inputMedia => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n return apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(true);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n return {message, promise: sentDeferred};\n }\n\n public async sendAlbum(peerId: PeerId, files: File[], options: Partial<{\n isMedia: true,\n entities: MessageEntity[],\n replyToMsgId: number,\n threadId: number,\n caption: string,\n sendFileDetails: Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumbBlob: Blob,\n thumbURL: string\n }>[],\n silent: true,\n clearDraft: true,\n scheduleDate: number\n }> = {}) {\n //this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(files.length === 1) {\n return this.sendFile(peerId, files[0], {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = RichTextProcessor.parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', files, options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const messages = files.map((file, idx) => {\n const details = options.sendFileDetails[idx];\n const o: Parameters[2] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n groupId,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n //o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, file, o).message;\n });\n\n if(options.clearDraft) {\n setTimeout(() => {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }, 0);\n }\n \n // * test pending\n //return;\n\n const toggleError = (message: any, on: boolean) => {\n if(on) {\n message.error = true;\n } else {\n delete message.error;\n }\n\n rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'});\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error) => {\n messages.forEach(message => toggleError(message, true));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n });\n })\n .then(messageMedia => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = appPhotosManager.getMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = appDocsManager.saveDoc(messageMedia.document);\n inputMedia = appDocsManager.getMediaInput(doc);\n }\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: any) => {\n if(err.name === 'AbortError') {\n return null;\n }\n\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, true);\n throw err;\n });\n });\n\n return Promise.all(promises).then(inputs => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(peerId: PeerId, inputMedia: InputMedia, options: Partial<{\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n scheduleDate: number,\n silent: true,\n geoPoint: GeoPoint\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n //this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? appMessagesIdsManager.getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n \n // @ts-ignore\n case 'messageMediaPending': {\n media = inputMedia;\n break;\n }\n }\n\n message.media = media;\n\n let toggleError = (on: boolean) => {\n /* const historyMessage = this.messagesForHistory[messageId];\n if (on) {\n message.error = true\n if (historyMessage) {\n historyMessage.error = true\n }\n } else {\n delete message.error\n if (historyMessage) {\n delete historyMessage.error\n }\n } */\n rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n } else {\n apiPromise = apiManager.invokeApiAfter('messages.sendMedia', {\n peer: appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n toggleError(true);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined, \n threadId: options.threadId,\n clearDraft: options.clearDraft\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Partial<{\n isGroupedItem: true, \n isScheduled: true, \n threadId: number, \n clearDraft: true\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getMessagesStorage(peerId);\n\n if(options.isScheduled) {\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n setTimeout(() => {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: messageId});\n }, 0);\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n //if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n setTimeout(() => {\n rootScope.dispatchEvent('history_append', {storage, peerId, mid: messageId});\n }, 0);\n }\n\n this.pendingByRandomId[message.random_id] = {\n peerId, \n tempId: messageId, \n threadId: options.threadId, \n storage\n };\n\n if(!options.isGroupedItem && message.send) {\n setTimeout(() => {\n if(options.clearDraft) {\n appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n }, 0);\n }\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: Partial<{\n scheduleDate: number,\n replyToMsgId: number,\n threadId: number,\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: this.generateFromId(peerId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor, \n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + serverTimeManager.serverTimeOffset),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true,\n promise: options.groupId === undefined ? deferredPromise() : undefined\n };\n\n return message;\n }\n\n private generateReplyHeader(replyToMsgId: number, replyToTopId?: number) {\n const header = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n } as MessageReplyHeader;\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(appPeersManager.isBroadcast(peerId)) {\n const channelFull = appProfileManager.chatsFull[peerId.toChatId()] as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(peerId.isAnyChat() && (peerId.isBroadcast() || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return appPeersManager.getOutputPeer(appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!appPeersManager.isChannel(peerId) && !appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = appUsersManager.getSelf().id.toPeerId();\n if(originalMessage.fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.from_id = appPeersManager.getOutputPeer(originalMessage.fromId);\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n if(appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n \n // * there is no way to detect whether user profile is hidden\n if(peerId === myId) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message = {\n _: 'messageService',\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n } as Message.messageService;\n\n this.getMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n return peerId.isAnyChat() && appPeersManager.getPeer(peerId).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(message: MyMessage, dialog: MTDialog.dialog = this.getDialogOnly(message.peerId)) {\n if(dialog) {\n dialog.top_message = message.mid;\n \n const historyStorage = this.getHistoryStorage(message.peerId);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n \n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = appPeersManager.getPeerId(dialog.peer);\n const mid = appMessagesIdsManager.generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n \n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach(dialog => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages(100, GLOBAL_FOLDER_ID);\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n \n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getConversations(query = '', offsetIndex?: number, limit?: number, folderId = 0, skipMigrated?: boolean) {\n return this.dialogsStorage.getDialogs(query, offsetIndex, limit, folderId, skipMigrated);\n }\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n return !message.pFlags.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages(limit: number, folderId: number, offsetDate?: number) {\n //const dialogs = this.dialogsStorage.getFolder(folderId);\n let offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n if(offsetDate === undefined) {\n offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n }\n\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += serverTimeManager.serverTimeOffset;\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n const params: MessagesGetDialogs = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n };\n\n return apiManager.invokeApiSingle('messages.getDialogs', params, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }).then((dialogsResult) => {\n if(!middleware() || dialogsResult._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', dialogsResult.dialogs, {...dialogsResult.dialogs[0]});\n }\n\n /* if(!offsetDate) {\n telegramMeWebService.setAuthorized(true);\n } */\n\n // can reset pinned order here\n if(!offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!offsetDate) {\n telegramMeWebManager.setAuthorized(true);\n }\n\n appUsersManager.saveApiUsers(dialogsResult.users);\n appChatsManager.saveApiChats(dialogsResult.chats);\n this.saveMessages(dialogsResult.messages);\n\n /* if(folderId === 0 && !offsetDate) {\n const found = dialogsResult.dialogs.find(dialog => appPeersManager.getPeerId(dialog.peer) === -1325963535);\n if(!found) {\n debugger;\n }\n } */\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: {[peerId: PeerId]: Dialog} = {};\n const setFolderId = folderId === GLOBAL_FOLDER_ID ? 0 : folderId;\n const saveGlobalOffset = folderId === GLOBAL_FOLDER_ID;\n forEachReverse((dialogsResult.dialogs as Dialog[]), dialog => {\n //const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(dialog.folder_id === undefined) {\n dialog.folder_id = setFolderId;\n }\n\n this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset);\n\n if(!maxSeenIdIncremented &&\n !appPeersManager.isChannel(dialog.peerId || appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId, d);\n } */\n\n if(offsetIndex && dialog.index > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!appMessagesIdsManager.getServerMessageId(dialog.read_inbox_max_id) && !appMessagesIdsManager.getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs[dialog.peerId] = dialog;\n\n this.log.error('noIdsDialogs', dialog, params);\n\n /* if(dialog.peerId === -1213511294) {\n this.log.error('lun bot', folderId);\n } */\n }\n });\n\n const keys = Object.keys(noIdsDialogs);\n if(keys.length) {\n //setTimeout(() => { // test bad situation\n const peerIds = keys.map(key => key.toPeerId());\n const promises = peerIds.map(peerId => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n \n for(let i = 0; i < peerIds.length; ++i) {\n rootScope.dispatchEvent('dialog_unread', {peerId: peerIds[i]});\n }\n });\n //}, 10e3);\n }\n\n const count = (dialogsResult as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(appMessagesIdsManager.getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */ \n !count || \n dialogsLength >= count ||\n !dialogsResult.dialogs.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n rootScope.dispatchEvent('dialogs_multiupdate', {});\n }\n\n const dialogs = (dialogsResult as MessagesDialogs.messagesDialogsSlice).dialogs;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1], \n count, \n dialogs: slicedDialogs\n };\n });\n }\n\n public forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: Partial<{\n withMyScore: true,\n silent: true,\n scheduleDate: number,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n peerId = appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n\n const keys: Array = [\n 'entities', \n 'media', \n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n keys.forEach(key => {\n // @ts-ignore\n message[key] = originalMessage[key];\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ?? (groups[originalMessage.grouped_id] = {tempId: '' + ++this.groupedTempId, messages: []});\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach(message => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach(message => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n random_id: newMessages.map(message => message.random_id),\n to_peer: appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n return promise;\n }\n\n public generateEmptyMessage(mid: number): Message.messageEmpty {\n return {\n _: 'messageEmpty',\n id: appMessagesIdsManager.getServerMessageId(mid),\n mid,\n deleted: true,\n pFlags: {}\n };\n }\n\n public getMessageFromStorage(storage: MessagesStorage, mid: number) {\n return storage && storage.get(mid) || this.generateEmptyMessage(mid);\n }\n\n private createMessageStorage() {\n const storage: MessagesStorage = new Map();\n \n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num, \n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ?? (this.messagesStorageByPeerId[peerId] = this.createMessageStorage());\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogByPeerId(peerId: PeerId): [Dialog, number] | [] {\n return this.dialogsStorage.getDialog(peerId);\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = appPeersManager.getPeerId(inputPeer);\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = new Promise((resolve, reject) => {\n setTimeout(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n this.reloadConversationsPeers.clear();\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n promises[peerId].resolve(undefined);\n }\n };\n\n apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers}).then((result) => {\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n\n fullfillLeft();\n resolve();\n }, (err) => {\n fullfillLeft();\n reject(err);\n }).finally(() => {\n this.reloadConversationsPromise = null;\n\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n }, 0);\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peer: InputPeer, just_clear?: boolean, revoke?: boolean): Promise {\n return apiManager.invokeApiSingle('messages.deleteHistory', {\n just_clear,\n revoke,\n peer,\n max_id: 0\n }).then((affectedHistory) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peer, just_clear, revoke);\n });\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean) {\n if(appPeersManager.isChannel(peerId)) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = promise instanceof Promise ? await promise : promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: appChatsManager.getChannelInput(channelId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(appPeersManager.getInputPeerById(peerId), justClear, revoke).then(() => {\n [\n this.historiesStorage, \n this.threadsStorage, \n this.searchesStorage, \n this.pinnedMessages,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach(s => {\n delete s[peerId];\n });\n\n const m = this.needSingleMessages.get(peerId);\n if(m) {\n m.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach(s => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n \n if(justClear) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n } else {\n delete this.notificationsToHandle[peerId];\n delete this.typings[peerId];\n \n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n });\n }\n\n public onPeerDeleted(peerId: number) {\n\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessage(peerId: PeerId) {\n const p = this.pinnedMessages[peerId] ?? (this.pinnedMessages[peerId] = {});\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId, \n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1\n }).then(result => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(updates => {\n //this.log('pinned updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: appPeersManager.getInputPeerById(peerId)\n }).then(affectedHistory => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getMessagesStorage(peerId);\n storage.forEach((message) => {\n if(message.pFlags.pinned) {\n delete message.pFlags.pinned;\n }\n });\n\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[peerId];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n let foundMessages = 0, message: string, totalEntities: MessageEntity[], entities: MessageEntity[];\n for(const [mid, m] of group) {\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m.message;\n totalEntities = m.totalEntities;\n entities = m.entities;\n } \n }\n\n if(foundMessages > 1) {\n message = undefined;\n totalEntities = undefined;\n entities = undefined;\n }\n\n return {message, entities, totalEntities};\n }\n\n public getMidsByAlbum(grouped_id: string) {\n return getObjectKeysAndSort(this.groupedMessagesStorage[grouped_id], 'asc');\n //return Object.keys(this.groupedMessagesStorage[grouped_id]).map(id => +id).sort((a, b) => a - b);\n }\n\n public getMidsByMessage(message: Message) {\n if((message as Message.message)?.grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: any, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return appMessagesIdsManager.generateMessageId(dialog?.top_message || 0, true);\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if(message.pFlags === undefined) {\n message.pFlags = {};\n }\n\n if(message._ === 'messageEmpty') {\n message.deleted = true;\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n \n const mid = appMessagesIdsManager.generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ?? (this.groupedMessagesStorage[message.grouped_id] = new Map());\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog && mid) {\n if(mid > dialog[message.pFlags.out\n ? 'read_outbox_max_id'\n : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n if(message.reply_to) {\n if(message.reply_to.reply_to_msg_id) {\n message.reply_to.reply_to_msg_id = message.reply_to_mid = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_msg_id);\n } \n\n if(message.reply_to.reply_to_top_id) message.reply_to.reply_to_top_id = appMessagesIdsManager.generateMessageId(message.reply_to.reply_to_top_id);\n }\n\n if(isMessage && message.replies) {\n if(message.replies.max_id) message.replies.max_id = appMessagesIdsManager.generateMessageId(message.replies.max_id);\n if(message.replies.read_max_id) message.replies.read_max_id = appMessagesIdsManager.generateMessageId(message.replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= serverTimeManager.serverTimeOffset;\n }\n \n //storage.generateIndex(message);\n const myId = appUsersManager.getSelf().id.toPeerId();\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from as MessageFwdHeader;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : appPeersManager.getPeerId(message.from_id);\n }\n\n if(fwdHeader) {\n //if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = appMessagesIdsManager.generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = appMessagesIdsManager.generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = appPeersManager.getPeerId(peer);\n const savedFromMid = appMessagesIdsManager.generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= serverTimeManager.serverTimeOffset;\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find(entity => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n if(isMessage && message.media) {\n switch(message.media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.photo = appPhotosManager.savePhoto(message.media.photo, mediaContext);\n }\n\n if(!(message.media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n \n break;\n }\n \n case 'messageMediaPoll': {\n const result = appPollsManager.savePoll(message.media.poll, message.media.results, message);\n message.media.poll = result.poll;\n message.media.results = result.results;\n break;\n }\n \n case 'messageMediaDocument': {\n if(message.media.ttl_seconds) {\n message.media = {_: 'messageMediaUnsupported'};\n } else {\n message.media.document = appDocsManager.saveDoc(message.media.document, mediaContext); // 11.04.2020 warning\n }\n\n break;\n }\n \n case 'messageMediaWebPage': {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n message.media.webpage = appWebPagesManager.saveWebPage(message.media.webpage, messageKey, mediaContext);\n break;\n }\n \n /*case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n message.media = {_: 'messageMediaUnsupported'};\n break;\n }\n\n case 'messageMediaUnsupported': {\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n break;\n }\n }\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n let migrateFrom: PeerId;\n let migrateTo: PeerId;\n const suffix = message.fromId === appUsersManager.getSelf().id ? 'You' : '';\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n //case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n \n case 'messageActionGroupCall': {\n //assumeType(action);\n\n appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n \n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n //apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type = \n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed'\n ? 'missed'\n : 'cancelled'\n )\n );\n break;\n }\n \n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message); \n }\n\n storage.set(mid, message);\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n //isNew: boolean, // * new - from update\n }> = {}) {\n if((messages as any).saved) return;\n (messages as any).saved = true;\n messages.forEach((message) => {\n this.saveMessage(message, options);\n });\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = RichTextProcessor.fixEmoji(message.message, apiEntities);\n\n const myEntities = RichTextProcessor.parseEntities(message.message);\n message.totalEntities = RichTextProcessor.mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): string;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment;\n public wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): DocumentFragment | string {\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n \n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n \n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('i');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n let entities = (message as Message.message).totalEntities;\n if((message as Message.message).media) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = this.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = this.getAlbumText(message.grouped_id);\n text = albumText.message;\n entities = albumText.totalEntities;\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : RichTextProcessor.wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n \n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n if(document.stickerEmojiRaw) {\n addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\n }\n \n addPart('AttachSticker');\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find(attribute => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : RichTextProcessor.wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : RichTextProcessor.wrapEmojiText(document.file_name));\n }\n \n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n \n default:\n //messageText += media._;\n ///////this.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n /* for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n } */\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = this.wrapMessageActionTextNew((message as Message.messageService), plain);\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(RichTextProcessor.wrapPlainText(text, entities));\n } else {\n // let entities = RichTextProcessor.parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n let regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n \n if(found) {\n RichTextProcessor.sortEntities(entities);\n }\n }\n\n const messageWrapped = RichTextProcessor.wrapRichText(text, {\n noLinebreaks: true, \n entities, \n noLinks: true,\n noTextFormat: true\n });\n \n parts.push(htmlToDocumentFragment(messageWrapped) as any);\n }\n }\n\n if(plain) {\n return parts.join('');\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment;\n }\n }\n\n public wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n \n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ? \n i18n('FromYou') : \n new PeerTitle({\n ...this.getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n }).element\n );\n\n if(appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = new PeerTitle({peerId: message.peerId}).element;\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n }\n\n public getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n }\n\n public wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n }\n\n private wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = RichTextProcessor.wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n \n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n }\n\n private wrapMessageActionTextNewUnsafe(message: MyMessage, plain?: boolean) {\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return RichTextProcessor.wrapPlainText(unsafeMessage);\n } else {\n element.innerHTML = RichTextProcessor.wrapRichText(unsafeMessage, {noLinebreaks: true});\n return element;\n }\n } else {\n let _ = action._;\n //let suffix = '';\n let langPackKey: LangPackKey;\n let args: any[];\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? appPeersManager.getPeerTitle(peerId, plain) : (new PeerTitle({peerId})).element;\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = appUsersManager.getSelf().id;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map(peerId => getNameDivHTML(peerId, plain));\n args.push(this.wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey, _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date, \n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = appUsersManager.getSelf().id;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n \n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = this.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain),\n ];\n \n if(pinnedMessage.deleted/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n this.fetchMessageReplyTo(message).then(originalMessage => {\n if(!originalMessage.deleted && !message.deleted) {\n rootScope.dispatchEvent('message_edit', {\n storage: this.getMessagesStorage(peerId),\n peerId: peerId,\n mid: message.mid\n });\n\n if(this.isMessageIsTopMessage(message)) {\n rootScope.dispatchEvent('dialogs_multiupdate', {\n [peerId]: this.getDialogOnly(peerId)\n });\n }\n }\n });\n }\n } else {\n const a = document.createElement('i');\n a.dataset.savedFrom = pinnedMessage.peerId + '_' + pinnedMessage.mid;\n a.dir = 'auto';\n a.append(this.wrapMessageForReply(pinnedMessage, undefined, undefined, plain as any));\n args.push(a);\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(plain ? action.title : htmlToSpan(RichTextProcessor.wrapEmojiText(action.title)));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users \n || [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain)),\n false,\n plain\n );\n \n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = RichTextProcessor.wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n if(plain) {\n return I18n.format(langPackKey, true, args);\n } else {\n return _i18n(element, langPackKey, args);\n }\n\n //str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n }\n\n public wrapMessageActionTextNew(message: MyMessage, plain: true): string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: false): HTMLElement;\n public wrapMessageActionTextNew(message: MyMessage, plain: boolean): HTMLElement | string;\n public wrapMessageActionTextNew(message: MyMessage, plain?: boolean): HTMLElement | string {\n try {\n return this.wrapMessageActionTextNewUnsafe(message, plain);\n } catch(err) {\n this.log.error('wrapMessageActionTextNewUnsafe error:', err);\n return plain ? '' : document.createElement('span');\n }\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return apiManager.invokeApiSingle('messages.report', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return apiManager.invokeApi('messages.startBot', {\n bot: appUsersManager.getUserInput(botId),\n peer: appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error) => {\n if(error && error.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n const bot = appUsersManager.getUser(botId);\n return this.sendText(peerId, str + '@' + bot.username);\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map(peerId => {\n return {\n _: 'inputFolderPeer',\n peer: appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then(updates => {\n //this.log('editPeerFolders updates:', updates);\n apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public toggleDialogPin(peerId: PeerId, filterId?: number) {\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = filterId === 1 ? rootScope.config.pinned_infolder_count_max : rootScope.config.pinned_dialogs_count_max;\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n return Promise.reject({type: 'PINNED_DIALOGS_TOO_MUCH'});\n }\n }\n\n return apiManager.invokeApi('messages.toggleDialogPin', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n }\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return apiManager.invokeApi('messages.markDialogUnread', {\n peer: appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then(bool => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = appChatsManager.getChat(migrateFrom.toChatId());\n if(fromChat &&\n fromChat.migrated_to &&\n fromChat.migrated_to.channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n //setTimeout(() => {\n rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n //}, 100);\n }\n }\n }\n\n private canMessageBeEdited(message: any, kind: 'text' | 'poll') {\n if(message.pFlags.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && appUsersManager.isBot(message.fromId)) {\n return false;\n }\n \n if(message.media &&\n message.media._ === 'messageMediaDocument' &&\n (message.media.document.sticker || message.media.document.type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === appUsersManager.getSelf().id) {\n return true;\n }\n\n if(!message.pFlags.out || (\n message.peerId.isUser() && \n message.date < (tsNow(true) - rootScope.config.edit_time_limit) && \n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() \n || message.fromId === rootScope.myId \n || appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' \n || appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && !message.pFlags.is_outgoing;\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n let messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup\n ? message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId\n : appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(peerId: PeerId, filters: MessagesFilter[], canCache = true) {\n const func = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n return func('messages.getSearchCounters', {\n peer: appPeersManager.getInputPeerById(peerId),\n filters\n });\n }\n\n public filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [], \n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n excludeDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = storage.get(history[i]);\n if(!message) continue;\n \n //|| (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n \n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\n continue;\n }\n \n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find(e => goodEntities.includes(e._)) || RichTextProcessor.matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] && \n message.action && \n ([\n 'messageActionChannelEditPhoto' as const, \n 'messageActionChatEditPhoto' as const, \n 'messageActionChannelEditVideo' as const, \n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find(flag => message.pFlags[flag])) {\n found = true;\n } */\n \n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n //this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n //const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ? \n this.getSearchStorage(peerId, inputFilter._) as any : \n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilter(inputFilter._, storage.history.slice, this.getMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? apiManager.invokeApiCacheable : apiManager.invokeApi).bind(apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId) || 0\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n //var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n let offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n //offsetDate = offsetMessage.date + serverTimeManager.serverTimeOffset;\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n appUsersManager.saveApiUsers(searchResult.users);\n appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter(mid => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = appMessagesIdsManager.getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: appMessagesIdsManager.generateMessageId(maxMessageId, true),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n } \n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(mid)\n }).then(result => {\n appChatsManager.saveApiChats(result.chats);\n appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.filterMessages(result.messages[0], message => !!(message as Message.message).replies)[0] as Message.message;\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n \n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n result.max_id = historyStorage.maxId = appMessagesIdsManager.generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = appMessagesIdsManager.generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = appMessagesIdsManager.generateMessageId(result.read_outbox_max_id) || 0;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(peerId: PeerId, mid: number) {\n if(this.newMessagesToHandle[peerId] === undefined) {\n this.newMessagesToHandle[peerId] = new Set();\n }\n\n this.newMessagesToHandle[peerId].add(mid);\n if(!this.newMessagesHandleTimeout) {\n this.newMessagesHandleTimeout = window.setTimeout(this.handleNewMessages, 0);\n }\n }\n\n private handleNewMessages = () => {\n clearTimeout(this.newMessagesHandleTimeout);\n this.newMessagesHandleTimeout = 0;\n\n rootScope.dispatchEvent('history_multiappend', this.newMessagesToHandle);\n this.newMessagesToHandle = {};\n };\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const obj = this.newDialogsToHandle;\n for(const peerId in obj) {\n const dialog = obj[peerId];\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n delete obj[peerId];\n } else {\n this.dialogsStorage.pushDialog(dialog);\n if(!appPeersManager.isChannel(peerId.toPeerId())) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n }\n }\n\n //this.log('after order:', this.dialogsStorage[0].map(d => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n this.newDialogsToHandle = {};\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog) {\n if(peerId !== undefined) {\n this.newDialogsToHandle[peerId] = dialog;\n }\n\n if(this.newDialogsHandlePromise) return this.newDialogsHandlePromise;\n return this.newDialogsHandlePromise = new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n }, 0);\n });\n }\n\n public deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const localMessageIds = mids.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = apiManager.invokeApi('channels.deleteMessages', {\n channel: appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n return promise;\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n if(!this.getReadMaxIdIfUnread(peerId, threadId) && !force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readDiscussion', {\n peer: appPeersManager.getInputPeerById(peerId),\n msg_id: appMessagesIdsManager.getServerMessageId(threadId),\n read_max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('channels.readHistory', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = apiManager.invokeApi('messages.readHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n }).then((affectedMessages) => {\n apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n appNotificationsManager.soundReset(appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n public fixDialogUnreadMentionsIfNoMessage(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public modifyCachedMentions(peerId: PeerId, mid: number, add: boolean) {\n const slicedArray = this.unreadMentions[peerId];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray) {\n const dialog = this.getDialogOnly(peerId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversation(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then(messages => {\n console.log(messages);\n }); */\n\n const promise = this.goToNextMentionPromises[peerId];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ?? (this.unreadMentions[peerId] = new SlicedArray());\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId);\n }\n\n return this.goToNextMentionPromises[peerId] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n rootScope.dispatchEvent('history_focus', {peerId, mid});\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[peerId];\n });\n }\n\n public loadNextMentions(peerId: PeerId) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit).then(messages => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n public getUnreadMentions(peerId: PeerId, offsetId: number, add_offset: number, limit: number, maxId = 0, minId = 0) {\n return apiManager.invokeApiSingle('messages.getUnreadMentions', {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: appMessagesIdsManager.getServerMessageId(maxId),\n min_id: appMessagesIdsManager.getServerMessageId(minId)\n }).then(messagesMessages => {\n assumeType>(messagesMessages);\n appUsersManager.saveApiUsers(messagesMessages.users);\n appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map(mid => appMessagesIdsManager.getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = apiManager.invokeApi('channels.readMessageContents', {\n channel: appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n //threadId = this.getLocalMessageId(threadId);\n if(!this.threadsStorage[peerId]) this.threadsStorage[peerId] = {};\n return this.threadsStorage[peerId][threadId] ?? (this.threadsStorage[peerId][threadId] = {count: null, history: new SlicedArray()});\n }\n\n return this.historiesStorage[peerId] ?? (this.historiesStorage[peerId] = {count: null, history: new SlicedArray()});\n }\n\n private handleNotifications = () => {\n window.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = 0;\n\n //var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n //const timeout = 1000;\n\n for(const _peerId in this.notificationsToHandle) {\n const peerId = _peerId.toPeerId();\n if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n continue;\n }\n\n const notifyPeerToHandle = this.notificationsToHandle[peerId];\n\n Promise.all([\n appNotificationsManager.getNotifyPeerTypeSettings(),\n appNotificationsManager.getNotifySettings(appPeersManager.getInputNotifyPeerById(peerId, true))\n ]).then(([_, peerTypeNotifySettings]) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if(appNotificationsManager.isPeerLocalMuted(peerId, true) || !topMessage.pFlags.unread) {\n return;\n }\n\n //setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n //}, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n //this.log('AMM updateMessageID:', update, pendingData);\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message = this.getMessageFromStorage(storage, mid);\n if(!message.deleted) {\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n this.finalizePendingMessageCallbacks(storage, tempId, message);\n } else {\n this.pendingByMessageId[mid] = randomId;\n }\n }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getMessagesStorage(peerId);\n const dialog = this.getDialogOnly(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: new Map()});\n\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n if(threadId && !isLocalThreadUpdate && this.threadsStorage[peerId] && this.threadsStorage[peerId][threadId]) {\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n this.onUpdateNewMessage(update);\n }\n\n if(!dialog && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n const set = this.newUpdatesAfterReloadToHandle[peerId] ?? (this.newUpdatesAfterReloadToHandle[peerId] = new Set());\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId);\n }\n\n return;\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n const pendingMessage = this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n historyStorage.count++;\n }\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? appMessagesIdsManager.getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: appPeersManager.getOutputPeer(fromId)\n };\n }\n\n apiUpdatesManager.processLocalUpdate(update);\n }\n\n if(!pendingMessage) {\n this.handleNewMessage(peerId, message.mid);\n }\n\n if(isLocalThreadUpdate) {\n return;\n }\n \n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n if(dialog) {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(inboxUnread/* && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE) */) {\n const notifyPeer = peerId;\n let notifyPeerToHandle = this.notificationsToHandle[notifyPeer];\n if(notifyPeerToHandle === undefined) {\n notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n }\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n if(!this.notificationsHandlePromise) {\n this.notificationsHandlePromise = window.setTimeout(this.handleNotifications, 0);\n }\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n //this.log('updateDialogUnreadMark', update);\n const peerId = appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n rootScope.dispatchEvent('dialogs_multiupdate', {[peerId]: dialog});\n this.dialogsStorage.setDialogToState(dialog);\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const storage = this.getMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n \n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog && dialog.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n rootScope.dispatchEvent('dialog_flush', {peerId});\n }\n } else {\n rootScope.dispatchEvent('message_edit', {\n storage,\n peerId,\n mid\n });\n\n if(isTopMessage || (message as Message.message).grouped_id) {\n const updatedDialogs: {[peerId: PeerId]: Dialog} = {};\n updatedDialogs[peerId] = dialog;\n rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox \n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox \n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = appMessagesIdsManager.generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const storage = this.getMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n //this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n appUsersManager.forceUserOnline(peerId);\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = !threadId && foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n \n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n if(!message.pFlags.unread) {\n break;\n }\n\n if(threadId) {\n const replyTo = message.reply_to;\n if(!replyTo || (replyTo.reply_to_top_id || replyTo.reply_to_msg_id) !== threadId) {\n continue;\n }\n }\n \n // this.log.warn('read', messageId, message.pFlags.unread, message)\n if(message.pFlags.unread) {\n delete message.pFlags.unread;\n if(!foundAffected) {\n foundAffected = true;\n }\n\n if(!message.pFlags.out && !threadId && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n \n appNotificationsManager.cancel('msg' + mid);\n }\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(!threadId && foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(newUnreadCount < 0 || !this.getReadMaxIdIfUnread(peerId)) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n if(releaseUnreadCount) {\n releaseUnreadCount();\n }\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n \n rootScope.dispatchEvent('dialog_unread', {peerId});\n this.dialogsStorage.setDialogToState(foundDialog);\n }\n\n if(foundAffected) {\n rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid));\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const mids = (update as Update.updateReadMessagesContents).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.getMessageById(mids[0]).peerId;\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(!message.deleted) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n \n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n }\n }\n\n rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = appMessagesIdsManager.generateMessageId(update.available_min_id);\n const messages = history.filter(mid => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n //const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map(id => appMessagesIdsManager.generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.getMessageById(messages[0]).peerId;\n \n if(!peerId) {\n return;\n }\n\n apiManager.clearCache('messages.getSearchCounters', (params) => {\n return appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(threadKey && this.threadsStorage[peerId] && this.threadsStorage[peerId][+threadKey.split('_')[1]]) {\n threadKeys.add(threadKey);\n }\n }\n \n const historyUpdated = this.handleDeletedMessages(peerId, this.getMessagesStorage(peerId), messages);\n\n const threadsStorages = Array.from(threadKeys).map(threadKey => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorage = this.getHistoryStorage(peerId);\n [historyStorage].concat(threadsStorages).forEach(historyStorage => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n \n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const foundDialog = this.getDialogOnly(peerId);\n if(foundDialog) {\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n \n if(historyUpdated.unread) {\n foundDialog.unread_count = Math.max(0, foundDialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n foundDialog.unread_mentions_count = !foundDialog.unread_count ? 0 : Math.max(0, foundDialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n rootScope.dispatchEvent('dialog_unread', {peerId});\n }\n\n if(historyUpdated.msgs.has(foundDialog.top_message)) {\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, foundDialog);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel: Chat.channel = appChatsManager.getChat(channelId);\n\n const needDialog = appChatsManager.isInChat(channelId);\n \n const canViewHistory = !!channel.username || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n \n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n rootScope.dispatchEvent('history_forbidden', peerId);\n }\n \n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n this.dialogsStorage.dropDialog(peerId);\n\n delete this.historiesStorage[peerId];\n this.reloadConversation(peerId).then(() => {\n rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n \n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.channel_id.toPeerId(true);\n const mid = appMessagesIdsManager.generateMessageId(update.id);\n const message: Message.message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && message.views !== undefined && message.views < views) {\n message.views = views;\n rootScope.dispatchEvent('message_views', {peerId, mid, views});\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n //this.log('updateServiceNotification', update);\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: appPeersManager.getOutputPeer(fromId),\n peer_id: appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + serverTimeManager.serverTimeOffset,\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!appUsersManager.hasUser(fromId)) {\n appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned']; \n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map(id => appMessagesIdsManager.generateMessageId(id)); \n\n const storage = this.getMessagesStorage(peerId);\n const missingMessages = messages.filter(mid => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map(mid => this.wrapSingleMessage(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n //storage.history.push(mid);\n const message = storage.get(mid);\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n //storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n //storage.history.findAndSplice(_mid => _mid === mid);\n const message = storage.get(mid);\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n \n delete this.pinnedMessages[peerId];\n appStateManager.getState().then(state => {\n delete state.hiddenPinnedMessages[peerId];\n rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n if(peer._ === 'notifyPeer') {\n const peerId = appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer);\n \n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialog.notify_settings = notify_settings;\n rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(!oldMessage.deleted) {\n this.handleEditedMessage(oldMessage, newMessage);\n rootScope.dispatchEvent('message_edit', {storage, peerId, mid: message.mid});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n rootScope.dispatchEvent('scheduled_new', {peerId, mid: message.mid});\n }\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map(id => appMessagesIdsManager.generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage.peerId?.isAnyChat() && threadMessage.reply_to) {\n const threadId = threadMessage.reply_to.reply_to_top_id || threadMessage.reply_to.reply_to_msg_id;\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.wrapSingleMessage(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid);\n\n if(broadcastEventName) {\n rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n \n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n rootScope.dispatchEvent('history_update', {storage: pendingData.storage, peerId: message.peerId, mid: message.mid});\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(peerId: PeerId, mute?: boolean) {\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n if(mute === undefined) {\n mute = !appNotificationsManager.isPeerLocalMuted(peerId, false);\n }\n \n settings.mute_until = mute ? MUTE_UNTIL : 0;\n\n return appNotificationsManager.updateNotifySettings({\n _: 'inputNotifyPeer',\n peer: appPeersManager.getInputPeerById(peerId)\n }, settings);\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(peerId.isAnyChat()) {\n //const isChannel = appPeersManager.isChannel(peerId);\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\n const hasRights = /* isChannel && */appChatsManager.hasRights(peerId.toChatId(), action, undefined, !!threadId); \n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n // this.log('pdata', randomID, pendingData)\n\n if(pendingData) {\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [this.getHistoryStorage(peerId), threadId ? this.getHistoryStorage(peerId, threadId) : undefined]\n .filter(Boolean)\n .forEach(storage => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(!tempMessage.deleted) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n rootScope.dispatchEvent('messages_pending');\n \n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n //this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n //this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = appDownloadManager.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = appDownloadManager.getCacheContext(photo, 'full');\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = appPhotosManager.getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const doc = appDocsManager.getDoc('' + tempId);\n if(doc) {\n if(/* doc._ !== 'documentEmpty' && */doc.type && doc.type !== 'sticker' && doc.mime_type !== 'image/gif') {\n const cacheContext = appDownloadManager.getCacheContext(newDoc);\n const oldCacheContext = appDownloadManager.getCacheContext(doc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = appDocsManager.getInputFileName(newDoc);\n appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete appPollsManager.polls[tempId];\n delete appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n \n this.handleReleasingMessage(tempMessage, storage);\n\n rootScope.dispatchEvent('message_sent', {storage, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n appStateManager.pushToState('maxSeenMsgId', maxId);\n\n apiManager.invokeApi('messages.receivedMessages', {\n max_id: appMessagesIdsManager.getServerMessageId(maxId)\n });\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid)),\n increment: true\n }).then(views => {\n const updates: Update[] = new Array(mids.length);\n const channelId = peerId.toChatId();\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: channelId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n const notification: NotifyOptions = {};\n const peerString = appPeersManager.getPeerString(peerId);\n let notificationMessage: string;\n\n if(options.peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && options.fwdCount) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [options.fwdCount]);\n } else {\n notificationMessage = this.wrapMessageForReply(message, undefined, undefined, true);\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n notification.title = appPeersManager.getPeerTitle(peerId, true);\n if(peerId.isAnyChat() && message.fromId !== message.peerId) {\n notification.title = appPeersManager.getPeerTitle(message.fromId, true) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = RichTextProcessor.wrapPlainText(notification.title);\n\n notification.onclick = () => {\n rootScope.dispatchEvent('history_focus', {peerId, mid: message.mid});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;//message.pFlags.silent || false;\n\n const peerPhoto = appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').loadPromise.then(url => {\n if(message.pFlags.unread) {\n notification.image = url;\n appNotificationsManager.notify(notification);\n }\n });\n } else {\n appNotificationsManager.notify(notification);\n }\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ?? (this.scheduledMessagesStorage[peerId] = this.createMessageStorage());\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId): Promise {\n if(!this.canSendToPeer(peerId)) return Promise.resolve([]);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return Promise.resolve([...storage.keys()]);\n }\n\n return apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then(historyResult => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n \n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n \n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: appPeersManager.getInputPeerById(peerId),\n id: mids.map(mid => appMessagesIdsManager.getServerMessageId(mid))\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.filterMessages(message, message => !!(message as Message.message).replies)[0] as any;\n if(!(message && message.replies && message.replies.pFlags.comments && message.replies.channel_id !== '777')) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && !appChatsManager.isInChat(peerId.toChatId());\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n let historyResult = this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n if(historyResult instanceof Promise) {\n historyResult = await historyResult;\n }\n\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(peerId, historyResult.history[i]);\n }\n\n return historyStorage;\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n public getHistory(peerId: PeerId, maxId = 0, limit: number, backLimit?: number, threadId?: number): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n let offset = 0;\n /* \n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map(message => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: haveSlice.slice,\n offsetIdOffset: haveSlice.offsetIdOffset\n }; \n }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n return {\n count: historyStorage.count,\n history: slice?.slice || historyStorage.history.constructSlice(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(slicedArray: SlicedArray, \n historyResult: Parameters[0], \n offset_id: number, \n limit: number, \n add_offset: number) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually. \n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && appMessagesIdsManager.getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n \n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n historyStorage.maxId = slice[0]; // ! WARNING\n }\n \n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n //console.trace('requestHistory', peerId, maxId, limit, offset);\n\n //rootScope.broadcast('history_request');\n\n const options: any = {\n peer: appPeersManager.getInputPeerById(peerId),\n offset_id: appMessagesIdsManager.getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n options.msg_id = appMessagesIdsManager.getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n //timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n appUsersManager.saveApiUsers(historyResult.users);\n appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if(appPeersManager.isChannel(peerId)) {\n apiUpdatesManager.addChannelState(peerId.toChatId(), (historyResult as MessagesMessages.messagesChannelMessages).pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && historyResult.messages[length - 1].deleted) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch (error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(peerId.toChatId());\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = new Promise((resolve) => {\n setTimeout(() => {\n const requestPromises: Promise[] = [];\n \n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: appMessagesIdsManager.getServerMessageId(mid)\n };\n });\n \n let promise: Promise;\n if(peerId.isAnyChat() && appPeersManager.isChannel(peerId)) {\n promise = apiManager.invokeApiSingle('channels.getMessages', {\n channel: appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then(getMessagesResult => {\n assumeType>(getMessagesResult);\n\n appUsersManager.saveApiUsers(getMessagesResult.users);\n appChatsManager.saveApiChats(getMessagesResult.chats);\n this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < getMessagesResult.messages.length; ++i) {\n const message = getMessagesResult.messages[i];\n const mid = appMessagesIdsManager.generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(getMessagesResult.messages[i]);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n \n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n Promise.all(requestPromises).finally(() => {\n this.fetchSingleMessagesPromise = null;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n resolve();\n });\n }, 0);\n });\n }\n\n public wrapSingleMessage(peerId: PeerId, mid: number, overwrite = false): Promise {\n const message = this.getMessageByPeer(peerId, mid);\n if(!message.deleted && !overwrite) {\n rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public fetchMessageReplyTo(message: MyMessage): Promise {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then(originalMessage => {\n if(originalMessage.deleted) { // ! чтобы не пыталось бесконечно загрузить удалённое сообщение\n delete message.reply_to_mid; // ! WARNING!\n }\n\n return originalMessage;\n });\n }\n\n public setTyping(peerId: PeerId, action: SendMessageAction, force?: boolean): Promise {\n let typing = this.typings[peerId];\n if(!rootScope.myId || \n !peerId || \n !this.canSendToPeer(peerId) || \n peerId === rootScope.myId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[peerId] = {\n action\n };\n\n return apiManager.invokeApi('messages.setTyping', {\n peer: appPeersManager.getInputPeerById(peerId),\n action\n }).finally(() => {\n if(typing === this.typings[peerId]) {\n typing.timeout = window.setTimeout(() => {\n delete this.typings[peerId];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number, \n unread: number, \n unreadMentions: number, \n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0, \n unread: 0, \n unreadMentions: 0, \n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(message.deleted) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n appNotificationsManager.cancel('msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n\n const peerMessagesToHandle = this.newMessagesToHandle[peerId];\n if(peerMessagesToHandle && peerMessagesToHandle.has(mid)) {\n peerMessagesToHandle.delete(mid);\n }\n }\n\n if(history.albums) {\n for(const groupId in history.albums) {\n rootScope.dispatchEvent('album_edit', {peerId, groupId, deletedMids: [...history.albums[groupId]]});\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n \n private handleEditedMessage(oldMessage: Message, newMessage: Message) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n }\n }\n\n public getMediaFromMessage(message: any) {\n return message.action ? \n message.action.photo : \n message.media && (\n message.media.photo || \n message.media.document || (\n message.media.webpage && (\n message.media.webpage.document || \n message.media.webpage.photo\n )\n )\n );\n }\n\n public isMentionUnread(message: MyMessage) {\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return message.pFlags.media_unread && \n message.pFlags.mentioned && \n (\n !doc || \n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n );\n }\n\n public getDialogUnreadCount(dialog: Dialog) {\n return dialog.unread_count || +!!dialog.pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return !(message as Message.message).pFlags.noforwards && !appPeersManager.noForwards(message.peerId);\n }\n}\n\nconst appMessagesManager = new AppMessagesManager();\nMOUNT_CLASS_TO.appMessagesManager = appMessagesManager;\nexport default appMessagesManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto } from \"../../layer\";\r\nimport type { LangPackKey } from \"../langPack\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { isObject } from \"../../helpers/object\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport I18n from '../langPack';\r\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\r\n\r\n// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\r\n/*\r\n HTML-color IRC-color Description\r\n #c03d33 4 red\r\n #4fad2d 3 green\r\n #d09306 7 yellow\r\n #168acd 10 blue\r\n #8544d6 6 purple\r\n #cd4073 13 pink\r\n #2996ad 11 sea\r\n #ce671b 5 orange\r\n */\r\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\r\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\r\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\r\n\r\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\r\nexport class AppPeersManager {\r\n /* public savePeerInstance(peerId: PeerId, instance: any) {\r\n if(peerId < 0) appChatsManager.saveApiChat(instance);\r\n else appUsersManager.saveApiUser(instance);\r\n } */\r\n\r\n public canPinMessage(peerId: PeerId) {\r\n return peerId.isUser() || appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\r\n }\r\n\r\n public getPeerPhoto(peerId: PeerId): UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto {\r\n const photo = peerId.isUser() \r\n ? appUsersManager.getUserPhoto(peerId.toUserId())\r\n : appChatsManager.getChatPhoto(peerId.toChatId());\r\n\r\n return photo._ !== 'chatPhotoEmpty' && photo._ !== 'userProfilePhotoEmpty' ? photo : null;\r\n }\r\n\r\n public getPeerMigratedTo(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return false;\r\n }\r\n\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\r\n return this.getPeerId(chat.migrated_to as InputChannel.inputChannel);\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public getPeerTitle(peerId: PeerId, plainText = false, onlyFirstName = false) {\r\n if(!peerId) {\r\n peerId = rootScope.myId;\r\n }\r\n \r\n let title = '';\r\n if(peerId.isUser()) {\r\n const user = appUsersManager.getUser(peerId.toUserId());\r\n if(user.first_name) title += user.first_name;\r\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\r\n \r\n if(!title) title = user.pFlags.deleted ? I18n.format('HiddenName', true) : user.username;\r\n else title = title.trim();\r\n } else {\r\n const chat: Chat.chat = appChatsManager.getChat(peerId.toChatId());\r\n title = chat.title;\r\n\r\n if(onlyFirstName) {\r\n title = title.split(' ')[0];\r\n }\r\n }\r\n \r\n return plainText ? title : RichTextProcessor.wrapEmojiText(title);\r\n }\r\n\r\n public getOutputPeer(peerId: PeerId): Peer {\r\n if(peerId.isUser()) {\r\n return {_: 'peerUser', user_id: peerId.toUserId()};\r\n }\r\n\r\n const chatId = peerId.toChatId();\r\n if(appChatsManager.isChannel(chatId)) {\r\n return {_: 'peerChannel', channel_id: chatId};\r\n }\r\n\r\n return {_: 'peerChat', chat_id: chatId};\r\n }\r\n\r\n public getPeerString(peerId: PeerId) {\r\n if(peerId.isUser()) {\r\n return appUsersManager.getUserString(peerId.toUserId());\r\n }\r\n return appChatsManager.getChatString(peerId.toChatId());\r\n }\r\n\r\n public getPeerUsername(peerId: PeerId): string {\r\n return this.getPeer(peerId).username || '';\r\n }\r\n\r\n public getPeer(peerId: PeerId) {\r\n return peerId.isUser()\r\n ? appUsersManager.getUser(peerId.toUserId())\r\n : appChatsManager.getChat(peerId.toChatId());\r\n }\r\n\r\n public getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | PeerId | string): PeerId {\r\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\r\n // if(typeof(peerId) === 'number') return peerId;\r\n else if(isObject(peerId)) {\r\n const userId = (peerId as Peer.peerUser).user_id;\r\n if(userId !== undefined) {\r\n return userId.toPeerId(false);\r\n }\r\n\r\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\r\n if(chatId !== undefined) {\r\n return chatId.toPeerId(true);\r\n }\r\n\r\n return rootScope.myId; // maybe it is an inputPeerSelf\r\n // } else if(!peerId) return 'u0';\r\n } else if(!peerId) return NULL_PEER_ID;\r\n \r\n const isUser = (peerId as string).charAt(0) === 'u';\r\n const peerParams = (peerId as string).substr(1).split('_');\r\n\r\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\r\n }\r\n\r\n public getDialogPeer(peerId: PeerId): DialogPeer {\r\n return {\r\n _: 'dialogPeer',\r\n peer: this.getOutputPeer(peerId)\r\n };\r\n }\r\n\r\n public isChannel(peerId: PeerId): boolean {\r\n return !peerId.isUser() && appChatsManager.isChannel(peerId.toChatId());\r\n }\r\n\r\n public isMegagroup(peerId: PeerId) {\r\n return !peerId.isUser() && appChatsManager.isMegagroup(peerId.toChatId());\r\n }\r\n\r\n public isAnyGroup(peerId: PeerId): boolean {\r\n return !peerId.isUser() && !appChatsManager.isBroadcast(peerId.toChatId());\r\n }\r\n\r\n public isBroadcast(peerId: PeerId): boolean {\r\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\r\n }\r\n\r\n public isBot(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isBot(peerId.toUserId());\r\n }\r\n\r\n public isContact(peerId: PeerId): boolean {\r\n return peerId.isUser() && appUsersManager.isContact(peerId.toUserId());\r\n }\r\n\r\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\r\n return +peerId >= 0;\r\n }\r\n \r\n public isAnyChat(peerId: PeerId) {\r\n return !this.isUser(peerId);\r\n }\r\n\r\n /* public getInputPeer(peerString: string): InputPeer {\r\n var firstChar = peerString.charAt(0);\r\n var peerParams = peerString.substr(1).split('_');\r\n let id = +peerParams[0];\r\n\r\n if(firstChar === 'u') {\r\n //appUsersManager.saveUserAccess(id, peerParams[1]);\r\n\r\n return {\r\n _: 'inputPeerUser',\r\n user_id: id,\r\n access_hash: peerParams[1]\r\n };\r\n } else if(firstChar === 'c' || firstChar === 's') {\r\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\r\n if(firstChar === 's') {\r\n appChatsManager.saveIsMegagroup(id);\r\n }\r\n\r\n return {\r\n _: 'inputPeerChannel',\r\n channel_id: id,\r\n access_hash: peerParams[1] || '0'\r\n };\r\n } else {\r\n return {\r\n _: 'inputPeerChat',\r\n chat_id: id\r\n };\r\n }\r\n } */\r\n\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\r\n public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\r\n if(ignorePeerId) {\r\n if(peerId.isUser()) {\r\n return {_: 'inputNotifyUsers'};\r\n } else {\r\n if(this.isBroadcast(peerId)) {\r\n return {_: 'inputNotifyBroadcasts'};\r\n } else {\r\n return {_: 'inputNotifyChats'};\r\n }\r\n }\r\n } else {\r\n return {\r\n _: 'inputNotifyPeer', \r\n peer: this.getInputPeerById(peerId)\r\n };\r\n }\r\n }\r\n\r\n public getInputPeerById(peerId: PeerId): InputPeer {\r\n if(!peerId) {\r\n return {_: 'inputPeerEmpty'};\r\n }\r\n\r\n if(!peerId.isUser()) {\r\n const chatId = peerId.toChatId();\r\n return appChatsManager.getInputPeer(chatId);\r\n }\r\n\r\n const userId = peerId.toUserId();\r\n return appUsersManager.getUserInputPeer(userId);\r\n }\r\n\r\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\r\n return {_: 'inputPeerSelf'};\r\n }\r\n\r\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\r\n return {\r\n _: 'inputDialogPeer',\r\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\r\n };\r\n }\r\n\r\n public getPeerColorById(peerId: PeerId, pic = true) {\r\n if(!peerId) return '';\r\n\r\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\r\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\r\n return color;\r\n }\r\n\r\n public getPeerSearchText(peerId: PeerId) {\r\n let text: string;\r\n if(this.isUser(peerId)) {\r\n text = '%pu ' + appUsersManager.getUserSearchText(peerId.toUserId());\r\n } else {\r\n const chat = appChatsManager.getChat(peerId.toChatId());\r\n text = '%pg ' + (chat.title || '');\r\n }\r\n\r\n return text;\r\n }\r\n\r\n public getDialogType(peerId: PeerId): PeerType {\r\n if(this.isMegagroup(peerId)) {\r\n return 'megagroup';\r\n } else if(this.isChannel(peerId)) {\r\n return 'channel';\r\n } else if(!this.isUser(peerId)) {\r\n return 'group';\r\n } else {\r\n return peerId === rootScope.myId ? 'saved' : 'chat';\r\n }\r\n }\r\n\r\n public getDeleteButtonText(peerId: PeerId): LangPackKey {\r\n switch(this.getDialogType(peerId)) {\r\n case 'channel':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\r\n\r\n case 'megagroup':\r\n case 'group':\r\n return appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\r\n \r\n default:\r\n return 'ChatList.Context.DeleteChat';\r\n }\r\n }\r\n\r\n public noForwards(peerId: PeerId) {\r\n if(peerId.isUser()) return false;\r\n else {\r\n const chat = appChatsManager.getChatTyped(peerId.toChatId());\r\n return !!(chat as Chat.chat).pFlags?.noforwards;\r\n }\r\n }\r\n}\r\n\r\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\r\n\r\n[\r\n 'isChannel',\r\n 'isMegagroup',\r\n 'isAnyGroup',\r\n 'isBroadcast',\r\n 'isBot',\r\n 'isContact',\r\n 'isUser',\r\n 'isAnyChat',\r\n].forEach((value) => {\r\n const newMethod = Array.isArray(value) ? value[0] : value;\r\n const originMethod = Array.isArray(value) ? value[1] : value;\r\n // @ts-ignore\r\n String.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this.toString());\r\n };\r\n\r\n // @ts-ignore\r\n Number.prototype[newMethod] = function() {\r\n // @ts-ignore\r\n return appPeersManager[originMethod](this);\r\n };\r\n});\r\n\r\ndeclare global {\r\n interface String {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n\r\n interface Number {\r\n isChannel(): boolean;\r\n isMegagroup(): boolean;\r\n isAnyGroup(): boolean;\r\n isBroadcast(): boolean;\r\n isBot(): boolean;\r\n isContact(): boolean;\r\n isUser(): boolean;\r\n isAnyChat(): boolean;\r\n }\r\n}\r\n\r\nconst appPeersManager = new AppPeersManager();\r\nMOUNT_CLASS_TO.appPeersManager = appPeersManager;\r\nexport default appPeersManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { isObject, safeReplaceObject, copy, deepEqual } from \"../../helpers/object\";\nimport { ChannelParticipant, Chat, ChatAdminRights, ChatBannedRights, ChatParticipant, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, Update, Updates, ChannelsCreateChannel } from \"../../layer\";\nimport apiManagerProxy from \"../mtproto/mtprotoworker\";\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from \"./appStateManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager {\n private storage = appStateManager.storages.chats;\n \n private chats: {[id: ChatId]: Chat.channel | Chat.chat | any};\n //private usernames: any;\n //private channelAccess: any;\n //private megagroups: {[id: number]: true};\n\n constructor() {\n this.clear(true);\n\n rootScope.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n apiManagerProxy.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = appPeersManager.getPeerId(update.peer).toChatId();\n const chat: Chat.chat = this.chats[chatId];\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n appStateManager.getState().then((state) => {\n const chats = appStateManager.storagesResults.chats;\n if(chats.length) {\n for(let i = 0, length = chats.length; i < length; ++i) {\n const chat = chats[i];\n if(chat) {\n this.chats[chat.id] = chat;\n }\n }\n }\n\n appStateManager.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n appStateManager.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear(init = false) {\n if(!init) {\n const chats = appStateManager.storagesResults.chats;\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!appStateManager.isPeerNeeded(chatId.toPeerId(true))) {\n /* const chat = this.chats[chatId];\n if(chat.username) {\n delete this.usernames[cleanUsername(chat.username)];\n } */\n \n chats.findAndSplice((chat) => chat.id === chatId);\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n }\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach(chat => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n \n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat: Exclude = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n if((chat as Chat.chat).pFlags === undefined) {\n (chat as Chat.chat).pFlags = {};\n }\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n chat.initials = RichTextProcessor.getAbbreviation(chat.title);\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n let changedPhoto = false, changedTitle = false;\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n if(oldPhotoId !== newPhotoId) {\n changedPhoto = true;\n }\n\n if(oldChat.title !== chat.title) {\n changedTitle = true;\n }\n\n safeReplaceObject(oldChat, chat);\n rootScope.dispatchEvent('chat_update', chat.id);\n }\n\n const peerId = chat.id.toPeerId(true);\n if(changedPhoto) {\n rootScope.dispatchEvent('avatar_update', peerId);\n }\n\n if(changedTitle) {\n rootScope.dispatchEvent('peer_title_edit', peerId);\n }\n\n if(appStateManager.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id] || {_: 'chatEmpty', id, deleted: true, access_hash: '', pFlags: {}/* this.channelAccess[id] */};\n }\n\n public getChatTyped(id: ChatId): Chat {\n return this.getChat(id);\n }\n\n public combineParticipantBannedRights(id: ChatId, rights: ChatBannedRights) {\n const chat: Chat.channel = this.getChat(id);\n\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(let i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id \n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread \n * @returns \n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty') return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n (chat as Chat.chat).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return rights._ === 'chatAdminRights' ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return rights._ === 'chatAdminRights' ? myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return rights._ === 'chatAdminRights' && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat: Chat.chat = this.getChat(id);\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n \n return apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat && chat._ === 'channel' && chat.pFlags.megagroup);\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channelForbidden' \n || chat._ === 'chatForbidden' \n || chat._ === 'chatEmpty' \n || (chat as Chat.chat).pFlags.left \n || (chat as Chat.chat).pFlags.kicked \n || (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'chatEmpty' || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: this.getChat(id).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !chat.pFlags.min);\n }\n\n public getChatPhoto(id: ChatId) {\n const chat: Chat.chat = this.getChat(id);\n\n return chat && chat.photo || {\n _: 'chatPhotoEmpty'\n };\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = RichTextProcessor.wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: channelId.toPeerId(true)});\n\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map(u => appUsersManager.getUserInput(u));\n\n return apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return apiManager.invokeApi('messages.createChat', {\n users: userIds.map(u => appUsersManager.getUserInput(u)),\n title\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n rootScope.dispatchEvent('history_focus', {peerId: chatId.toPeerId(true)});\n\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: any) => {\n //console.log('onChatUpdated', chatId, updates);\n\n apiUpdatesManager.processUpdateMessage(updates);\n if(updates?.updates?.length && this.isChannel(chatId)) {\n rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n //return this.leaveChat(id).then(() => {\n return apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n //});\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find(u => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string) {\n return apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n }).then((bool) => {\n if(bool) {\n const chat: Chat.channel = this.getChat(id);\n chat.username = username;\n }\n\n return bool;\n });\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return apiManager.invokeApi('messages.editChatAbout', {\n peer: appPeersManager.getInputPeerById(peerId),\n about\n }).then(bool => {\n if(bool) {\n rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ? \n appPeersManager.getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) : \n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : this.getParticipantPeerId(participant);\n return apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: appUsersManager.getSelf().id,\n peer: appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n \n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then(messagesChats => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then(channelId => {\n return apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n });\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n\nconst appChatsManager = new AppChatsManager();\nMOUNT_CLASS_TO.appChatsManager = appChatsManager;\nexport default appChatsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport appPeersManager from \"../lib/appManagers/appPeersManager\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { i18n } from \"../lib/langPack\";\r\nimport replaceContent from \"../helpers/dom/replaceContent\";\r\nimport appUsersManager from \"../lib/appManagers/appUsersManager\";\r\nimport RichTextProcessor from \"../lib/richtextprocessor\";\r\nimport { NULL_PEER_ID } from \"../lib/mtproto/mtproto_config\";\r\n\r\nexport type PeerTitleOptions = {\r\n peerId?: PeerId,\r\n fromName?: string,\r\n plainText?: boolean,\r\n onlyFirstName?: boolean,\r\n dialog?: boolean\r\n};\r\n\r\nconst weakMap: WeakMap = new WeakMap();\r\n\r\nMOUNT_CLASS_TO.peerTitleWeakMap = weakMap;\r\n\r\nrootScope.addEventListener('peer_title_edit', (peerId) => {\r\n const elements = Array.from(document.querySelectorAll(`.peer-title[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\r\n elements.forEach(element => {\r\n const peerTitle = weakMap.get(element);\r\n //console.log('in the summer silence i was doing nothing', peerTitle, peerId);\r\n\r\n if(peerTitle) {\r\n peerTitle.update();\r\n }\r\n });\r\n});\r\n\r\nexport default class PeerTitle {\r\n public element: HTMLElement;\r\n public peerId: PeerId;\r\n public fromName: string;\r\n public plainText = false;\r\n public onlyFirstName = false;\r\n public dialog = false;\r\n\r\n constructor(options: PeerTitleOptions) {\r\n this.element = document.createElement('span');\r\n this.element.classList.add('peer-title');\r\n this.element.setAttribute('dir', 'auto');\r\n \r\n this.update(options);\r\n weakMap.set(this.element, this);\r\n }\r\n\r\n public update(options?: PeerTitleOptions) {\r\n if(options) {\r\n for(let i in options) {\r\n // @ts-ignore\r\n this.element.dataset[i] = options[i] ? '' + (typeof(options[i]) === 'boolean' ? +options[i] : options[i]) : '0';\r\n // @ts-ignore\r\n this[i] = options[i];\r\n }\r\n }\r\n\r\n if(this.fromName !== undefined) {\r\n this.element.innerHTML = RichTextProcessor.wrapEmojiText(this.fromName);\r\n return;\r\n }\r\n\r\n if(this.peerId === undefined) {\r\n this.peerId = NULL_PEER_ID;\r\n }\r\n\r\n if(this.peerId !== rootScope.myId || !this.dialog) {\r\n if(this.peerId.isUser() && appUsersManager.getUser(this.peerId).pFlags.deleted) {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Deleted' : 'HiddenName'));\r\n } else {\r\n this.element.innerHTML = appPeersManager.getPeerTitle(this.peerId, this.plainText, this.onlyFirstName);\r\n }\r\n } else {\r\n replaceContent(this.element, i18n(this.onlyFirstName ? 'Saved' : 'SavedMessages'));\r\n }\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\nimport { bytesFromHex } from \"../../helpers/bytes\";\nimport { CancellablePromise } from \"../../helpers/cancellablePromise\";\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\nimport { safeReplaceArrayInObject, isObject } from \"../../helpers/object\";\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { InputFileLocation, InputMedia, InputPhoto, Photo, PhotoSize, PhotosPhotos } from \"../../layer\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport referenceDatabase, { ReferenceContext } from \"../mtproto/referenceDatabase\";\nimport { MyDocument } from \"./appDocsManager\";\nimport appDownloadManager, { ThumbCache } from \"./appDownloadManager\";\nimport appUsersManager from \"./appUsersManager\";\nimport blur from \"../../helpers/blur\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport calcImageInBox from \"../../helpers/calcImageInBox\";\nimport { makeMediaSize, MediaSize } from \"../../helpers/mediaSizes\";\nimport windowSize from \"../../helpers/windowSize\";\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n//let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n private static jpegHeader = bytesFromHex('ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00');\n private static jpegTail = bytesFromHex('ffd9');\n \n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(photo._ === 'photoEmpty') return undefined;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n \n public choosePhotoSize(photo: MyPhoto | MyDocument, boxWidth = 0, boxHeight = 0, useBytes = false, pushDocumentSize = false) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n \n /*\n s\tbox\t100x100\n m\tbox\t320x320\n x\tbox\t800x800\n y\tbox\t1280x1280\n w\tbox\t2560x2560\n a\tcrop\t160x160\n b\tcrop\t320x320\n c\tcrop\t640x640\n d\tcrop\t1280x1280 */\n\n let bestPhotoSize: PhotoSize = {_: 'photoSizeEmpty', type: ''};\n let sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n if(pushDocumentSize && sizes && photo._ === 'document') {\n sizes = sizes.concat({\n _: 'photoSize', \n w: (photo as MyDocument).w, \n h: (photo as MyDocument).h, \n size: (photo as MyDocument).size, \n type: undefined\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n \n bestPhotoSize = photoSize;\n \n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n \n return bestPhotoSize;\n }\n \n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = appUsersManager.getUserInput(userId);\n return apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n \n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n public getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker) {\n arr = new Uint8Array(AppPhotosManager.jpegHeader.concat(Array.from(bytes.slice(3)), AppPhotosManager.jpegTail));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\n }\n\n /**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\n public getPathFromPhotoPathSize(size: PhotoSize.photoPathSize) {\n const bytes = size.bytes;\n const lookup = \"AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,\";\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-'; \n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n }\n\n public getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n return cacheContext.url || (cacheContext.url = this.getPreviewURLFromBytes(thumb.bytes, isSticker));\n }\n \n public getImageFromStrippedThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, useBlur: boolean) {\n const url = this.getPreviewURLFromThumb(photo, thumb, false);\n\n const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, loadPromise};\n }\n \n public setAttachmentSize(\n photo: MyPhoto | MyDocument, \n element: HTMLElement | SVGForeignObjectElement, \n boxWidth: number, \n boxHeight: number, \n noZoom = true, \n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n ) {\n if(!photoSize) {\n photoSize = this.choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n //console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n \n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument) {\n size = makeMediaSize((photo as MyDocument).w || (photoSize as PhotoSize.photoSize).w || 512, (photo as MyDocument).h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes((photo as MyDocument).type)) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n \n if(message && \n (message.message || \n message.reply_to_mid || \n message.media.webpage || \n (message.replies && message.replies.pFlags.comments && message.replies.channel_id !== 777)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n \n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n \n return {photoSize, size, isFit};\n }\n\n public getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false): ReturnType {\n if(!cacheContext.downloaded || (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type) || ignoreCache) {\n if(photo._ === 'document' && cacheContext.downloaded && !ignoreCache) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find(size => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return this.getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n }\n \n public getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n //console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n \n // maybe it's a thumb\n const isPhoto = (photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference;\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id, \n location, \n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined, \n queueId, \n onlyCache\n };\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n \n public preloadPhoto(photoId: MyPhoto | MyDocument | string, photoSize?: PhotoSize, queueId?: number, onlyCache?: boolean): CancellablePromise {\n const photo = this.getPhoto(photoId);\n\n // @ts-ignore\n if(!photo || photo._ === 'photoEmpty') {\n throw new Error('preloadPhoto photoEmpty!');\n }\n\n if(!photoSize) {\n const fullWidth = windowSize.width;\n const fullHeight = windowSize.height;\n \n photoSize = this.choosePhotoSize(photo, fullWidth, fullHeight);\n }\n\n const cacheContext = appDownloadManager.getCacheContext(photo, photoSize.type);\n if(cacheContext.downloaded >= ('size' in photoSize ? photoSize.size : 0) && cacheContext.url) {\n return Promise.resolve() as any;\n }\n \n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize, queueId, onlyCache);\n const fileName = getFileNameByLocation(downloadOptions.location);\n\n let download = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n download = appDownloadManager.download(downloadOptions);\n download.then(blob => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n cacheContext.url = url;\n\n //console.log('wrote photo:', photo, photoSize, cacheContext, blob);\n }\n\n return blob;\n }).catch(() => {});\n\n return download;\n }\n \n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n\n public getInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n }\n\n public getMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: this.getInput(photo),\n ttl_seconds: 0\n };\n }\n\n public savePhotoFile(photo: MyPhoto | MyDocument, queueId?: number) {\n const fullPhotoSize = this.choosePhotoSize(photo, 0xFFFF, 0xFFFF);\n if(!(fullPhotoSize._ === 'photoSize' || fullPhotoSize._ === 'photoSizeProgressive')) {\n return;\n }\n\n const downloadOptions = this.getPhotoDownloadOptions(photo, fullPhotoSize, queueId);\n downloadOptions.fileName = 'photo' + photo.id + '.jpg';\n appDownloadManager.downloadToDisc(downloadOptions, downloadOptions.fileName);\n }\n}\n\nconst appPhotosManager = new AppPhotosManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appPhotosManager = appPhotosManager);\nexport default appPhotosManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered } from '../../layer';\nimport { Modify } from '../../types';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\nimport appDocsManager, { MyDocument } from './appDocsManager';\nimport AppStorage from '../storage';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { forEachReverse } from '../../helpers/array';\nimport DATABASE_STATE from '../../config/databases/state';\nimport { readBlobAsText } from '../../helpers/blob';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport { getEmojiToneIndex } from '../../vendor/emoji';\nimport RichTextProcessor from '../richtextprocessor';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\n\nconst CACHE_TIME = 3600e3;\n\nconst EMOJI_SET_LOCAL_ID = 'emoji';\nconst EMOJI_ANIMATIONS_SET_LOCAL_ID = 'emojiAnimations';\nconst LOCAL_IDS_SET = new Set([\n EMOJI_SET_LOCAL_ID,\n EMOJI_ANIMATIONS_SET_LOCAL_ID\n]);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: Document.document[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n getAnimatedEmojiSoundsPromise: Promise;\n \n constructor() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {}; \n this.sounds = {};\n\n this.getAnimatedEmojiStickerSet();\n\n rootScope.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n }\n });\n\n this.getGreetingStickersTimeout = window.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then(docs => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n \n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n appDocsManager.downloadDoc(this.greetingStickers[0]); // preload next sticker\n\n return doc;\n });\n }\n\n public saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n public async getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise {\n const id = set.id;\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n return this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n // const perf = performance.now();\n const cachedSet = await this.storage.get(id);\n if(cachedSet && cachedSet.documents?.length && ((Date.now() - cachedSet.refreshTime) < CACHE_TIME || params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n delete this.getStickerSetPromises[id];\n // console.log('get sticker set from cache time', id, performance.now() - perf);\n return;\n }\n }\n\n try {\n const stickerSet = await apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n \n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n \n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n \n delete this.getStickerSetPromises[id];\n });\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getStickerSet({id: EMOJI_SET_LOCAL_ID}, {saveById: true}),\n this.getStickerSet({id: EMOJI_ANIMATIONS_SET_LOCAL_ID}, {saveById: true}),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n return this.getAnimatedEmojiSoundsPromise = apiManager.getAppConfig(overwrite).then(appConfig => {\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n \n const doc = appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: rootScope.config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg',\n size: 1\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n }\n\n public async getRecentStickers(): Promise> {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n this.saveStickers(res.stickers);\n return res;\n }\n });\n\n return res;\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const stickerSet = this.storage.getFromCache(isAnimation ? EMOJI_ANIMATIONS_SET_LOCAL_ID : EMOJI_SET_LOCAL_ID);\n if(!stickerSet || !stickerSet.documents) return undefined;\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find(p => p.emoticon === emoji);\n return pack ? appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji);\n if(doc) {\n return appDocsManager.downloadDoc(doc)\n .then(readBlobAsText)\n .then(async(json) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: json,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false\n }, 'none', toneIndex);\n\n animation.addEventListener('firstFrame', () => {\n appDocsManager.saveLottiePreview(doc, animation.canvas, toneIndex);\n animation.remove();\n }, {once: true});\n });\n }\n });\n \n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]);\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n const doc = this.getAnimatedEmojiSticker(emoji, true);\n if(doc) {\n const soundDoc = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n appDocsManager.downloadDoc(doc),\n soundDoc ? appDocsManager.downloadDoc(soundDoc) : undefined\n ]);\n }\n });\n }\n \n public saveStickerSet(res: Omit, id: DocId) {\n //console.log('stickers save set', res);w\n\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[]\n };\n \n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n this.saveStickers(res.documents);\n \n //console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet) {\n const thumb = stickerSet.thumbs.find(thumb => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(set.id === EMOJI_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmoji'\n };\n } else if(set.id === EMOJI_ANIMATIONS_SET_LOCAL_ID) {\n return {\n _: 'inputStickerSetAnimatedEmojiAnimations'\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n if(set.installed_date) {\n const res = await apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets', \n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n res.sets.forEach(covered => {\n this.saveStickerSet({set: covered.set, documents: [], packs: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(let id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find(c => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n public getAllStickers() {\n return apiManager.invokeApiHashable({method: 'messages.getAllStickers'});\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then(allStickers => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map(set => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = RichTextProcessor.fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n apiManager.invokeApiHashable({\n method: 'messages.getStickers', \n params: {\n emoticon\n }\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map(sticker => appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n //console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = RichTextProcessor.fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = RichTextProcessor.parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach(s => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter(doc => !doc.animated) */;\n\n return stickers;\n });\n }\n\n public pushRecentSticker(doc: MyDocument) {\n const docEmoticon = RichTextProcessor.fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then(stickers => {\n const _doc = stickers.findAndSplice(_doc => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n}\n\nconst appStickersManager = new AppStickersManager();\nMOUNT_CLASS_TO.appStickersManager = appStickersManager;\nexport default appStickersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport { tsNow } from \"../../helpers/date\";\nimport { numberThousandSplitter } from \"../../helpers/number\";\nimport { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull } from \"../../layer\";\nimport { LangPackKey, i18n } from \"../langPack\";\n//import apiManager from '../mtproto/apiManager';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { RichTextProcessor } from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport SearchIndex from \"../searchIndex\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\nimport appNotificationsManager from \"./appNotificationsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager, { MyTopPeer, User } from \"./appUsersManager\";\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nexport class AppProfileManager {\n //private botInfos: any = {};\n public usersFull: {[id: UserId]: UserFull.userFull} = {};\n public chatsFull: {[id: ChatId]: ChatFull} = {};\n private typingsInPeer: {[peerId: PeerId]: UserTyping[]};\n\n constructor() {\n rootScope.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = fullChat.chat_photo?._ !== 'photoEmpty';\n if(hasChatPhoto !== hasFullChatPhoto || (photo as ChatPhoto.chatPhoto).photo_id !== fullChat.chat_photo?.id) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n // * genius\n rootScope.addEventListener('chat_full_update', (chatId) => {\n rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n \n // * genius\n rootScope.addEventListener('user_full_update', (userId) => {\n rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true): Promise {\n if(this.usersFull[id] && !override) {\n return Promise.resolve(this.usersFull[id]);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser', \n params: {\n id: appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n appChatsManager.saveApiChats(usersUserFull.chats, true);\n appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n if(userFull.about !== undefined) {\n userFull.rAbout = RichTextProcessor.wrapRichText(userFull.about, {noLinebreaks: true});\n }\n\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n //appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true): Promise {\n if(appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public getFullPhoto(peerId: PeerId) {\n return this.getProfileByPeerId(peerId).then(profile => {\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n });\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true): Promise {\n if(appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override) {\n const chat = appChatsManager.getChat(id);\n if(chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version ||\n chat.pFlags.left) {\n return Promise.resolve(fullChat);\n }\n }\n \n return apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat', \n params: {\n chat_id: id\n },\n processResult: (result) => {\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChat = result.full_chat as ChatFull.chatFull;\n const peerId = id.toPeerId(true);\n if(fullChat && fullChat.chat_photo && fullChat.chat_photo.id) {\n fullChat.chat_photo = appPhotosManager.savePhoto(fullChat.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n //appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChat.notify_settings\n });\n \n this.chatsFull[id] = fullChat;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChat;\n }\n });\n }\n\n public getChatInviteLink(id: ChatId, force?: boolean) {\n return this.getChatFull(id).then((chatFull) => {\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n \n return apiManager.invokeApi('messages.exportChatInvite', {\n peer: appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = appChatsManager.getChat(id);\n if(chat &&\n chat.pFlags && (\n chat.pFlags.kicked ||\n chat.pFlags.broadcast && !chat.pFlags.creator && !chat.admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then(result => {\n appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex(p => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return apiManager.invokeApiSingle('channels.getParticipant', {\n channel: appChatsManager.getChannelInput(id),\n participant: appPeersManager.getInputPeerById(peerId),\n }).then(channelParticipant => {\n appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true): Promise {\n if(this.chatsFull[id] !== undefined && !override) {\n return Promise.resolve(this.chatsFull[id] as ChatFull.channelFull);\n }\n\n return apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel', \n params: {\n channel: appChatsManager.getChannelInput(id)\n }, \n processResult: (result) => {\n const peerId = id.toPeerId(true);\n appChatsManager.saveApiChats(result.chats, true);\n appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n //appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n appNotificationsManager.savePeerSettings({\n peerId, \n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n }, \n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = appChatsManager.getChat(id);\n channel = {_: 'channelForbidden', access_hash: channel.access_hash, title: channel.title};\n apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n } as Update.updateChannel],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n \n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach(peer => {\n index.indexObject(peer.id, appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: appMessagesIdsManager.getServerMessageId(threadId)\n }, 50, 0).then(cP => {\n return cP.participants.map(p => appChatsManager.getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = (this.getChatFull(chatId) as Promise).then(chatFull => {\n return (chatFull.participants as ChatParticipants.chatParticipants).participants.map(p => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]), \n promise\n ]).then(results => {\n const peers = results[0].concat(results[1].map(peerId => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n public invalidateChannelParticipants(id: ChatId) {\n apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) delete this.usersFull[peerId.toUserId()];\n else delete this.chatsFull[peerId.toChatId()];\n\n rootScope.dispatchEvent('peer_full_update', peerId);\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name: string, last_name: string, about: string) {\n return apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then(user => {\n appUsersManager.saveApiUser(user);\n \n return this.getProfile(rootScope.myId, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = rootScope.myId;\n appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n apiUpdatesManager.processLocalUpdate({\n _: 'updateUserPhoto',\n user_id: userId,\n date: tsNow(true),\n photo: appUsersManager.getUser(userId).photo,\n previous: true\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map(photoId => {\n const photo = appPhotosManager.getPhoto(photoId);\n return appPhotosManager.getInput(photo);\n })\n }).then((deletedList) => {\n \n });\n }\n\n public getChatMembersString(chatId: ChatId) {\n const chat: Chat = appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = this.chatsFull[chatId];\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isChannel = appChatsManager.isBroadcast(chatId);\n count = count || 1;\n\n let key: LangPackKey = isChannel ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n \n const chatInfo = await this.getChatFull(id);\n if(appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ? \n (update as Update.updateUserTyping).user_id.toPeerId() : \n appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(rootScope.myId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n \n const peerId = appPeersManager.getPeerId(update);\n const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []);\n let typing = typings.find(t => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n //typings.findAndSplice(t => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[peerId];\n }\n };\n\n if(typing && typing.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n //console.log('updateChatUserTyping', update, typings);\n \n typing.action = update.action;\n \n const hasUser = appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && appChatsManager.hasChat(update.chat_id) && !appChatsManager.isChannel(update.chat_id)) {\n appProfileManager.getChatFull(update.chat_id).then(() => {\n if(typing.timeout !== undefined && appUsersManager.hasUser(fromId)) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n });\n }\n }\n \n //return;\n } else {\n appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = window.setTimeout(cancelAction, 6000);\n if(hasUser) {\n rootScope.dispatchEvent('peer_typings', {peerId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = appPeersManager.getPeerId(update.peer_id);\n if(appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n rootScope.dispatchEvent('user_full_update', userId);\n }\n\n rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId) {\n return this.typingsInPeer[peerId];\n }\n}\n\nconst appProfileManager = new AppProfileManager();\nMOUNT_CLASS_TO.appProfileManager = appProfileManager;\nexport default appProfileManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import apiManager from '../mtproto/apiManager';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport { Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates } from '../../layer';\nimport { logger, LogTypes } from '../logger';\nimport apiManager from '../mtproto/mtprotoworker';\nimport rootScope from '../rootScope';\n//import networkerFactory from '../mtproto/networkerFactory';\nimport appUsersManager from \"./appUsersManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appStateManager from './appStateManager';\nimport serverTimeManager from '../mtproto/serverTimeManager';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: true,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nexport class ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n \n if(!this.popPendingSeqUpdate() &&\n state.syncPending &&\n state.syncPending.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n \n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n \n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n \n if(!goodPts) {\n return false;\n }\n \n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n \n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n \n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n clearTimeout(curState.syncPending.timeout);\n curState.syncPending = null;\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n \n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start,\n //ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n \n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n \n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n \n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? rootScope.myId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id\n ? (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true)\n : ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || rootScope.myId);\n \n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n \n case 'updatesCombined':\n case 'updates':\n appUsersManager.saveApiUsers(updateMessage.users, options.override);\n appChatsManager.saveApiChats(updateMessage.chats, options.override);\n \n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n \n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n \n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n let wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n \n if(updatesState.syncPending) {\n clearTimeout(updatesState.syncPending.timeout);\n updatesState.syncPending = null;\n }\n\n const promise = apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts, \n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date, \n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n \n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n \n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + serverTimeManager.serverTimeOffset;\n delete updatesState.seq;\n \n this.channelStates = {};\n \n this.log.warn('getDifference:', differenceResult._);\n rootScope.dispatchEvent('state_cleared');\n }\n \n // this.log('apply diff', updatesState.seq, updatesState.pts)\n \n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n \n return promise;\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n if(channelState.syncPending) {\n clearTimeout(channelState.syncPending.timeout);\n channelState.syncPending = null;\n }\n\n //this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = apiManager.invokeApi('updates.getChannelDifference', {\n channel: appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 30\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n this.debug && this.log.debug('Get channel diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n \n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n this.debug && this.log.debug('apply channel empty diff', differenceResult);\n return;\n }\n \n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n this.debug && this.log.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n \n appUsersManager.saveApiUsers(differenceResult.users);\n appChatsManager.saveApiChats(differenceResult.chats);\n \n // Should be first because of updateMessageID\n this.debug && this.log.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n \n this.debug && this.log.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n \n this.debug && this.log.debug('apply channel diff', channelState.pts);\n \n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags['final']) {\n return this.getChannelDifference(channelId);\n } else {\n this.debug && this.log.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n \n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n if(!(channelId in this.channelStates)) {\n this.channelStates[channelId] = {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n\n return true;\n }\n\n return false;\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n \n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n \n // this.log.log('process', channelId, curState.pts, update)\n \n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n \n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n \n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !appUsersManager.hasUser(appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n \n let popPts: boolean;\n let popSeq: boolean;\n \n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n \n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n \n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending && curState.syncPending.seqAwaiting);\n \n if(curState.pendingSeqUpdates[seqStart] === undefined) {\n curState.pendingSeqUpdates[seqStart] = {seq, date: options.date, updates: []};\n }\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n \n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: window.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n \n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n \n this.saveUpdate(update);\n \n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n //this.debug && this.log('saveUpdate', update);\n rootScope.dispatchEvent(update._, update as any);\n }\n \n public attach() {\n if(this.attached) return;\n\n //return;\n\n this.log('attach');\n \n this.attached = true;\n\n appStateManager.getState().then(({updates: state}) => {\n const newVersion = appStateManager.newVersion/* || '0.8.6' */;\n\n //rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n //setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n //rootScope.broadcast('state_synchronized');\n //}, 1000);\n \n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n /* state.date = 1628623682;\n state.pts = 2007500;\n state.seq = 503; */\n\n Object.assign(this.updatesState, state);\n \n this.log('will get difference', Object.assign({}, state));\n \n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version alpha ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = RichTextProcessor.parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n this.processLocalUpdate(update);\n })\n .catch(noop);\n });\n }\n });\n }\n}\n\nconst apiUpdatesManager = new ApiUpdatesManager();\nMOUNT_CLASS_TO.apiUpdatesManager = apiUpdatesManager;\nexport default apiUpdatesManager\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { FileURLType, getFileNameByLocation, getFileURL } from '../../helpers/fileName';\nimport { safeReplaceArrayInObject, defineNotNumerableProperties, isObject } from '../../helpers/object';\nimport { Document, InputFileLocation, InputMedia, PhotoSize } from '../../layer';\nimport referenceDatabase, { ReferenceContext } from '../mtproto/referenceDatabase';\nimport opusDecodeController from '../opusDecodeController';\nimport { RichTextProcessor } from '../richtextprocessor';\nimport appDownloadManager, { DownloadBlob } from './appDownloadManager';\nimport appPhotosManager from './appPhotosManager';\nimport blur from '../../helpers/blur';\nimport apiManager from '../mtproto/mtprotoworker';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { getFullDate } from '../../helpers/date';\nimport rootScope from '../rootScope';\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\nconst EXTENSION_MIME_TYPE_MAP = {\n mov: 'video/quicktime',\n gif: 'image/gif',\n pdf: 'application/pdf',\n};\n\nexport class AppDocsManager {\n private docs: {[docId: DocId]: MyDocument} = {};\n private savingLottiePreview: {[docId: DocId]: true} = {};\n public downloading: Map = new Map();\n\n constructor() {\n apiManager.onServiceWorkerFail = this.onServiceWorkerFail;\n }\n\n public onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n const cacheContext = appDownloadManager.getCacheContext(doc);\n delete cacheContext.url;\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(doc._ === 'documentEmpty') {\n return undefined;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n referenceDatabase.saveContext(doc.file_reference, context);\n }\n \n //console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name', \n // 'file', 'duration', 'downloaded', 'url', 'audioTitle', \n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw', \n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n doc.attributes.forEach(attribute => {\n switch(attribute._) {\n case 'documentAttributeFilename':\n doc.file_name = RichTextProcessor.wrapPlainText(attribute.file_name);\n doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n /* if(apiDoc.type === 'audio') {\n apiDoc.supportsStreaming = true;\n } */\n break;\n\n case 'documentAttributeVideo':\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n //apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n\n case 'documentAttributeSticker':\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n }\n break;\n\n case 'documentAttributeImageSize':\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n\n case 'documentAttributeAnimated':\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n });\n \n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n doc.file_name = doc.fileName = doc.type + '_' + getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n }\n\n if(apiManager.isServiceWorkerOnline()) {\n if((doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n \n const cacheContext = appDownloadManager.getCacheContext(doc);\n if(!cacheContext.url) {\n cacheContext.url = this.getFileURL(doc);\n }\n }\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n \n if(!doc.file_name) {\n doc.file_name = doc.fileName = '';\n }\n\n if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n \n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public getMediaInput(doc: MyDocument): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n }\n\n public getInput(doc: MyDocument, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n }\n\n public getFileDownloadOptions(doc: MyDocument, thumb?: PhotoSize.photoSize, queueId?: number, onlyCache?: boolean) {\n const inputFileLocation = this.getInput(doc, thumb?.type);\n\n let mimeType: string;\n if(thumb) {\n mimeType = doc.sticker ? 'image/webp' : 'image/jpeg'/* doc.mime_type */;\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id, \n location: inputFileLocation, \n size: thumb ? thumb.size : doc.size, \n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n }\n\n public getFileURL(doc: MyDocument, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, this.getFileDownloadOptions(doc, thumb));\n }\n\n public getThumbURL(doc: MyDocument, thumb: PhotoSize.photoSize | PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize) {\n let promise: Promise = Promise.resolve();\n\n const cacheContext = appDownloadManager.getCacheContext(doc, thumb.type);\n if(!cacheContext.url) {\n if('bytes' in thumb) {\n promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\n }) as any;\n } else {\n //return this.getFileURL(doc, false, thumb);\n promise = appPhotosManager.preloadPhoto(doc, thumb) as any;\n }\n }\n\n return {thumb, cacheContext, promise};\n }\n\n public getThumb(doc: MyDocument, tryNotToUseBytes = true) {\n const thumb = appPhotosManager.choosePhotoSize(doc, 0, 0, !tryNotToUseBytes);\n if(thumb._ === 'photoSizeEmpty') return null;\n return this.getThumbURL(doc, thumb as any);\n }\n\n public getInputFileName(doc: MyDocument, thumbSize?: string) {\n return getFileNameByLocation(this.getInput(doc, thumbSize), {fileName: doc.file_name});\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean): DownloadBlob {\n const fileName = this.getInputFileName(doc);\n\n let download: DownloadBlob = appDownloadManager.getDownload(fileName);\n if(download) {\n return download;\n }\n\n const downloadOptions = this.getFileDownloadOptions(doc, undefined, queueId, onlyCache);\n download = appDownloadManager.download(downloadOptions);\n this.downloading.set(doc.id, download);\n rootScope.dispatchEvent('download_start', doc.id);\n\n const cacheContext = appDownloadManager.getCacheContext(doc);\n const originalPromise = download;\n originalPromise.then((blob) => {\n cacheContext.url = URL.createObjectURL(blob);\n cacheContext.downloaded = blob.size;\n }, () => {}).finally(() => {\n this.downloading.delete(doc.id);\n });\n \n if(doc.type === 'voice' && !opusDecodeController.isPlaySupported()) {\n download = originalPromise.then(async(blob) => {\n const reader = new FileReader();\n \n await new Promise((resolve, reject) => {\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n //console.log('sending uint8 to decoder:', uint8);\n opusDecodeController.decode(uint8).then(result => {\n cacheContext.url = result.url;\n resolve();\n }, (err) => {\n delete cacheContext.downloaded;\n reject(err);\n });\n };\n \n reader.readAsArrayBuffer(blob);\n });\n \n return blob;\n });\n }\n\n download.then(() => {\n rootScope.dispatchEvent('document_downloaded', doc);\n });\n\n return download;\n }\n\n public saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n if(this.savingLottiePreview[key]/* || true */) return;\n\n if(!doc.stickerCachedThumbs) {\n defineNotNumerableProperties(doc, ['stickerCachedThumbs']);\n doc.stickerCachedThumbs = {};\n }\n\n const thumb = doc.stickerCachedThumbs[toneIndex];\n if(thumb && thumb.w >= canvas.width && thumb.h >= canvas.height) {\n return;\n }\n\n /* if(doc.thumbs.find(t => t._ === 'photoStrippedSize') \n || (doc.stickerCachedThumb || (doc.stickerSavedThumbWidth >= canvas.width && doc.stickerSavedThumbHeight >= canvas.height))) {\n return;\n } */\n\n this.savingLottiePreview[key] = true;\n canvas.toBlob((blob) => {\n //console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n const thumb = {\n url: URL.createObjectURL(blob),\n w: canvas.width,\n h: canvas.height\n };\n\n doc.stickerCachedThumbs[toneIndex] = thumb;\n\n delete this.savingLottiePreview[key];\n \n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice(t => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n });\n }\n\n public saveDocFile(doc: MyDocument, queueId?: number) {\n /* const options = this.getFileDownloadOptions(doc, undefined, queueId);\n return appDownloadManager.downloadToDisc(options, doc.file_name); */\n const promise = this.downloadDoc(doc, queueId);\n promise.then(() => {\n const cacheContext = appDownloadManager.getCacheContext(doc);\n appDownloadManager.createDownloadAnchor(cacheContext.url, doc.file_name);\n });\n return promise;\n }\n}\n\nconst appDocsManager = new AppDocsManager();\nMOUNT_CLASS_TO.appDocsManager = appDocsManager;\nexport default appDocsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ApplyServerTimeOffsetTask } from './timeManager';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\n// import { tsNow } from '../../helpers/date';\r\nimport sessionStorage from '../sessionStorage';\r\nimport apiManager from './mtprotoworker';\r\n\r\nexport class ServerTimeManager {\r\n /* private midnightNoOffset: number;\r\n private midnightOffseted: Date;\r\n\r\n private midnightOffset: number; */\r\n\r\n public serverTimeOffset: number; // in seconds\r\n /* private timeParams: {\r\n midnightOffset: number,\r\n serverTimeOffset: number\r\n }; */\r\n\r\n constructor() {\r\n /* const timestampNow = tsNow(true);\r\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\r\n this.midnightOffseted = new Date();\r\n this.midnightOffseted.setHours(0, 0, 0, 0);\r\n \r\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\r\n\r\n this.serverTimeOffset = 0;\r\n /* this.timeParams = {\r\n midnightOffset: this.midnightOffset,\r\n serverTimeOffset: this.serverTimeOffset\r\n }; */\r\n\r\n sessionStorage.get('server_time_offset').then((to) => {\r\n if(to) {\r\n this.serverTimeOffset = to;\r\n // this.timeParams.serverTimeOffset = to;\r\n }\r\n });\r\n\r\n apiManager.addTaskListener('applyServerTimeOffset', (task: ApplyServerTimeOffsetTask) => {\r\n this.serverTimeOffset = task.payload;\r\n });\r\n }\r\n}\r\n\r\nconst serverTimeManager = new ServerTimeManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\r\nexport default serverTimeManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\ntype TargetType = HTMLElement;\r\nexport type OnVisibilityChange = (target: TargetType, visible: boolean) => void;\r\n\r\nexport default class VisibilityIntersector {\r\n private observer: IntersectionObserver;\r\n private items: Map = new Map();\r\n private locked = false;\r\n\r\n constructor(onVisibilityChange: OnVisibilityChange) {\r\n this.observer = new IntersectionObserver((entries) => {\r\n if(this.locked) {\r\n return;\r\n }\r\n\r\n const changed: {target: TargetType, visible: boolean}[] = [];\r\n\r\n entries.forEach(entry => {\r\n const target = entry.target as TargetType;\r\n\r\n if(this.items.get(target) === entry.isIntersecting) {\r\n return;\r\n } else {\r\n this.items.set(target, entry.isIntersecting);\r\n }\r\n\r\n /* if(entry.isIntersecting) {\r\n console.log('ooo', entry);\r\n } */\r\n\r\n /* if(this.locked) {\r\n return;\r\n } */\r\n\r\n changed[entry.isIntersecting ? 'unshift' : 'push']({target, visible: entry.isIntersecting});\r\n\r\n //onVisibilityChange(target, entry.isIntersecting);\r\n });\r\n\r\n changed.forEach(smth => {\r\n onVisibilityChange(smth.target, smth.visible);\r\n });\r\n });\r\n }\r\n\r\n public getVisible() {\r\n const items: TargetType[] = [];\r\n this.items.forEach((value, key) => {\r\n if(value) {\r\n items.push(key);\r\n }\r\n });\r\n\r\n return items;\r\n }\r\n\r\n public clearVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.items.set(target, false);\r\n }\r\n }\r\n\r\n public isVisible(target: TargetType) {\r\n return this.items.get(target);\r\n }\r\n\r\n public disconnect() {\r\n this.observer.disconnect();\r\n this.items.clear();\r\n }\r\n\r\n public refresh() {\r\n this.observer.disconnect();\r\n\r\n //window.requestAnimationFrame(() => {\r\n const targets = [...this.items.keys()];\r\n for(const target of targets) {\r\n //this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n //});\r\n }\r\n\r\n public refreshVisible() {\r\n const visible = this.getVisible();\r\n for(const target of visible) {\r\n this.observer.unobserve(target);\r\n }\r\n\r\n for(const target of visible) {\r\n this.observer.observe(target);\r\n }\r\n }\r\n\r\n public observe(target: TargetType) {\r\n this.items.set(target, false);\r\n this.observer.observe(target);\r\n }\r\n\r\n public unobserve(target: TargetType) {\r\n this.observer.unobserve(target);\r\n this.items.delete(target);\r\n }\r\n\r\n public unlock() {\r\n this.locked = false;\r\n }\r\n\r\n public unlockAndRefresh() {\r\n this.unlock();\r\n this.refresh();\r\n }\r\n\r\n public lock() {\r\n this.locked = true;\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from \"../lib/logger\";\r\nimport VisibilityIntersector, { OnVisibilityChange } from \"./visibilityIntersector\";\r\nimport { findAndSpliceAll, indexOfAndSplice } from \"../helpers/array\";\r\nimport throttle from \"../helpers/schedulers/throttle\";\r\n\r\ntype LazyLoadElementBase = {\r\n load: () => Promise\r\n};\r\n\r\ntype LazyLoadElement = Omit & {\r\n load: (target?: HTMLElement) => Promise,\r\n div: HTMLElement\r\n wasSeen?: boolean,\r\n};\r\n\r\nconst PARALLEL_LIMIT = 8;\r\n\r\nexport class LazyLoadQueueBase {\r\n public queueId = 0;\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n protected lockPromise: Promise = null;\r\n protected unlockResolve: () => void = null;\r\n\r\n protected log = logger('LL', LogTypes.Error);\r\n protected processQueue: () => void;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n this.processQueue = throttle(() => this._processQueue(), 20, false);\r\n }\r\n\r\n public clear() {\r\n this.inProcess.clear(); // ацтеки забьются, будет плохо\r\n\r\n this.queue.length = 0;\r\n // unreachable code\r\n /* for(let item of this.inProcess) { \r\n this.lazyLoadMedia.push(item);\r\n } */\r\n }\r\n\r\n public lock() {\r\n if(this.lockPromise) return;\r\n\r\n //const perf = performance.now();\r\n this.lockPromise = new Promise((resolve, reject) => {\r\n this.unlockResolve = resolve;\r\n });\r\n\r\n /* if(DEBUG) {\r\n this.lockPromise.then(() => {\r\n this.log('was locked for:', performance.now() - perf);\r\n });\r\n } */\r\n }\r\n\r\n public unlock() {\r\n if(!this.unlockResolve) return;\r\n\r\n this.unlockResolve();\r\n this.unlockResolve = this.lockPromise = null;\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected async processItem(item: LazyLoadElementBase) {\r\n if(this.lockPromise) {\r\n return;\r\n }\r\n\r\n this.inProcess.add(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('will load media', this.lockPromise, item);\r\n } */\r\n\r\n try {\r\n //await new Promise((resolve) => setTimeout(resolve, 2e3));\r\n //await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\r\n //await item.load(item.div);\r\n await this.loadItem(item);\r\n } catch(err) {\r\n if(!['NO_ENTRY_FOUND', 'STORAGE_OFFLINE'].includes(err as string)) {\r\n this.log.error('loadMediaQueue error:', err/* , item */);\r\n }\r\n }\r\n\r\n this.inProcess.delete(item);\r\n\r\n /* if(DEBUG) {\r\n this.log('loaded media', item);\r\n } */\r\n\r\n this.processQueue();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElementBase) {\r\n return item.load();\r\n }\r\n\r\n protected getItem() {\r\n return this.queue.shift();\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\r\n this.queue[method](el);\r\n this.processQueue();\r\n }\r\n\r\n protected _processQueue(item?: LazyLoadElementBase) {\r\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\r\n\r\n //console.log('_processQueue start');\r\n let added = 0;\r\n do {\r\n if(item) {\r\n indexOfAndSplice(this.queue, item);\r\n } else {\r\n item = this.getItem();\r\n }\r\n \r\n if(item) {\r\n this.processItem(item);\r\n } else {\r\n break;\r\n }\r\n\r\n item = null;\r\n ++added;\r\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\r\n //console.log('_processQueue end, added', added, this.queue.length);\r\n }\r\n\r\n public push(el: LazyLoadElementBase) {\r\n this.addElement('push', el);\r\n }\r\n\r\n public unshift(el: LazyLoadElementBase) {\r\n this.addElement('unshift', el);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueIntersector extends LazyLoadQueueBase {\r\n protected queue: Array = [];\r\n protected inProcess: Set = new Set();\r\n\r\n public intersector: VisibilityIntersector;\r\n protected intersectorTimeout: number;\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n }\r\n\r\n public lock() {\r\n super.lock();\r\n this.intersector.lock();\r\n }\r\n\r\n public unlock() {\r\n super.unlock();\r\n this.intersector.unlock();\r\n }\r\n\r\n public unlockAndRefresh() {\r\n super.unlock();\r\n this.intersector.unlockAndRefresh();\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this.intersector.disconnect();\r\n }\r\n\r\n public refresh() {\r\n this.intersector.refresh();\r\n }\r\n\r\n protected loadItem(item: LazyLoadElement) {\r\n return item.load(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const item = this.queue.find(i => i.div === el.div && i.load === el.load);\r\n if(item) {\r\n return false;\r\n } else {\r\n for(const item of this.inProcess) {\r\n if(item.div === el.div && item.load === el.load) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n this.queue[method](el);\r\n return true;\r\n }\r\n\r\n protected setProcessQueueTimeout() {\r\n if(!this.intersectorTimeout) {\r\n this.intersectorTimeout = window.setTimeout(() => {\r\n this.intersectorTimeout = 0;\r\n this.processQueue();\r\n }, 0);\r\n }\r\n }\r\n\r\n public push(el: LazyLoadElement) {\r\n super.push(el);\r\n }\r\n\r\n public unshift(el: LazyLoadElement) {\r\n super.unshift(el);\r\n }\r\n\r\n public unobserve(el: HTMLElement) {\r\n findAndSpliceAll(this.queue, (i) => i.div === el);\r\n\r\n this.intersector.unobserve(el);\r\n }\r\n}\r\n\r\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\r\n }\r\n\r\n private onVisibilityChange = (target: HTMLElement, visible: boolean) => {\r\n if(visible) {\r\n /* if(DEBUG) {\r\n this.log('isIntersecting', target);\r\n } */\r\n\r\n // need for set element first if scrolled\r\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach(item => {\r\n item.wasSeen = true;\r\n this.queue.unshift(item);\r\n //this.processQueue(item);\r\n });\r\n\r\n this.setProcessQueueTimeout();\r\n }\r\n };\r\n\r\n protected getItem() {\r\n return this.queue.findAndSplice(item => item.wasSeen);\r\n }\r\n\r\n public async processItem(item: LazyLoadElement) {\r\n await super.processItem(item);\r\n this.intersector.unobserve(item.div);\r\n }\r\n\r\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\r\n const inserted = super.addElement(method, el);\r\n\r\n if(!inserted) return false;\r\n\r\n this.intersector.observe(el.div);\r\n /* if(el.wasSeen) {\r\n this.processQueue(el);\r\n } else */if(!el.hasOwnProperty('wasSeen')) {\r\n el.wasSeen = false;\r\n }\r\n \r\n return true;\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\r\n private _queue: Map = new Map();\r\n\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible) {\r\n const items = spliced.length ? spliced : [this._queue.get(target)];\r\n items.forEach(item => {\r\n this.queue.unshift(item || this._queue.get(target));\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public clear() {\r\n super.clear();\r\n this._queue.clear();\r\n }\r\n\r\n /* public async processItem(item: LazyLoadElement) {\r\n //await super.processItem(item);\r\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\r\n\r\n if(this.lazyLoadMedia.length) {\r\n this.processQueue();\r\n }\r\n } */\r\n\r\n public observe(el: LazyLoadElement) {\r\n this._queue.set(el.div, el);\r\n this.intersector.observe(el.div);\r\n }\r\n}\r\n\r\nexport class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\r\n constructor(protected parallelLimit = PARALLEL_LIMIT, protected onVisibilityChange?: OnVisibilityChange) {\r\n super(parallelLimit);\r\n\r\n this.intersector = new VisibilityIntersector((target, visible) => {\r\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\r\n if(visible && spliced.length) {\r\n spliced.forEach(item => {\r\n this.queue.unshift(item);\r\n });\r\n }\r\n \r\n this.onVisibilityChange && this.onVisibilityChange(target, visible);\r\n this.setProcessQueueTimeout();\r\n });\r\n }\r\n\r\n public observe(el: HTMLElement) {\r\n this.intersector.observe(el);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { HelpCountry, HelpCountryCode } from \"../layer\";\nimport I18n from \"../lib/langPack\";\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n \n if(!prefixes.size) {\n I18n.countriesList.forEach(country => {\n country.country_codes.forEach(code => {\n const s = {country, code};\n\n if(code.prefixes) {\n code.prefixes.forEach(prefix => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n let phoneCode = str.slice(0, maxPrefixLength);\n \n ////console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n \n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str, \n country: undefined, \n code: undefined, \n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n \n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k] || _pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n \n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","export default function assumeType(x: unknown): asserts x is T {\r\n return; // ¯\\_(ツ)_/¯\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport class WindowSize {\n public width = 0;\n public height = 0;\n\n constructor() {\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport class AppMessagesIdsManager {\r\n private static MESSAGE_ID_INCREMENT = 0x10000;\r\n private static MESSAGE_ID_OFFSET = 0xFFFFFFFF;\r\n\r\n private tempNum = 0;\r\n\r\n public generateMessageId(messageId: number, temp = false) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n const num = temp ? ++this.tempNum : 0;\r\n if(messageId >= q) {\r\n if(temp) {\r\n return messageId + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1));\r\n }\r\n\r\n return messageId;\r\n }\r\n\r\n return q + (messageId * AppMessagesIdsManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1)));\r\n }\r\n\r\n /**\r\n * * will ignore outgoing offset\r\n */\r\n public getServerMessageId(messageId: number) {\r\n return this.clearMessageId(messageId, true);\r\n }\r\n\r\n public clearMessageId(messageId: number, toServer?: boolean) {\r\n const q = AppMessagesIdsManager.MESSAGE_ID_OFFSET;\r\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\r\n return messageId;\r\n }\r\n\r\n const l = AppMessagesIdsManager.MESSAGE_ID_INCREMENT - 1;\r\n const used = messageId & l;\r\n if(used !== l) {\r\n messageId -= used + 1;\r\n }\r\n\r\n return toServer ? (messageId - q) / AppMessagesIdsManager.MESSAGE_ID_INCREMENT : messageId;\r\n }\r\n\r\n public incrementMessageId(messageId: number, increment: number) {\r\n return this.generateMessageId(this.getServerMessageId(messageId) + increment);\r\n }\r\n}\r\n\r\nconst appMessagesIdsManager = new AppMessagesIdsManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appMessagesIdsManager = appMessagesIdsManager);\r\nexport default appMessagesIdsManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { fontFamily } from \"../../components/middleEllipsis\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { convertInputKeyToKey } from \"../../helpers/string\";\r\nimport { IS_MOBILE } from \"../../environment/userAgent\";\r\nimport { InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update } from \"../../layer\";\r\nimport I18n from \"../langPack\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport webPushApiManager, { PushSubscriptionNotify } from \"../mtproto/webPushApiManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appChatsManager from \"./appChatsManager\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appRuntimeManager from \"./appRuntimeManager\";\r\nimport appStateManager from \"./appStateManager\";\r\nimport appUsersManager from \"./appUsersManager\";\r\nimport IS_VIBRATE_SUPPORTED from \"../../environment/vibrateSupport\";\r\n\r\ntype MyNotification = Notification & {\r\n hidden?: boolean,\r\n show?: () => void,\r\n};\r\n\r\nexport type NotifyOptions = Partial<{\r\n tag: string;\r\n image: string;\r\n key: string;\r\n title: string;\r\n message: string;\r\n silent: boolean;\r\n onclick: () => void;\r\n}>;\r\n\r\nexport type NotificationSettings = {\r\n nodesktop: boolean,\r\n volume: number,\r\n novibrate: boolean,\r\n nopreview: boolean,\r\n nopush: boolean,\r\n nosound: boolean\r\n};\r\n\r\ntype ImSadAboutIt = Promise | PeerNotifySettings;\r\nexport class AppNotificationsManager {\r\n private notificationsUiSupport: boolean;\r\n private notificationsShown: {[key: string]: MyNotification | true} = {};\r\n private notificationIndex = 0;\r\n private notificationsCount = 0;\r\n private soundsPlayed: {[tag: string]: number} = {};\r\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\r\n private nextSoundAt: number;\r\n private prevSoundVolume: number;\r\n private peerSettings = {\r\n notifyPeer: {} as {[peerId: PeerId]: ImSadAboutIt},\r\n notifyUsers: null as ImSadAboutIt,\r\n notifyChats: null as ImSadAboutIt,\r\n notifyBroadcasts: null as ImSadAboutIt\r\n };\r\n //private exceptions: {[peerId: string]: PeerNotifySettings} = {};\r\n private notifyContactsSignUp: Promise;\r\n private faviconEl: HTMLLinkElement = document.head.querySelector('link[rel=\"icon\"]');\r\n\r\n private titleBackup = document.title;\r\n private titleChanged = false;\r\n private titleInterval: number;\r\n private prevFavicon: string;\r\n private stopped = false;\r\n\r\n private settings: NotificationSettings = {} as any;\r\n\r\n private registeredDevice: any;\r\n private pushInited = false;\r\n\r\n private topMessagesDeferred: CancellablePromise;\r\n\r\n private notifySoundEl: HTMLElement;\r\n\r\n private getNotifyPeerTypePromise: Promise;\r\n\r\n constructor() {\r\n // @ts-ignore\r\n navigator.vibrate = navigator.vibrate || navigator.mozVibrate || navigator.webkitVibrate;\r\n\r\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\r\n\r\n this.topMessagesDeferred = deferredPromise();\r\n\r\n this.notifySoundEl = document.createElement('div');\r\n this.notifySoundEl.id = 'notify-sound';\r\n document.body.append(this.notifySoundEl);\r\n\r\n rootScope.addEventListener('instance_deactivated', () => {\r\n this.stop();\r\n });\r\n\r\n rootScope.addEventListener('instance_activated', () => {\r\n if(this.stopped) {\r\n this.start();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('idle', (newVal) => {\r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n if(!newVal) {\r\n this.clear();\r\n }\r\n\r\n this.toggleToggler();\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateNotifySettings: (update) => {\r\n const peerId = update.peer._ === 'notifyPeer' && appPeersManager.getPeerId(update.peer.peer);\r\n const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined;\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings: update.notify_settings\r\n });\r\n rootScope.dispatchEvent('notify_settings', update);\r\n }\r\n });\r\n\r\n rootScope.addEventListener('push_init', (tokenData) => {\r\n this.pushInited = true;\r\n if(!this.settings.nodesktop && !this.settings.nopush) {\r\n if(tokenData) {\r\n this.registerDevice(tokenData);\r\n } else {\r\n webPushApiManager.subscribe();\r\n }\r\n } else {\r\n this.unregisterDevice(tokenData);\r\n }\r\n });\r\n rootScope.addEventListener('push_subscribe', (tokenData) => {\r\n this.registerDevice(tokenData);\r\n });\r\n rootScope.addEventListener('push_unsubscribe', (tokenData) => {\r\n this.unregisterDevice(tokenData);\r\n });\r\n\r\n rootScope.addEventListener('dialogs_multiupdate', () => {\r\n //unregisterTopMsgs()\r\n this.topMessagesDeferred.resolve();\r\n }, {once: true});\r\n\r\n rootScope.addEventListener('push_notification_click', (notificationData) => {\r\n if(notificationData.action === 'push_settings') {\r\n /* this.topMessagesDeferred.then(() => {\r\n $modal.open({\r\n templateUrl: templateUrl('settings_modal'),\r\n controller: 'SettingsModalController',\r\n windowClass: 'settings_modal_window mobile_modal',\r\n backdrop: 'single'\r\n })\r\n }); */\r\n return;\r\n }\r\n\r\n if(notificationData.action === 'mute1d') {\r\n apiManager.invokeApi('account.updateDeviceLocked', {\r\n period: 86400\r\n }).then(() => {\r\n // var toastData = toaster.pop({\r\n // type: 'info',\r\n // body: _('push_action_mute1d_success'),\r\n // bodyOutputType: 'trustedHtml',\r\n // clickHandler: () => {\r\n // toaster.clear(toastData)\r\n // },\r\n // showCloseButton: false\r\n // })\r\n });\r\n\r\n return;\r\n }\r\n\r\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\r\n console.log('click', notificationData, peerId);\r\n if(peerId) {\r\n this.topMessagesDeferred.then(() => {\r\n if(notificationData.custom.channel_id &&\r\n !appChatsManager.hasChat(notificationData.custom.channel_id)) {\r\n return;\r\n }\r\n\r\n if(peerId.isUser() && !appUsersManager.hasUser(peerId)) {\r\n return;\r\n }\r\n\r\n rootScope.dispatchEvent('history_focus', {\r\n peerId,\r\n mid: +notificationData.custom.msg_id\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private toggleToggler(enable = rootScope.idle.isIDLE) {\r\n if(IS_MOBILE) return;\r\n\r\n const resetTitle = () => {\r\n this.titleChanged = false;\r\n document.title = this.titleBackup;\r\n this.setFavicon();\r\n };\r\n\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n\r\n if(!enable) {\r\n resetTitle();\r\n } else {\r\n this.titleInterval = window.setInterval(() => {\r\n const count = this.notificationsCount;\r\n if(!count) {\r\n this.toggleToggler(false);\r\n } else if(this.titleChanged) {\r\n resetTitle();\r\n } else {\r\n this.titleChanged = true;\r\n document.title = I18n.format('Notifications.Count', true, [count]);\r\n //this.setFavicon('assets/img/favicon_unread.ico');\r\n\r\n // fetch('assets/img/favicon.ico')\r\n // .then(res => res.blob())\r\n // .then(blob => {\r\n // const img = document.createElement('img');\r\n // img.src = URL.createObjectURL(blob);\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = 32 * window.devicePixelRatio;\r\n canvas.height = canvas.width;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.beginPath();\r\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\r\n ctx.fillStyle = '#3390ec';\r\n ctx.fill();\r\n\r\n let fontSize = 24;\r\n let str = '' + count;\r\n if(count < 10) {\r\n fontSize = 22;\r\n } else if(count < 100) {\r\n fontSize = 20;\r\n } else {\r\n str = '99+';\r\n fontSize = 16;\r\n }\r\n\r\n fontSize *= window.devicePixelRatio;\r\n \r\n ctx.font = `700 ${fontSize}px ${fontFamily}`;\r\n ctx.textBaseline = 'middle';\r\n ctx.textAlign = 'center';\r\n ctx.fillStyle = 'white';\r\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\r\n\r\n /* const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\r\n \r\n this.setFavicon(canvas.toDataURL());\r\n // });\r\n }\r\n }, 1000);\r\n }\r\n }\r\n\r\n public updateLocalSettings = () => {\r\n Promise.all(['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'].map(k => stateStorage.get(k as any)))\r\n .then((updSettings) => {\r\n this.settings.nodesktop = updSettings[0];\r\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\r\n this.settings.novibrate = updSettings[2];\r\n this.settings.nopreview = updSettings[3];\r\n this.settings.nopush = updSettings[4];\r\n\r\n if(this.pushInited) {\r\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\r\n const hasPush = this.registeredDevice !== false;\r\n if(needPush !== hasPush) {\r\n if(needPush) {\r\n webPushApiManager.subscribe();\r\n } else {\r\n webPushApiManager.unsubscribe();\r\n }\r\n }\r\n }\r\n\r\n webPushApiManager.setSettings(this.settings);\r\n });\r\n\r\n appStateManager.getState().then(state => {\r\n this.settings.nosound = !state.settings.notifications.sound;\r\n });\r\n }\r\n\r\n public getLocalSettings() {\r\n return this.settings;\r\n }\r\n\r\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\r\n let key: any = convertInputKeyToKey(peer._);\r\n let obj: any = this.peerSettings[key as NotifyPeer['_']];\r\n\r\n let peerId: PeerId;\r\n if(peer._ === 'inputNotifyPeer') {\r\n peerId = key = appPeersManager.getPeerId(peer.peer);\r\n obj = obj[key];\r\n }\r\n\r\n if(obj) {\r\n return obj;\r\n }\r\n\r\n return (obj || this.peerSettings)[key] = apiManager.invokeApi('account.getNotifySettings', {peer})\r\n .then(settings => {\r\n this.savePeerSettings({\r\n key,\r\n peerId, \r\n settings\r\n });\r\n \r\n return settings;\r\n });\r\n }\r\n\r\n public getNotifyPeerTypeSettings() {\r\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\r\n\r\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as Exclude[])\r\n .map((inputKey) => {\r\n return this.getNotifySettings({_: inputKey});\r\n });\r\n\r\n return this.getNotifyPeerTypePromise = Promise.all(promises);\r\n }\r\n\r\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\r\n //this.savePeerSettings(peerId, settings);\r\n\r\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\r\n inputSettings._ = 'inputPeerNotifySettings'; */\r\n\r\n return apiManager.invokeApi('account.updateNotifySettings', {\r\n peer,\r\n settings\r\n }).then(value => {\r\n if(value) {\r\n apiUpdatesManager.processLocalUpdate({\r\n _: 'updateNotifySettings', \r\n peer: {\r\n ...peer as any,\r\n _: convertInputKeyToKey(peer._)\r\n }, \r\n notify_settings: { // ! WOW, IT WORKS !\r\n ...settings,\r\n _: 'peerNotifySettings',\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n public getNotifyExceptions() {\r\n apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\r\n .then((updates) => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getContactSignUpNotification() {\r\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\r\n return this.notifyContactsSignUp = apiManager.invokeApi('account.getContactSignUpNotification');\r\n }\r\n\r\n public setContactSignUpNotification(silent: boolean) {\r\n apiManager.invokeApi('account.setContactSignUpNotification', {silent})\r\n .then(value => {\r\n this.notifyContactsSignUp = Promise.resolve(!silent);\r\n });\r\n }\r\n\r\n private setFavicon(href: string = 'assets/img/favicon.ico') {\r\n if(this.prevFavicon === href) {\r\n return;\r\n }\r\n\r\n const link = this.faviconEl.cloneNode() as HTMLLinkElement;\r\n link.href = href;\r\n this.faviconEl.parentNode.replaceChild(link, this.faviconEl);\r\n this.faviconEl = link;\r\n\r\n this.prevFavicon = href;\r\n }\r\n\r\n public savePeerSettings({key, peerId, settings}: {\r\n key?: Exclude,\r\n peerId?: PeerId, \r\n settings: PeerNotifySettings\r\n }) {\r\n let obj: any;\r\n if(peerId) {\r\n key = peerId as any;\r\n obj = this.peerSettings['notifyPeer'];\r\n }\r\n \r\n (obj || this.peerSettings)[key] = settings;\r\n\r\n if(!peerId) {\r\n rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\r\n }\r\n\r\n //rootScope.broadcast('notify_settings', {peerId: peerId});\r\n }\r\n\r\n public isMuted(peerNotifySettings: PeerNotifySettings) {\r\n return peerNotifySettings._ === 'peerNotifySettings' &&\r\n ((peerNotifySettings.mute_until * 1000) > tsNow() || peerNotifySettings.silent);\r\n }\r\n\r\n public getPeerMuted(peerId: PeerId) {\r\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: appPeersManager.getInputPeerById(peerId)});\r\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\r\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\r\n }\r\n\r\n public getPeerLocalSettings(peerId: PeerId, respectType = true): PeerNotifySettings {\r\n const n: PeerNotifySettings = {\r\n _: 'peerNotifySettings'\r\n };\r\n\r\n const notifySettings = this.peerSettings['notifyPeer'][peerId];\r\n //if(!notifySettings || (notifySettings instanceof Promise)) return false;\r\n if(notifySettings && !(notifySettings instanceof Promise)) {\r\n Object.assign(n, notifySettings);\r\n }\r\n\r\n if(respectType) {\r\n const inputNotify = appPeersManager.getInputNotifyPeerById(peerId, true);\r\n const key = convertInputKeyToKey(inputNotify._);\r\n const typeNotifySettings = this.peerSettings[key as NotifyPeer['_']];\r\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\r\n for(let i in typeNotifySettings) {\r\n // @ts-ignore\r\n if(n[i] === undefined) {\r\n // @ts-ignore\r\n n[i] = typeNotifySettings[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return n;\r\n }\r\n\r\n public isPeerLocalMuted(peerId: PeerId, respectType = true) {\r\n if(peerId === rootScope.myId) return false;\r\n\r\n const notifySettings = this.getPeerLocalSettings(peerId, respectType);\r\n return this.isMuted(notifySettings);\r\n }\r\n\r\n public start() {\r\n this.updateLocalSettings();\r\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\r\n webPushApiManager.start();\r\n\r\n if(!this.notificationsUiSupport) {\r\n return false;\r\n }\r\n\r\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\r\n window.addEventListener('click', this.requestPermission);\r\n }\r\n\r\n try {\r\n if('onbeforeunload' in window) {\r\n window.addEventListener('beforeunload', this.clear);\r\n }\r\n } catch (e) {}\r\n }\r\n\r\n private stop() {\r\n this.clear();\r\n window.clearInterval(this.titleInterval);\r\n this.titleInterval = 0;\r\n this.setFavicon();\r\n this.stopped = true;\r\n }\r\n\r\n private requestPermission = () => {\r\n Notification.requestPermission();\r\n window.removeEventListener('click', this.requestPermission);\r\n };\r\n\r\n public notify(data: NotifyOptions) {\r\n //console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\r\n \r\n if(this.stopped) {\r\n return;\r\n }\r\n\r\n // FFOS Notification blob src bug workaround\r\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\r\n data.image = 'https://telegram.org/img/t_logo.png'\r\n }\r\n else if (data.image && !angular.isString(data.image)) {\r\n if (Config.Navigator.ffos2p) {\r\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\r\n data.image = url\r\n notify(data)\r\n })\r\n return false\r\n } else {\r\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\r\n }\r\n }\r\n else */ if(!data.image) {\r\n data.image = 'assets/img/logo_filled_rounded.png';\r\n }\r\n // console.log('notify image', data.image)\r\n\r\n this.notificationsCount++;\r\n if(!this.titleInterval) {\r\n this.toggleToggler();\r\n }\r\n\r\n const idx = ++this.notificationIndex;\r\n const key = data.key || 'k' + idx;\r\n this.notificationsShown[key] = true;\r\n\r\n const now = tsNow();\r\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\r\n (\r\n !data.tag ||\r\n !this.soundsPlayed[data.tag] ||\r\n now > this.soundsPlayed[data.tag] + 60000\r\n ) */\r\n ) {\r\n this.testSound(this.settings.volume);\r\n this.soundsPlayed[data.tag] = now;\r\n }\r\n\r\n if(!this.notificationsUiSupport ||\r\n 'Notification' in window && Notification.permission !== 'granted') {\r\n return false;\r\n }\r\n\r\n if(this.settings.nodesktop) {\r\n if(this.vibrateSupport && !this.settings.novibrate) {\r\n navigator.vibrate([200, 100, 200]);\r\n return;\r\n }\r\n\r\n return;\r\n }\r\n\r\n let notification: MyNotification;\r\n\r\n if('Notification' in window) {\r\n try {\r\n if(data.tag) {\r\n for(let i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\r\n notification.hidden = true;\r\n }\r\n }\r\n }\r\n\r\n notification = new Notification(data.title, {\r\n icon: data.image || '',\r\n body: data.message || '',\r\n tag: data.tag || '',\r\n silent: data.silent || false\r\n });\r\n\r\n //console.log('notify constructed notification');\r\n } catch(e) {\r\n this.notificationsUiSupport = false;\r\n webPushApiManager.setLocalNotificationsDisabled();\r\n return;\r\n }\r\n } /* else if('mozNotification' in navigator) {\r\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\r\n } else if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\r\n window.external.msSiteModeActivate()\r\n notification = {\r\n index: idx\r\n }\r\n } */ else {\r\n return;\r\n }\r\n\r\n notification.onclick = () => {\r\n notification.close();\r\n appRuntimeManager.focus();\r\n this.clear();\r\n if(data.onclick) {\r\n data.onclick();\r\n }\r\n };\r\n\r\n notification.onclose = () => {\r\n if(!notification.hidden) {\r\n delete this.notificationsShown[key];\r\n this.clear();\r\n }\r\n };\r\n\r\n if(notification.show) {\r\n notification.show();\r\n }\r\n this.notificationsShown[key] = notification;\r\n\r\n if(!IS_MOBILE) {\r\n setTimeout(() => {\r\n this.hide(key);\r\n }, 8000);\r\n }\r\n }\r\n\r\n public testSound(volume: number) {\r\n const now = tsNow();\r\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\r\n return;\r\n }\r\n\r\n this.nextSoundAt = now + 1000;\r\n this.prevSoundVolume = volume;\r\n const filename = 'assets/audio/notification.mp3';\r\n const audio = document.createElement('audio');\r\n audio.autoplay = true;\r\n audio.setAttribute('mozaudiochannel', 'notification');\r\n audio.volume = volume;\r\n audio.innerHTML = `\r\n \r\n \r\n `;\r\n this.notifySoundEl.append(audio);\r\n\r\n audio.addEventListener('ended', () => {\r\n audio.remove();\r\n }, {once: true});\r\n }\r\n\r\n public cancel(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification) {\r\n if(this.notificationsCount > 0) {\r\n --this.notificationsCount;\r\n }\r\n\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }/* else if(notificationsMsSiteMode &&\r\n notification.index === notificationIndex) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } */\r\n } catch(e) {}\r\n\r\n delete this.notificationsShown[key];\r\n }\r\n }\r\n\r\n private hide(key: string) {\r\n const notification = this.notificationsShown[key];\r\n if(notification && typeof(notification) !== 'boolean') {\r\n try {\r\n if(notification.close) {\r\n notification.hidden = true;\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n }\r\n\r\n public soundReset(tag: string) {\r\n delete this.soundsPlayed[tag];\r\n }\r\n\r\n public clear() {\r\n /* if(notificationsMsSiteMode) {\r\n window.external.msSiteModeClearIconOverlay()\r\n } else { */\r\n for(const i in this.notificationsShown) {\r\n const notification = this.notificationsShown[i];\r\n try {\r\n if(typeof(notification) !== 'boolean' && notification.close) {\r\n notification.close();\r\n }\r\n } catch(e) {}\r\n }\r\n /* } */\r\n this.notificationsShown = {};\r\n this.notificationsCount = 0;\r\n\r\n webPushApiManager.hidePushNotifications();\r\n }\r\n\r\n private registerDevice(tokenData: PushSubscriptionNotify) {\r\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.registerDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: [],\r\n app_sandbox: false,\r\n secret: new Uint8Array()\r\n }).then(() => {\r\n this.registeredDevice = tokenData;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\r\n if(!this.registeredDevice) {\r\n return false;\r\n }\r\n\r\n apiManager.invokeApi('account.unregisterDevice', {\r\n token_type: tokenData.tokenType,\r\n token: tokenData.tokenValue,\r\n other_uids: []\r\n }).then(() => {\r\n this.registeredDevice = false;\r\n }, (error) => {\r\n error.handled = true;\r\n });\r\n }\r\n\r\n public getVibrateSupport() {\r\n return this.vibrateSupport\r\n }\r\n}\r\n\r\nconst appNotificationsManager = new AppNotificationsManager();\r\nMOUNT_CLASS_TO.appNotificationsManager = appNotificationsManager;\r\nexport default appNotificationsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, \n url: string, \n callback?: (err?: Event) => void, \n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback && callback();\n return;\n }\n\n if(((loadedURLs[url]/* && false */) && useCache) || elem instanceof HTMLVideoElement) {\n if(elem) {\n set(elem, url);\n }\n \n callback && callback();\n // callback && getHeavyAnimationPromise().then(() => callback());\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n //const loader = new Image();\n loader.src = url;\n //let perf = performance.now();\n loader.addEventListener('load', () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n //console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback && callback();\n }, {once: true});\n\n if(callback) {\n loader.addEventListener('error', callback);\n }\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport SetTransition from \"./singleTransition\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { safeAssign } from \"../helpers/object\";\r\nimport { cancelEvent } from \"../helpers/dom/cancelEvent\";\r\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\n\r\nconst TRANSITION_TIME = 200;\r\n\r\nexport default class ProgressivePreloader {\r\n public preloader: HTMLDivElement;\r\n public circle: SVGCircleElement;\r\n private cancelSvg: SVGSVGElement;\r\n private downloadSvg: HTMLElement;\r\n \r\n private tempId = 0;\r\n public detached = true;\r\n\r\n public promise: CancellablePromise = null;\r\n\r\n public isUpload = false;\r\n private cancelable = true;\r\n private streamable = false;\r\n private tryAgainOnFail = true;\r\n private attachMethod: 'append' | 'prepend' = 'append';\r\n\r\n public loadFunc: (e?: Event) => {download: CancellablePromise};\r\n\r\n public totalLength: number;\r\n\r\n constructor(options?: Partial<{\r\n isUpload: ProgressivePreloader['isUpload'],\r\n cancelable: ProgressivePreloader['cancelable'], \r\n streamable: ProgressivePreloader['streamable'], \r\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\r\n attachMethod: ProgressivePreloader['attachMethod']\r\n }>) {\r\n if(options) {\r\n safeAssign(this, options);\r\n }\r\n }\r\n\r\n public constructContainer(options: Partial<{\r\n color: 'transparent',\r\n bold: boolean\r\n }> = {}) {\r\n if(!this.preloader) {\r\n this.preloader = document.createElement('div');\r\n this.preloader.classList.add('preloader-container');\r\n\r\n if(options.color) {\r\n this.preloader.classList.add('preloader-' + options.color);\r\n }\r\n\r\n if(options.bold) {\r\n this.preloader.classList.add('preloader-bold');\r\n }\r\n \r\n if(this.streamable) {\r\n this.preloader.classList.add('preloader-streamable');\r\n }\r\n }\r\n }\r\n\r\n public constructDownloadIcon() {\r\n this.constructContainer();\r\n }\r\n\r\n public construct() {\r\n this.construct = null;\r\n\r\n this.constructContainer();\r\n \r\n this.preloader.innerHTML = `\r\n
\r\n \r\n \r\n \r\n
`;\r\n\r\n if(this.streamable) {\r\n this.totalLength = 118.61124420166016;\r\n } else {\r\n this.totalLength = 149.82473754882812;\r\n }\r\n\r\n if(this.cancelable) {\r\n this.preloader.innerHTML += `\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n `;\r\n\r\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\r\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\r\n } else {\r\n this.preloader.classList.add('preloader-swing');\r\n }\r\n \r\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\r\n\r\n if(this.cancelable) {\r\n attachClickEvent(this.preloader, this.onClick);\r\n }\r\n }\r\n\r\n public onClick = (e?: Event) => {\r\n if(e) {\r\n cancelEvent(e);\r\n }\r\n\r\n if(this.preloader.classList.contains('manual')) {\r\n if(this.loadFunc) {\r\n this.loadFunc(e);\r\n }\r\n } else {\r\n if(this.promise && this.promise.cancel) {\r\n this.promise.cancel();\r\n }\r\n }\r\n };\r\n\r\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\r\n this.loadFunc = func;\r\n }\r\n\r\n public setManual() {\r\n this.preloader.classList.add('manual');\r\n this.setProgress(0);\r\n }\r\n\r\n public attachPromise(promise: CancellablePromise) {\r\n if(this.isUpload && this.promise) return;\r\n\r\n this.promise = promise;\r\n\r\n const tempId = --this.tempId;\r\n const startTime = Date.now();\r\n\r\n const onEnd = (err: Error) => {\r\n promise.notify = promise.notifyAll = null;\r\n\r\n if(tempId !== this.tempId) {\r\n return;\r\n }\r\n\r\n const elapsedTime = Date.now() - startTime;\r\n\r\n //console.log('[PP]: end', this.detached, performance.now());\r\n\r\n if(!err && this.cancelable) {\r\n this.setProgress(100);\r\n\r\n const delay = TRANSITION_TIME * 0.75;\r\n\r\n if(elapsedTime < delay) {\r\n this.detach();\r\n } else {\r\n setTimeout(() => { // * wait for transition complete\r\n if(tempId === this.tempId) {\r\n this.detach();\r\n }\r\n }, delay);\r\n }\r\n } else {\r\n if(this.tryAgainOnFail) {\r\n this.attach(this.preloader.parentElement);\r\n fastRaf(() => {\r\n this.setManual();\r\n });\r\n } else {\r\n this.detach();\r\n }\r\n }\r\n \r\n this.promise = promise = null;\r\n };\r\n \r\n promise\r\n .then(() => onEnd(null))\r\n .catch((err) => onEnd(err));\r\n\r\n if(promise.addNotifyListener) {\r\n promise.addNotifyListener((details: {done: number, total: number}) => {\r\n /* if(details.done >= details.total) {\r\n onEnd();\r\n } */\r\n\r\n if(tempId !== this.tempId) return;\r\n\r\n //console.log('preloader download', promise, details);\r\n const percents = details.done / details.total * 100;\r\n this.setProgress(percents);\r\n });\r\n }\r\n }\r\n\r\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\r\n if(this.construct) {\r\n this.construct();\r\n }\r\n\r\n if(this.preloader.parentElement) {\r\n this.preloader.classList.remove('manual');\r\n }\r\n\r\n this.detached = false;\r\n\r\n if(promise/* && false */) {\r\n this.attachPromise(promise);\r\n }\r\n\r\n if(this.detached || this.preloader.parentElement !== elem) {\r\n const useRafs = isInDOM(this.preloader) ? 1 : 2;\r\n if(this.preloader.parentElement !== elem) {\r\n elem[this.attachMethod](this.preloader);\r\n }\r\n\r\n SetTransition(this.preloader, 'is-visible', true, TRANSITION_TIME, undefined, useRafs);\r\n }\r\n\r\n if(this.cancelable && reset) {\r\n this.setProgress(0);\r\n }\r\n }\r\n \r\n public detach() {\r\n if(this.detached) {\r\n return;\r\n }\r\n //return;\r\n\r\n this.detached = true;\r\n\r\n //return;\r\n \r\n if(this.preloader && this.preloader.parentElement) {\r\n /* setTimeout(() => *///fastRaf(() => {\r\n /* if(!this.detached) return;\r\n this.detached = true; */\r\n\r\n // fastRaf(() => {\r\n //console.log('[PP]: detach after rAF', this.detached, performance.now());\r\n\r\n // if(!this.detached || !this.preloader.parentElement) {\r\n // return;\r\n // }\r\n\r\n SetTransition(this.preloader, 'is-visible', false, TRANSITION_TIME, () => {\r\n this.preloader.remove();\r\n }, 1);\r\n // });\r\n //})/* , 5e3) */;\r\n }\r\n }\r\n \r\n public setProgress(percents: number) {\r\n if(!this.totalLength && !isInDOM(this.circle)) {\r\n return;\r\n }\r\n \r\n if(percents === 0) {\r\n this.circle.style.strokeDasharray = '';\r\n return;\r\n }\r\n \r\n try {\r\n if(!this.totalLength) {\r\n this.totalLength = this.circle.getTotalLength();\r\n }\r\n\r\n //console.log('setProgress', (percents / 100 * totalLength));\r\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\r\n } catch(err) {}\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize, MediaSize } from \"./mediaSizes\";\r\nimport { pause } from \"./schedulers/pause\";\r\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\r\n\r\nexport function scaleMediaElement(options: {\r\n media: CanvasImageSource, \r\n mediaSize: MediaSize, \r\n boxSize: MediaSize, \r\n quality?: number,\r\n mimeType?: 'image/jpeg' | 'image/png'\r\n}): Promise<{blob: Blob, size: MediaSize}> {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n const size = options.mediaSize.aspectFitted(options.boxSize);\r\n canvas.width = size.width * window.devicePixelRatio;\r\n canvas.height = size.height * window.devicePixelRatio;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(options.media, 0, 0, canvas.width, canvas.height);\r\n canvas.toBlob(blob => {\r\n resolve({blob, size});\r\n }, options.mimeType ?? 'image/jpeg', options.quality ?? 1);\r\n });\r\n}\r\n\r\nexport function preloadVideo(url: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n const video = document.createElement('video');\r\n video.volume = 0;\r\n video.addEventListener('loadedmetadata', () => resolve(video), {once: true});\r\n video.addEventListener('error', reject, {once: true});\r\n video.src = url;\r\n });\r\n}\r\n\r\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\r\n let width: number, height: number;\r\n if(media instanceof HTMLVideoElement) {\r\n width = media.videoWidth;\r\n height = media.videoHeight;\r\n } else {\r\n width = media.naturalWidth;\r\n height = media.naturalHeight;\r\n }\r\n\r\n return scaleMediaElement({\r\n media, \r\n mediaSize: makeMediaSize(width, height), \r\n boxSize: makeMediaSize(320, 240),\r\n quality: .9\r\n });\r\n}\r\n\r\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\r\n return new Promise((resolve, reject) => {\r\n video.onseeked = () => {\r\n video.onseeked = () => {\r\n createPosterFromMedia(video).then(resolve);\r\n\r\n video.onseeked = undefined;\r\n };\r\n\r\n video.currentTime = 0;\r\n };\r\n \r\n video.onerror = reject;\r\n video.currentTime = Math.min(video.duration, 1);\r\n });\r\n}\r\n\r\nexport async function createPosterForVideo(url: string) {\r\n const video = await preloadVideo(url);\r\n\r\n return Promise.race([\r\n pause(2000) as Promise,\r\n createPosterFromVideo(video),\r\n ]);\r\n}\r\n\r\nexport function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\r\n return new Promise((resolve) => {\r\n if(media.readyState >= readyState) {\r\n resolve();\r\n return;\r\n }\r\n\r\n media.addEventListener(IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay', () => resolve(), {once: true});\r\n });\r\n}\r\n\r\nexport async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\r\n const files: any[] = [];\r\n\r\n const scanFiles = async(entry: any, item: DataTransferItem) => {\r\n if(entry.isDirectory) {\r\n const directoryReader = entry.createReader();\r\n await new Promise((resolve, reject) => {\r\n directoryReader.readEntries(async(entries: any) => {\r\n for(const entry of entries) {\r\n await scanFiles(entry, item);\r\n }\r\n\r\n resolve();\r\n });\r\n });\r\n } else if(entry) {\r\n if(onlyTypes) {\r\n files.push(entry.type);\r\n } else {\r\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\r\n const file = entry instanceof File ? \r\n entry : \r\n (\r\n entry instanceof DataTransferItem ? \r\n entry.getAsFile() : \r\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\r\n );\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got file', item, file);\r\n } */\r\n\r\n if(!file) return;\r\n files.push(file);\r\n }\r\n }\r\n };\r\n\r\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\r\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\r\n const file = e.dataTransfer.files[i];\r\n files.push(onlyTypes ? file.type : file);\r\n }\r\n } else {\r\n // @ts-ignore\r\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\r\n\r\n const promises: Promise[] = [];\r\n for(let i = 0; i < items.length; ++i) {\r\n const item: DataTransferItem = items[i];\r\n if(item.kind === 'file') {\r\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\r\n promises.push(scanFiles(entry, item));\r\n }\r\n }\r\n \r\n await Promise.all(promises);\r\n }\r\n\r\n /* if(!onlyTypes) {\r\n console.log('getFilesFromEvent: got files:', e, files);\r\n } */\r\n \r\n return files;\r\n}\r\n\r\nexport function requestFile(accept?: string) {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.style.display = 'none';\r\n\r\n if(accept) {\r\n input.accept = accept;\r\n }\r\n\r\n document.body.append(input);\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n input.addEventListener('change', (e: any) => {\r\n const file: File = e.target.files[0];\r\n if(!file) {\r\n reject('NO_FILE_SELECTED');\r\n return;\r\n }\r\n \r\n resolve(file);\r\n }, {once: true});\r\n }).finally(() => {\r\n input.remove();\r\n });\r\n\r\n input.click();\r\n\r\n return promise;\r\n}\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1<
ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { renderImageFromUrlPromise } from \"../../helpers/dom/renderImageFromUrl\";\nimport replaceContent from \"../../helpers/dom/replaceContent\";\nimport sequentialDom from \"../../helpers/sequentialDom\";\nimport { UserProfilePhoto, ChatPhoto, InputFileLocation } from \"../../layer\";\nimport { NULL_PEER_ID, REPLIES_PEER_ID } from \"../mtproto/mtproto_config\";\nimport RichTextProcessor from \"../richtextprocessor\";\nimport rootScope from \"../rootScope\";\nimport appDownloadManager from \"./appDownloadManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appPhotosManager from \"./appPhotosManager\";\nimport appUsersManager from \"./appUsersManager\";\n\ntype PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n public isAvatarCached(peerId: PeerId) {\n return !!this.savedAvatarURLs[peerId];\n }\n \n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const inputPeer = appPeersManager.getInputPeerById(peerId);\n\n let cached = false;\n let getAvatarPromise: Promise;\n let saved = this.savedAvatarURLs[peerId];\n if(!saved || !saved[size]) {\n if(!saved) {\n saved = this.savedAvatarURLs[peerId] = {};\n }\n\n //console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation', \n pFlags: {},\n peer: inputPeer, \n photo_id: photo.photo_id\n };\n\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n }\n\n const downloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = appDownloadManager.download(downloadOptions);\n getAvatarPromise = saved[size] = promise.then(blob => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else if(typeof(saved[size]) !== 'string') {\n getAvatarPromise = saved[size] as Promise;\n } else {\n getAvatarPromise = Promise.resolve(saved[size]);\n cached = true;\n }\n\n return {cached, loadPromise: getAvatarPromise};\n }\n\n public putAvatar(\n div: HTMLElement, \n peerId: PeerId, \n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, \n size: PeerPhotoSize, \n img = new Image(), \n onlyThumb = false\n ) {\n let {cached, loadPromise} = this.loadAvatar(peerId, photo, size);\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n if(size === 'photo_big') { // let's load small photo first\n const res = this.putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = appPhotosManager.getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n \n if(animate) {\n img.classList.remove('fade-in');\n }\n\n if(thumbImage) {\n thumbImage.remove();\n }\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , false */))\n .then(callback);\n\n return {\n cached, \n loadPromise: renderThumbPromise || renderPromise,\n thumbImage\n };\n }\n\n public s(div: HTMLElement, innerHTML: string, color: string, icon: string) {\n div.innerHTML = innerHTML;\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled');\n icon && div.classList.add(icon);\n }\n\n // peerId === peerId || title\n public putPhoto(div: HTMLElement, peerId: PeerId, isDialog = false, title = '', onlyThumb = false) {\n const myId = rootScope.myId;\n \n //console.log('loadDialogPhoto location:', location, inputPeer);\n if(peerId === myId && isDialog) {\n this.s(div, '', '', 'tgico-saved');\n return;\n }\n \n if(peerId !== NULL_PEER_ID && peerId.isUser()) {\n const user = appUsersManager.getUser(peerId);\n if(user && user.pFlags && user.pFlags.deleted) {\n this.s(div, '', appPeersManager.getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n }\n \n const photo = appPeersManager.getPeerPhoto(peerId);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !this.savedAvatarURLs[peerId]) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = appPeersManager.getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n this.s(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\n this.s(div, abbr, color, '');\n //return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const size: PeerPhotoSize = 'photo_small';\n return this.putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n }\n }\n}\n\nconst appAvatarsManager = new AppAvatarsManager();\nexport default appAvatarsManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * will change .cleaned and new instance will be created\r\nexport const getMiddleware = () => {\r\n let cleanupObj = {cleaned: false};\r\n return {\r\n clean: () => {\r\n cleanupObj.cleaned = true;\r\n cleanupObj = {cleaned: false};\r\n },\r\n get: (additionalCallback?: () => boolean) => {\r\n const _cleanupObj = cleanupObj;\r\n return () => {\r\n return !_cleanupObj.cleaned && (!additionalCallback || additionalCallback());\r\n };\r\n }\r\n };\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { processSearchText, ProcessSearchTextOptions } from '../helpers/cleanSearchText';\n\nexport default class SearchIndex {\n private fullTexts: Map = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n \n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' ')) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n //newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set = new Set(newFoundObjs.map(o => o.what));\n\n /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// Thanks to https://stackoverflow.com/a/49349813\r\nimport { clamp } from \"../helpers/number\";\r\n\r\n/**\r\n * Attibute modifier to create middle ellipsis\r\n * When the attribute value is left blank the ellipsis will be in the middle\r\n * When positive the attribute value will be used as a percentage\r\n * When negative the attribute value will be used as character index counted from the end\r\n * @example\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n *
A Javascript solution to middle ellipsis
\r\n */\r\nconst ellipsis = '…';\r\nconst map: Map = new Map();\r\n\r\nconst testQueue: Set = new Set();\r\nexport const fontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\r\nconst fontSize = '16px';\r\nlet timeoutId: number;\r\n\r\nconst setTestQueue = () => {\r\n cancelAnimationFrame(timeoutId);\r\n timeoutId = window.requestAnimationFrame(testQueueElements);\r\n};\r\n\r\nconst testQueueElements = () => {\r\n testQueue.forEach(testElement);\r\n testQueue.clear();\r\n};\r\n\r\nwindow.addEventListener('resize', () => {\r\n for(const [key] of map) {\r\n testQueue.add(key);\r\n }\r\n \r\n setTestQueue();\r\n}, {capture: true, passive: true});\r\n\r\nconst testElement = (element: HTMLElement) => {\r\n //const perf = performance.now();\r\n // do not recalculate variables a second time\r\n let mapped = map.get(element);\r\n const firstTime = !mapped;\r\n\r\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\r\n //console.log('[MEE] testElement got mapped', mapped);\r\n\r\n if(firstTime) {\r\n text = element.textContent;\r\n textLength = text.length;\r\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\r\n multiplier = from > 0 && from / 100;\r\n\r\n //const perf = performance.now();\r\n font = `${element.dataset.fontWeight || 400} ${fontSize} ${fontFamily}`;\r\n /* const computedStyle = window.getComputedStyle(elm, null);\r\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\r\n //console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\r\n\r\n textWidth = getTextWidth(text, font);\r\n //const perf = performance.now();\r\n elementWidth = element.getBoundingClientRect().width;\r\n //console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\r\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\r\n map.set(element, mapped);\r\n\r\n //console.log('[MEE] testElement map set', element);\r\n }\r\n \r\n const newElementWidth = element.getBoundingClientRect().width;\r\n const widthChanged = firstTime || elementWidth !== newElementWidth;\r\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\r\n \r\n if(widthChanged) {\r\n if(textWidth > elementWidth) {\r\n element.setAttribute('title', text);\r\n let smallerText = text;\r\n let smallerWidth = elementWidth;\r\n while(smallerText.length > 3) {\r\n let smallerTextLength = smallerText.length;\r\n const half = multiplier &&\r\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\r\n Math.max(smallerTextLength + from - 1, 1);\r\n const half1 = smallerText.substr(0, half).replace(/\\s*$/,'');\r\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/,'');\r\n smallerText = half1 + half2;\r\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\r\n if(smallerWidth < elementWidth) {\r\n element.textContent = half1 + ellipsis + half2;\r\n break;\r\n }\r\n }\r\n\r\n // * set new width after cutting text\r\n mapped.elementWidth = element.getBoundingClientRect().width;\r\n //mapped.textWidth = smallerWidth;\r\n } else {\r\n element.removeAttribute('title');\r\n }\r\n }\r\n\r\n //console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\r\n};\r\n\r\nlet context: CanvasRenderingContext2D;\r\n/**\r\n * Get the text width\r\n * @param {string} text\r\n * @param {string} font\r\n */\r\nfunction getTextWidth(text: string, font: string) {\r\n //const perf = performance.now();\r\n if(!context) {\r\n const canvas = document.createElement('canvas');\r\n context = canvas.getContext('2d');\r\n context.font = font;\r\n }\r\n\r\n //context.font = font;\r\n const metrics = context.measureText(text);\r\n //console.log('getTextWidth perf:', performance.now() - perf);\r\n return metrics.width;\r\n //return Math.round(metrics.width);\r\n}\r\n\r\nexport class MiddleEllipsisElement extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n //console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\r\n\r\n map.set(this, null);\r\n testQueue.add(this);\r\n setTestQueue();\r\n //testElement(this);\r\n\r\n //console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\r\n }\r\n\r\n disconnectedCallback() {\r\n const deleted = map.delete(this);\r\n //console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\r\n }\r\n}\r\n\r\ncustomElements.define(\"middle-ellipsis-element\", MiddleEllipsisElement);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../rootScope\";\r\nimport appPeersManager from \"./appPeersManager\";\r\nimport appMessagesManager from \"./appMessagesManager\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport RichTextProcessor from \"../richtextprocessor\";\r\nimport serverTimeManager from \"../mtproto/serverTimeManager\";\r\nimport { MessageEntity, DraftMessage, MessagesSaveDraft } from \"../../layer\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { tsNow } from \"../../helpers/date\";\r\nimport { deepEqual } from \"../../helpers/object\";\r\nimport { isObject } from \"../mtproto/bin_utils\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport stateStorage from \"../stateStorage\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\n\r\nexport type MyDraftMessage = DraftMessage.draftMessage;\r\n\r\nexport class AppDraftsManager {\r\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\r\n private getAllDraftPromise: Promise = null;\r\n\r\n constructor() {\r\n stateStorage.get('drafts').then(drafts => {\r\n this.drafts = drafts || {};\r\n });\r\n\r\n rootScope.addMultipleEventsListeners({\r\n updateDraftMessage: (update) => {\r\n const peerID = appPeersManager.getPeerId(update.peer);\r\n this.saveDraft(peerID, update.threadId, update.draft, {notify: true});\r\n }\r\n });\r\n }\r\n\r\n private getKey(peerId: PeerId, threadId?: number) {\r\n return '' + peerId + (threadId ? '_' + threadId : '');\r\n }\r\n\r\n public getDraft(peerId: PeerId, threadId?: number) {\r\n return this.drafts[this.getKey(peerId, threadId)];\r\n }\r\n\r\n public addMissedDialogs() {\r\n return this.getAllDrafts().then(() => {\r\n for(const key in this.drafts) {\r\n if(key.indexOf('_') !== -1) { // exclude threads\r\n continue;\r\n }\r\n\r\n const peerId = key.toPeerId();\r\n const dialog = appMessagesManager.getDialogOnly(peerId);\r\n if(!dialog) {\r\n appMessagesManager.reloadConversation(peerId);\r\n /* const dialog = appMessagesManager.generateDialog(peerId);\r\n dialog.draft = this.drafts[key];\r\n appMessagesManager.saveConversation(dialog);\r\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\r\n appMessagesManager.scheduleHandleNewDialogs(); */\r\n }\r\n }\r\n });\r\n }\r\n\r\n public getAllDrafts() {\r\n return this.getAllDraftPromise || (\r\n this.getAllDraftPromise = apiManager.invokeApi('messages.getAllDrafts')\r\n .then((updates) => {\r\n const p = apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\r\n p.then(() => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n })\r\n );\r\n }\r\n\r\n public saveDraft(peerId: PeerId, threadId: number, apiDraft: DraftMessage, options: Partial<{\r\n notify: boolean,\r\n force: boolean\r\n }> = {}) {\r\n const draft = this.processApiDraft(apiDraft);\r\n\r\n const key = this.getKey(peerId, threadId);\r\n if(draft) {\r\n this.drafts[key] = draft;\r\n } else {\r\n delete this.drafts[key];\r\n }\r\n\r\n stateStorage.set({\r\n drafts: this.drafts\r\n });\r\n\r\n if(options.notify) {\r\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId,\r\n threadId,\r\n draft,\r\n force: options.force\r\n });\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\r\n if(typeof(draft1) !== typeof(draft2)) {\r\n return false;\r\n }\r\n\r\n if(!isObject(draft1)) {\r\n return true;\r\n }\r\n\r\n if(draft1._ !== draft2._) {\r\n return false;\r\n }\r\n \r\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\r\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\r\n return false;\r\n }\r\n \r\n if(!deepEqual(draft1.entities, draft2.entities)) {\r\n return false;\r\n }\r\n \r\n if(draft1.message !== draft2.message) {\r\n return false;\r\n }\r\n \r\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public isEmptyDraft(draft: DraftMessage) {\r\n if(!draft || draft._ === 'draftMessageEmpty') {\r\n return true;\r\n }\r\n \r\n if(draft.reply_to_msg_id > 0) {\r\n return false;\r\n }\r\n \r\n if(!draft.message.length) {\r\n return true;\r\n }\r\n \r\n return false;\r\n }\r\n\r\n public processApiDraft(draft: DraftMessage): MyDraftMessage {\r\n if(!draft || draft._ !== 'draftMessage') {\r\n return undefined;\r\n }\r\n\r\n const myEntities = RichTextProcessor.parseEntities(draft.message);\r\n const apiEntities = draft.entities || [];\r\n const totalEntities = RichTextProcessor.mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\r\n\r\n draft.rMessage = RichTextProcessor.wrapDraftText(draft.message, {entities: totalEntities});\r\n //draft.rReply = appMessagesManager.getRichReplyText(draft);\r\n if(draft.reply_to_msg_id) {\r\n draft.reply_to_msg_id = appMessagesIdsManager.generateMessageId(draft.reply_to_msg_id);\r\n }\r\n\r\n return draft;\r\n }\r\n\r\n public async syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\r\n // console.warn(dT(), 'sync draft', peerID)\r\n const serverDraft = this.getDraft(peerId, threadId);\r\n if(this.draftsAreEqual(serverDraft, localDraft)) {\r\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\r\n return true;\r\n }\r\n\r\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\r\n let params: MessagesSaveDraft = {\r\n peer: appPeersManager.getInputPeerById(peerId),\r\n message: ''\r\n };\r\n\r\n let draftObj: DraftMessage;\r\n if(this.isEmptyDraft(localDraft)) {\r\n draftObj = {_: 'draftMessageEmpty'};\r\n } else {\r\n assumeType(localDraft);\r\n let message = localDraft.message;\r\n let entities: MessageEntity[] = localDraft.entities;\r\n\r\n if(localDraft.reply_to_msg_id) {\r\n params.reply_to_msg_id = appMessagesIdsManager.getServerMessageId(localDraft.reply_to_msg_id);\r\n }\r\n\r\n if(entities?.length) {\r\n params.entities = appMessagesManager.getInputEntities(entities);\r\n }\r\n\r\n if(localDraft.pFlags.no_webpage) {\r\n params.no_webpage = localDraft.pFlags.no_webpage;\r\n }\r\n\r\n params.message = message;\r\n }\r\n\r\n const saveLocalDraft = draftObj || localDraft;\r\n saveLocalDraft.date = tsNow(true) + serverTimeManager.serverTimeOffset;\r\n\r\n this.saveDraft(peerId, threadId, saveLocalDraft, {notify: true, force});\r\n\r\n if(saveOnServer && !threadId) {\r\n return apiManager.invokeApi('messages.saveDraft', params);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public clearAllDrafts() {\r\n return apiManager.invokeApi('messages.clearAllDrafts').then(bool => {\r\n if(!bool) {\r\n return;\r\n }\r\n\r\n for(const combined in this.drafts) {\r\n const [peerId, threadId] = combined.split('_');\r\n rootScope.dispatchEvent('draft_updated', {\r\n peerId: peerId.toPeerId(),\r\n threadId: threadId ? +threadId : undefined,\r\n draft: undefined\r\n });\r\n }\r\n });\r\n }\r\n\r\n public clearDraft(peerId: PeerId, threadId: number) {\r\n const emptyDraft: DraftMessage.draftMessageEmpty = {\r\n _: 'draftMessageEmpty'\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, emptyDraft, {notify: true, force: true}); \r\n }\r\n }\r\n\r\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\r\n const draft: DraftMessage.draftMessage = {\r\n _: 'draftMessage',\r\n date: Date.now() / 1000 | 0,\r\n message,\r\n pFlags: {},\r\n entities\r\n };\r\n\r\n if(threadId) {\r\n this.syncDraft(peerId, threadId, draft, false, true);\r\n } else {\r\n this.saveDraft(peerId, threadId, draft, {notify: true, force: true}); \r\n }\r\n }\r\n}\r\n\r\nconst appDraftsManager = new AppDraftsManager();\r\nMOUNT_CLASS_TO.appDraftsManager = appDraftsManager;\r\nexport default appDraftsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n \n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n this.audio?.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport AudioAssetPlayer from \"../../helpers/audioAssetPlayer\";\nimport { safeReplaceObject } from \"../../helpers/object\";\nimport { nextRandomUint } from \"../../helpers/random\";\nimport tsNow from \"../../helpers/tsNow\";\nimport { GroupCall, GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup, InputGroupCall, Peer, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates } from \"../../layer\";\nimport GroupCallInstance from \"../calls/groupCallInstance\";\nimport GROUP_CALL_STATE from \"../calls/groupCallState\";\nimport createMainStreamManager from \"../calls/helpers/createMainStreamManager\";\nimport { generateSsrc } from \"../calls/localConferenceDescription\";\nimport { WebRTCLineType } from \"../calls/sdpBuilder\";\nimport StreamManager from \"../calls/streamManager\";\nimport { Ssrc } from \"../calls/types\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/mtprotoworker\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport apiUpdatesManager from \"./apiUpdatesManager\";\nimport appChatsManager from \"./appChatsManager\";\nimport appPeersManager from \"./appPeersManager\";\nimport appUsersManager from \"./appUsersManager\";\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nlet IS_MUTED = true;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport type GroupCallAudioAssetName = \"group_call_connect.mp3\" | \"group_call_end.mp3\" | \"group_call_start.mp3\" | \"voip_onallowtalk.mp3\";\n\nexport class AppGroupCallsManager {\n private log: ReturnType;\n \n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n \n // private audioAsset: AudioAsset;\n \n private currentGroupCall: GroupCallInstance;\n private connectionAudio: HTMLAudioElement;\n private doNotDispatchParticipantUpdate: PeerId;\n private audioAsset: AudioAssetPlayer;\n\n constructor() {\n this.log = logger('GROUP-CALLS');\n \n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n \n rootScope.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n \n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n \n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.hangUp(false, false, true);\n }\n\n this.participants.delete(groupCall.id);\n }\n });\n\n this.audioAsset = new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const {currentGroupCall} = this;\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n const isCurrentGroupCall = currentGroupCall?.id === groupCallId;\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n if(isCurrentGroupCall) {\n currentGroupCall.onParticipantUpdate(participant, this.doNotDispatchParticipantUpdate);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n \n if(modified) {\n rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n \n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant && this.doNotDispatchParticipantUpdate !== peerId) {\n rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach(p => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n let processUpdate = true;\n if(participant) {\n const {currentGroupCall} = this;\n const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !currentGroupCall.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = this.generateSelfVideo(currentGroupCall.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n currentGroupCall.setMuted(false);\n }\n\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n }\n\n rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : appPeersManager.getPeerId(participant.peer);\n const updates = await apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: appGroupCallsManager.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? appPeersManager.getInputPeerSelf() : appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n \n // do not replace with peerId because it can be null\n if(!processUpdate) this.doNotDispatchParticipantUpdate = appPeersManager.getPeerId(participant.peer);\n apiUpdatesManager.processUpdateMessage(updates);\n if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n \n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n appUsersManager.saveApiUsers(groupCall.users);\n appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n \n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n \n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n \n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n \n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n rootScope.dispatchEvent('group_call_instance', groupCall);\n }\n /* TdLibController.clientUpdate({\n '@type': 'clientUpdateGroupCall',\n call\n }); */\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await apiManager.invokeApi('phone.createGroupCall', {\n peer: appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n \n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n \n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo);\n }\n\n public async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n \n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n \n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n \n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n \n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n \n case 'completed': {\n break;\n }\n \n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n \n this.getGroupCallParticipants(groupCallId).then(({participants}) => {\n this.saveApiParticipants(groupCallId, [...participants.values()]);\n });\n }\n \n break;\n }\n \n case 'disconnected': {\n break;\n }\n \n case 'failed': {\n //TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n \n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n \n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n public generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n }\n \n public generateSelfParticipant(): GroupCallParticipant {\n const mainSources = this.currentGroupCall.connections.main.sources;\n const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n return {\n _: 'groupCallParticipant',\n pFlags: {\n can_self_unmute: true,\n self: true\n },\n source: mainSources.audio.source,\n video: this.generateSelfVideo(mainSources.video),\n presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n date: tsNow(true),\n peer: appPeersManager.getOutputPeer(rootScope.myId)\n };\n }\n\n public makeSsrcsFromParticipant = (participant: GroupCallParticipant) => {\n return [\n this.makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && this.makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && this.makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && this.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n };\n\n public makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants', \n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n \n appChatsManager.saveApiChats(groupCallParticipants.chats);\n appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n \n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public async hangUp(groupCallId: GroupCallId, discard = false, rejoin = false) {\n this.log(`hangUp start id=${groupCallId} discard=${discard} rejoin=${rejoin}`);\n const {currentGroupCall} = this;\n if(currentGroupCall?.id !== groupCallId) return;\n\n currentGroupCall.hangUp(discard, rejoin);\n }\n\n public toggleMuted(muted?: boolean) {\n return this.changeUserMuted(NULL_PEER_ID, muted);\n }\n \n public changeUserMuted(peerId: PeerId, muted?: boolean) {\n const {currentGroupCall} = this;\n if(!currentGroupCall) return;\n\n const participant = currentGroupCall.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(currentGroupCall.id, participant, {muted});\n }\n}\n\nconst appGroupCallsManager = new AppGroupCallsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appGroupCallsManager = appGroupCallsManager);\nexport default appGroupCallsManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS } from \"../constants\";\nimport StreamManager from \"../streamManager\";\nimport getAudioConstraints from \"./getAudioConstraints\";\nimport getStream from \"./getStream\";\nimport getVideoConstraints from \"./getVideoConstraints\";\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n \n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Config from \"../lib/config\";\n\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = Config.LatinizeMap[ch];\n return latinizeCh !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n return text;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\n/**\r\n * Descend sorted storage\r\n */\r\n\r\ntype ItemType = number;\r\n\r\nexport enum SliceEnd {\r\n None = 0,\r\n Top = 1,\r\n Bottom = 2,\r\n Both = SliceEnd.Top | SliceEnd.Bottom\r\n};\r\n\r\nexport interface Slice extends Array {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd;\r\n\r\n isEnd: (side: SliceEnd) => boolean;\r\n setEnd: (side: SliceEnd) => void;\r\n unsetEnd: (side: SliceEnd) => void;\r\n\r\n slice: (from?: number, to?: number) => Slice;\r\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice;\r\n}\r\n\r\nexport interface SliceConstructor {\r\n new(...items: ItemType[]): Slice;\r\n}\r\n\r\nexport default class SlicedArray {\r\n private slices: Slice[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\r\n private sliceConstructor: SliceConstructor;\r\n \r\n constructor() {\r\n // @ts-ignore\r\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\r\n\r\n const first = this.constructSlice();\r\n //first.setEnd(SliceEnd.Bottom);\r\n this.slices = [first];\r\n }\r\n\r\n private static getSliceConstructor(slicedArray: SlicedArray) {\r\n return class Slice extends Array implements Slice {\r\n //slicedArray: SlicedArray;\r\n end: SliceEnd = SliceEnd.None;\r\n \r\n /* constructor(...items: ItemType[]) {\r\n super(...items);\r\n //this.slicedArray = slicedArray;\r\n } */\r\n \r\n isEnd(side: SliceEnd): boolean {\r\n if((this.end & side) === side) {\r\n return true;\r\n }/* else if(!this.slicedArray) {\r\n return false;\r\n } */\r\n \r\n let isEnd = false;\r\n if(side === SliceEnd.Top) {\r\n const slice = slicedArray.last;\r\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Bottom) {\r\n const slice = slicedArray.first;\r\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\r\n } else if(side === SliceEnd.Both) {\r\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\r\n }\r\n\r\n if(isEnd) {\r\n this.setEnd(side);\r\n }\r\n \r\n return isEnd;\r\n }\r\n \r\n setEnd(side: SliceEnd) {\r\n this.end |= side;\r\n }\r\n\r\n unsetEnd(side: SliceEnd) {\r\n this.end ^= side;\r\n }\r\n\r\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\r\n const ret = super.splice(start, deleteCount, ...items);\r\n\r\n if(!this.length) {\r\n const slices = slicedArray.slices as number[][];\r\n const idx = slices.indexOf(this);\r\n if(idx !== -1) {\r\n if(slices.length === 1) { // left empty slice without ends\r\n this.unsetEnd(SliceEnd.Both);\r\n } else { // delete this slice\r\n slices.splice(idx, 1);\r\n }\r\n }\r\n }\r\n\r\n return ret;\r\n }\r\n }\r\n }\r\n\r\n public constructSlice(...items: ItemType[]) {\r\n //const slice = new Slice(this, ...items);\r\n // can't pass items directly to constructor because first argument is length\r\n const slice = new this.sliceConstructor(items.length);\r\n for(let i = 0, length = items.length; i < length; ++i) {\r\n slice[i] = items[i];\r\n }\r\n return slice;\r\n \r\n // ! code below will slow execution in 15 times\r\n /* const self = this;\r\n const p: Slice = new Proxy(slice, {\r\n get: function(target, name: any) {\r\n if(name === 'constructor') {\r\n const p = new Proxy(Slice, {\r\n construct: (target, args) => {\r\n return self.constructSlice(...args);\r\n }\r\n });\r\n\r\n return p;\r\n }\r\n\r\n return target[name];\r\n }\r\n });\r\n\r\n return p; */\r\n\r\n /*\r\n var p = slicedArray.constructSlice();\r\n p.length = 100000;\r\n p.fill(255);\r\n\r\n var a = new Array(100000);\r\n a.fill(255);\r\n\r\n var b = 0;\r\n var perf = performance.now();\r\n for(var i = 0; i < p.length; ++i) {\r\n b += p[i];\r\n }\r\n\r\n console.log('perf 1', performance.now() - perf);\r\n\r\n b = 0;\r\n perf = performance.now();\r\n for(var i = 0; i < a.length; ++i) {\r\n b += a[i];\r\n }\r\n\r\n console.log('perf 2', performance.now() - perf);\r\n */\r\n }\r\n\r\n public insertSlice(slice: ItemType[], flatten = true) {\r\n if(!slice.length) {\r\n return;\r\n }\r\n\r\n const first = this.slices[0];\r\n if(!first.length) {\r\n first.push(...slice);\r\n return first;\r\n }\r\n\r\n const lowerBound = slice[slice.length - 1];\r\n const upperBound = slice[0];\r\n\r\n let foundSlice: Slice, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\r\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\r\n foundSlice = this.slices[foundSliceIndex];\r\n lowerIndex = foundSlice.indexOf(lowerBound);\r\n upperIndex = foundSlice.indexOf(upperBound);\r\n \r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n break;\r\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\r\n break;\r\n }\r\n }\r\n\r\n if(upperIndex !== -1 && -1 !== lowerIndex) {\r\n\r\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\r\n const sliced = slice.slice(foundSlice.length - upperIndex);\r\n foundSlice.push(...sliced);\r\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\r\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\r\n foundSlice.unshift(...sliced);\r\n } else {\r\n let insertIndex = 0;\r\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\r\n const s = this.slices[insertIndex];\r\n if(slice[0] > s[0]) {\r\n break;\r\n }\r\n }\r\n\r\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\r\n foundSliceIndex = insertIndex;\r\n }\r\n\r\n if(flatten) {\r\n return this.flatten(foundSliceIndex);\r\n }\r\n }\r\n\r\n private flatten(foundSliceIndex: number) {\r\n if(this.slices.length >= 2) {\r\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\r\n const prevSlice = this.slices[i];\r\n const nextSlice = this.slices[i + 1];\r\n \r\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\r\n if(upperIndex !== -1) {\r\n prevSlice.setEnd(nextSlice.end);\r\n this.slices.splice(i + 1, 1);\r\n\r\n if(i < foundSliceIndex) {\r\n --foundSliceIndex;\r\n }\r\n\r\n --length; // respect array bounds\r\n --i; // repeat from the same place\r\n \r\n this.insertSlice(nextSlice, false);\r\n }\r\n }\r\n }\r\n\r\n return this.slices[foundSliceIndex];\r\n }\r\n\r\n // * \r\n \r\n get first() {\r\n return this.slices[0];\r\n }\r\n \r\n get last() {\r\n return this.slices[this.slices.length - 1];\r\n }\r\n\r\n get slice() {\r\n return this.first;\r\n }\r\n\r\n get length() {\r\n return this.slice.length;\r\n }\r\n\r\n public findSlice(item: ItemType) {\r\n for(let i = 0, length = this.slices.length; i < length; ++i) {\r\n const slice = this.slices[i];\r\n const index = slice.indexOf(item);\r\n if(index !== -1) {\r\n return {slice, index};\r\n }\r\n }\r\n \r\n return undefined;\r\n }\r\n\r\n public findSliceOffset(maxId: number) {\r\n let slice: Slice;\r\n for(let i = 0; i < this.slices.length; ++i) {\r\n let offset = 0;\r\n slice = this.slices[i];\r\n if(slice.length < 2) {\r\n continue;\r\n }\r\n \r\n for(; offset < slice.length; offset++) {\r\n if(maxId >= slice[offset]) {\r\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\r\n return undefined;\r\n } */\r\n\r\n return {\r\n slice, \r\n offset: maxId === slice[offset] ? offset : offset - 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n if(slice && slice.isEnd(SliceEnd.Top)) {\r\n return {\r\n slice,\r\n offset: slice.length\r\n };\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n // * https://core.telegram.org/api/offsets\r\n public sliceMe(offsetId: number, add_offset: number, limit: number) {\r\n let slice = this.slice;\r\n let offset = 0;\r\n let sliceOffset = 0;\r\n\r\n if(offsetId) {\r\n const pos = this.findSliceOffset(offsetId);\r\n if(!pos) {\r\n return undefined;\r\n }\r\n\r\n slice = pos.slice;\r\n offset = sliceOffset = pos.offset;\r\n\r\n if(slice.includes(offsetId)) {\r\n sliceOffset += 1;\r\n }\r\n\r\n /* if(slice.includes(offsetId) && add_offset < 0) {\r\n add_offset += 1;\r\n } */\r\n }\r\n\r\n let sliceStart = Math.max(sliceOffset + add_offset, 0);\r\n let sliceEnd = sliceOffset + add_offset + limit;\r\n //const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\r\n //sliceEnd += fixHalfBackLimit;\r\n\r\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice;\r\n\r\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\r\n const bottomWasMeantToLoad = Math.abs(add_offset);\r\n\r\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\r\n // useful when there is only 1 message in chat on its reopening\r\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\r\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\r\n\r\n //console.log('sliceMe', topFulfilled, bottomFulfilled);\r\n\r\n return {\r\n slice: sliced, \r\n offsetIdOffset: offset,\r\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\r\n };\r\n }\r\n\r\n public unshift(...items: ItemType[]) {\r\n let slice = this.first;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Bottom);\r\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Bottom);\r\n this.slices.unshift(slice);\r\n }\r\n\r\n slice.unshift(...items);\r\n }\r\n\r\n public push(...items: ItemType[]) {\r\n let slice = this.last;\r\n if(!slice.length) {\r\n slice.setEnd(SliceEnd.Top);\r\n } else if(!slice.isEnd(SliceEnd.Top)) {\r\n slice = this.constructSlice();\r\n slice.setEnd(SliceEnd.Top);\r\n this.slices.push(slice);\r\n }\r\n\r\n slice.push(...items);\r\n }\r\n\r\n public delete(item: ItemType) {\r\n const found = this.findSlice(item);\r\n if(found) {\r\n found.slice.splice(found.index, 1);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { copy } from \"../../helpers/object\";\r\nimport { InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults } from \"../../layer\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiUpdatesManager from \"./apiUpdatesManager\";\r\nimport appMessagesIdsManager from \"./appMessagesIdsManager\";\r\nimport appMessagesManager from './appMessagesManager';\r\nimport appPeersManager from './appPeersManager';\r\nimport appUsersManager from \"./appUsersManager\";\r\n\r\nexport class AppPollsManager {\r\n public polls: {[id: string]: Poll} = {};\r\n public results: {[id: string]: PollResults} = {};\r\n public pollToMessages: {[id: string]: Set} = {};\r\n\r\n private log = logger('POLLS', LogTypes.Error);\r\n\r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateMessagePoll: (update) => {\r\n this.log('updateMessagePoll:', update);\r\n\r\n let poll: Poll = update.poll || this.polls[update.poll_id];\r\n if(!poll) {\r\n return;\r\n }\r\n\r\n let results = update.results;\r\n const ret = this.savePoll(poll, results as any);\r\n poll = ret.poll;\r\n results = ret.results;\r\n \r\n rootScope.dispatchEvent('poll_update', {poll, results: results as any});\r\n }\r\n });\r\n }\r\n\r\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\r\n if(message) {\r\n this.updatePollToMessage(message, true);\r\n }\r\n\r\n const id = poll.id;\r\n if(this.polls[id]) {\r\n poll = Object.assign(this.polls[id], poll);\r\n results = this.saveResults(poll, results);\r\n } else {\r\n this.polls[id] = poll;\r\n\r\n poll.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\r\n poll.chosenIndexes = [];\r\n results = this.saveResults(poll, results);\r\n }\r\n\r\n return {poll, results};\r\n }\r\n\r\n public saveResults(poll: Poll, results: PollResults) {\r\n if(this.results[poll.id]) {\r\n results = Object.assign(this.results[poll.id], results);\r\n } else {\r\n this.results[poll.id] = results;\r\n }\r\n\r\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\r\n poll.chosenIndexes.length = 0;\r\n if(results?.results?.length) {\r\n results.results.forEach((answer, idx) => {\r\n if(answer.pFlags?.chosen) {\r\n poll.chosenIndexes.push(idx);\r\n }\r\n });\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n public getPoll(pollId: string): {poll: Poll, results: PollResults} {\r\n return {\r\n poll: this.polls[pollId], \r\n results: this.results[pollId]\r\n };\r\n }\r\n\r\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\r\n if(solution) {\r\n if(!solutionEntities) {\r\n solutionEntities = [];\r\n }\r\n\r\n solution = RichTextProcessor.parseMarkdown(solution, solutionEntities);\r\n } else {\r\n solution = undefined; // can be string here\r\n }\r\n\r\n return {\r\n _: 'inputMediaPoll',\r\n poll,\r\n correct_answers: correctAnswers,\r\n solution,\r\n solution_entities: solution ? solutionEntities : undefined\r\n };\r\n }\r\n\r\n public updatePollToMessage(message: Message.message, add: boolean) {\r\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\r\n let set = this.pollToMessages[id];\r\n \r\n if(!add && !set) {\r\n return;\r\n }\r\n\r\n if(!set) {\r\n set = this.pollToMessages[id] = new Set();\r\n }\r\n\r\n const key = message.peerId + '_' + message.mid;\r\n if(add) set.add(key);\r\n else set.delete(key);\r\n\r\n if(!add && !set.size) {\r\n delete this.polls[id];\r\n delete this.results[id];\r\n delete this.pollToMessages[id];\r\n }\r\n }\r\n\r\n public sendVote(message: any, optionIds: number[]): Promise {\r\n const poll: Poll = message.media.poll;\r\n\r\n const options: Uint8Array[] = optionIds.map(index => {\r\n return poll.answers[index].option;\r\n });\r\n \r\n const messageId = message.mid;\r\n const peerId = message.peerId;\r\n const inputPeer = appPeersManager.getInputPeerById(peerId);\r\n\r\n if(message.pFlags.is_outgoing) {\r\n return appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\r\n this.log('invoke sendVote callback');\r\n return this.sendVote(message, optionIds);\r\n });\r\n }\r\n\r\n return apiManager.invokeApi('messages.sendVote', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n options\r\n }).then(updates => {\r\n this.log('sendVote updates:', updates);\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n });\r\n }\r\n\r\n public getResults(message: any) {\r\n const inputPeer = appPeersManager.getInputPeerById(message.peerId);\r\n\r\n return apiManager.invokeApi('messages.getPollResults', {\r\n peer: inputPeer,\r\n msg_id: appMessagesIdsManager.getServerMessageId(message.mid)\r\n }).then(updates => {\r\n apiUpdatesManager.processUpdateMessage(updates);\r\n this.log('getResults updates:', updates);\r\n });\r\n }\r\n\r\n public getVotes(message: any, option?: Uint8Array, offset?: string, limit = 20) {\r\n return apiManager.invokeApi('messages.getPollVotes', {\r\n peer: appPeersManager.getInputPeerById(message.peerId),\r\n id: appMessagesIdsManager.getServerMessageId(message.mid),\r\n option,\r\n offset,\r\n limit\r\n }).then((votesList) => {\r\n this.log('getPollVotes messages:', votesList);\r\n\r\n appUsersManager.saveApiUsers(votesList.users);\r\n\r\n return votesList;\r\n });\r\n }\r\n\r\n public stopPoll(message: any) {\r\n const poll: Poll = message.media.poll;\r\n \r\n if(poll.pFlags.closed) return Promise.resolve();\r\n\r\n const newPoll = copy(poll);\r\n newPoll.pFlags.closed = true;\r\n return appMessagesManager.editMessage(message, undefined, {\r\n newMedia: this.getInputMediaPoll(newPoll)\r\n }).then(() => {\r\n //console.log('stopped poll');\r\n }, err => {\r\n this.log.error('stopPoll error:', err);\r\n });\r\n }\r\n}\r\n\r\nconst appPollsManager = new AppPollsManager();\r\nMOUNT_CLASS_TO.appPollsManager = appPollsManager;\r\nexport default appPollsManager;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// unsign => sign\nexport function toTelegramSource(source: number) {\n\treturn source << 0;\n}\n\n/// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n/// sign => unsign\nexport function fromTelegramSource(source: number) {\n\treturn source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n\tif(!array) return 0;\n\n\tconst {length} = array;\n\tlet total = 0;\n\tfor(let i = 0; i < length; ++i) {\n\t\ttotal += array[i] * array[i];\n\t}\n\tconst rms = Math.sqrt(total / length) / 255;\n\n\treturn Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { indexOfAndSplice } from '../../helpers/array';\nimport { safeAssign } from '../../helpers/object';\nimport { GroupCallParticipantVideoSourceGroup } from '../../layer';\nimport { SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT } from './sdpBuilder';\nimport { AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec } from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n \n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(this.type, init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n \n return {\n endpoint,\n type,\n source,\n sourceGroups,\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n \n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n \n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n \n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find(entry => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n \n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.promise;\r\n}\r\n\r\nfunction processHeavyQueue() {\r\n if(!processingQueue) {\r\n const queue = heavyQueue.shift();\r\n timedChunk(queue).finally(() => {\r\n processingQueue = false;\r\n if(heavyQueue.length) {\r\n processHeavyQueue();\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction timedChunk(queue: HeavyQueue) {\r\n if(!queue.items.length) {\r\n queue.promise.resolve([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const f = async() => {\r\n const start = performance.now();\r\n\r\n do {\r\n await getHeavyAnimationPromise();\r\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\r\n let realResult: T;\r\n if(possiblePromise instanceof Promise) {\r\n try {\r\n realResult = await possiblePromise;\r\n } catch(err) {\r\n reject(err);\r\n return;\r\n }\r\n } else {\r\n realResult = possiblePromise;\r\n }\r\n\r\n results.push(realResult);\r\n } while(todo.length > 0 && (performance.now() - start) < 6);\r\n\r\n if(todo.length > 0) {\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n } else {\r\n resolve(results);\r\n }\r\n };\r\n\r\n fastRaf(f);\r\n //setTimeout(f, 25);\r\n }).then(queue.promise.resolve, queue.promise.reject);\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type fastBlur from '../vendor/fastBlur';\r\nimport addHeavyTask from './heavyQueue';\r\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\r\n requireBlurPromise = import('../vendor/fastBlur').then(m => {\r\n fastBlurFunc = m.default;\r\n });\r\n} else {\r\n requireBlurPromise = Promise.resolve();\r\n}\r\n\r\nfunction processBlurNext(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n \r\n const ctx = canvas.getContext('2d', {alpha: false});\r\n if(isFilterAvailable) {\r\n ctx.filter = `blur(${radius}px)`;\r\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\r\n } else {\r\n ctx.drawImage(img, 0, 0);\r\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\r\n }\r\n \r\n resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const promise = new Promise((resolve) => {\r\n //return resolve(dataUri);\r\n requireBlurPromise.then(() => {\r\n const img = new Image();\r\n img.onload = () => {\r\n if(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { RefreshReferenceTask, RefreshReferenceTaskResponse } from \"./apiFileManager\";\nimport appMessagesManager from \"../appManagers/appMessagesManager\";\nimport appStickersManager from \"../appManagers/appStickersManager\";\nimport { Photo } from \"../../layer\";\nimport { bytesToHex } from \"../../helpers/bytes\";\nimport { deepEqual } from \"../../helpers/object\";\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\nimport apiManager from \"./mtprotoworker\";\nimport assumeType from \"../../helpers/assumeType\";\nimport { logger } from \"../logger\";\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n//type ReferenceBytes = Uint8Array;\n\nclass ReferenceDatabase {\n private contexts: Map = new Map();\n //private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n constructor() {\n apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n const originalPayload = task.payload;\n\n assumeType(task);\n task.originalPayload = originalPayload;\n\n this.refreshReference(originalPayload).then((bytes) => {\n task.payload = bytes;\n }, (err) => {\n task.error = err;\n }).then(() => apiManager.postMessage(task));\n });\n }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n \n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = appMessagesManager.wrapSingleMessage(context.peerId, context.messageId, true);\n break; \n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw 'NO_NEW_CONTEXT';\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n\nconst referenceDatabase = new ReferenceDatabase();\nMOUNT_CLASS_TO.referenceDatabase = referenceDatabase;\nexport default referenceDatabase;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var template = document.createElement('template');\r\n html = html.trim(); // Never return a text node of whitespace as the result\r\n template.innerHTML = html;\r\n return template.content;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n \n\tconst stream = await navigator.mediaDevices.getUserMedia(constraints);\n\tstream.getTracks().forEach(x => {\n\t\t/* x.onmute = x => {\n\t\t\tconsole.log('track.onmute', x);\n\t\t};\n\t\tx.onunmute = x => {\n\t\t\tconsole.log('track.onunmute', x);\n\t\t}; */\n\n\t\tx.enabled = !muted;\n\t});\n\n\t// console.log('getStream result', stream);\n\treturn stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { logger } from '../logger';\nimport rootScope from '../rootScope';\nimport { GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX } from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport { getAmplitude, toTelegramSource } from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: \"input\" | \"output\";\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n \n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n \n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public lol: boolean;\n \n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach(track => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n \n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n \n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n \n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find(item => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n \n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n \n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n \n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n \n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n \n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n \n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n \n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n \n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n \n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n \n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter(x => x.type === 'input');\n const audioItems = filteredItems.filter(x => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n \n rootScope.dispatchEvent('group_call_amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach(track => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.lol) {\n return;\n }\n // return;\n const {inputStream, direction, canCreateConferenceEntry} = this;\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendrecv';\n // const direction: RTCRtpTransceiverInit['direction'] = 'sendonly';\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types: ['audio' | 'video', RTCRtpTransceiverInit][] = [\n ['audio' as const, transceiverInit], \n ['video' as const, transceiverInit/* {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} */]\n ];\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry(entry => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find(transceiver => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const track = tracks.find(track => track.kind === type);\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch(err => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach(track => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { logger, LogTypes } from \"./logger\";\r\n\r\ntype Result = {\r\n bytes: Uint8Array, \r\n waveform?: Uint8Array\r\n};\r\n\r\ntype Task = {\r\n pages: Uint8Array,\r\n withWaveform: boolean,\r\n waveform?: Uint8Array,\r\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\r\n timeout: number\r\n};\r\n\r\nexport class OpusDecodeController {\r\n private worker: Worker;\r\n private wavWorker : Worker;\r\n private sampleRate = 48000;\r\n private tasks: Array = [];\r\n private keepAlive = false;\r\n private isPlaySupportedResult: boolean;\r\n private log = logger('OPUS', LogTypes.Error);\r\n\r\n public isPlaySupported() {\r\n if(this.isPlaySupportedResult !== undefined) return this.isPlaySupportedResult;\r\n\r\n const audio = document.createElement('audio');\r\n return this.isPlaySupportedResult = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\r\n }\r\n\r\n public loadWavWorker() {\r\n if(this.wavWorker) return;\r\n\r\n this.wavWorker = new Worker('waveWorker.min.js');\r\n this.wavWorker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n\r\n this.log('[WAV] got message:', data);\r\n if(data && data.page) {\r\n const bytes = data.page;\r\n this.onTaskEnd(this.tasks.shift(), bytes);\r\n }\r\n });\r\n }\r\n\r\n public loadWorker() {\r\n if(this.worker) return;\r\n\r\n this.worker = new Worker('decoderWorker.min.js');\r\n this.worker.addEventListener('message', (e) => {\r\n const data = e.data;\r\n \r\n this.log('[DECODER] got message', data);\r\n if(data.type === 'done') {\r\n //this.log('[DECODER] send done to wav');\r\n this.wavWorker.postMessage({command: 'done'});\r\n\r\n if(data.waveform) {\r\n this.tasks[0].waveform = data.waveform;\r\n }\r\n } else { // e.data contains decoded buffers as float32 values\r\n //this.log('[DECODER] send encode to wav');\r\n this.wavWorker.postMessage({\r\n command: 'encode',\r\n buffers: e.data\r\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\r\n }\r\n });\r\n }\r\n\r\n public setKeepAlive(keepAlive: boolean) {\r\n this.keepAlive = keepAlive;\r\n if(this.keepAlive) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n } else if(!this.tasks.length) {\r\n this.terminateWorkers();\r\n }\r\n }\r\n\r\n public onTaskEnd(task: Task, result?: Uint8Array) {\r\n if(!result) {\r\n task.callback.reject('timeout');\r\n } else {\r\n clearTimeout(task.timeout);\r\n task.callback.resolve({bytes: result, waveform: task.waveform});\r\n }\r\n\r\n if(this.tasks.length) {\r\n this.executeNewTask(this.tasks[0]);\r\n }\r\n\r\n this.terminateWorkers();\r\n }\r\n\r\n public terminateWorkers(kill = false) {\r\n if((this.keepAlive || this.tasks.length) && !kill) return;\r\n\r\n if(this.worker) {\r\n this.worker.terminate();\r\n this.worker = null;\r\n }\r\n \r\n if(this.wavWorker) {\r\n this.wavWorker.terminate();\r\n this.wavWorker = null;\r\n }\r\n }\r\n\r\n public executeNewTask(task: Task) {\r\n this.worker.postMessage({ \r\n command: 'init',\r\n decoderSampleRate: this.sampleRate,\r\n outputBufferSampleRate: this.sampleRate\r\n });\r\n\r\n this.wavWorker.postMessage({ \r\n command: 'init',\r\n wavBitDepth: 16,\r\n wavSampleRate: this.sampleRate\r\n });\r\n\r\n //console.log('sending command to worker:', task);\r\n //setTimeout(() => {\r\n this.log('[DECODER] send decode');\r\n this.worker.postMessage({\r\n command: 'decode',\r\n pages: task.pages,\r\n waveform: task.withWaveform\r\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\r\n //}, 1e3);\r\n\r\n task.timeout = window.setTimeout(() => {\r\n this.log.error('decode timeout'/* , task */);\r\n\r\n this.terminateWorkers(true);\r\n if(this.tasks.length) {\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n }\r\n\r\n this.onTaskEnd(this.tasks.shift());\r\n }, 10e3);\r\n }\r\n\r\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\r\n return new Promise((resolve, reject) => {\r\n const task = {\r\n pages,\r\n withWaveform,\r\n callback: {resolve, reject},\r\n timeout: 0\r\n };\r\n\r\n this.loadWorker();\r\n this.loadWavWorker();\r\n\r\n if(this.tasks.push(task) === 1) {\r\n this.executeNewTask(task);\r\n }\r\n });\r\n }\r\n\r\n public async decode(typedArray: Uint8Array, withWaveform = false) {\r\n return this.pushDecodeTask(typedArray, withWaveform).then(result => {\r\n const dataBlob = new Blob([result.bytes], {type: \"audio/wav\"});\r\n return {url: URL.createObjectURL(dataBlob), waveform: result.waveform};\r\n });\r\n }\r\n}\r\n\r\nconst opusDecodeController = new OpusDecodeController();\r\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\r\nexport default opusDecodeController;","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport appPhotosManager from \"./appPhotosManager\";\r\nimport appDocsManager from \"./appDocsManager\";\r\nimport { RichTextProcessor } from \"../richtextprocessor\";\r\nimport { ReferenceContext } from \"../mtproto/referenceDatabase\";\r\nimport rootScope from \"../rootScope\";\r\nimport { safeReplaceObject } from \"../../helpers/object\";\r\nimport { limitSymbols } from \"../../helpers/string\";\r\nimport { WebPage } from \"../../layer\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\r\n\r\ntype WebPageMessageKey = `${PeerId}_${number}`;\r\n\r\nexport class AppWebPagesManager {\r\n private webpages: {\r\n [webPageId: string]: WebPage\r\n } = {};\r\n private pendingWebPages: {\r\n [webPageId: string]: Set\r\n } = {};\r\n \r\n constructor() {\r\n rootScope.addMultipleEventsListeners({\r\n updateWebPage: (update) => {\r\n this.saveWebPage(update.webpage);\r\n }\r\n });\r\n }\r\n \r\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\r\n if(apiWebPage._ === 'webPageNotModified') return;\r\n const {id} = apiWebPage;\r\n\r\n const oldWebPage = this.webpages[id];\r\n const isUpdated = oldWebPage && \r\n oldWebPage._ === apiWebPage._ && \r\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\r\n\r\n if(apiWebPage._ === 'webPage') {\r\n if(apiWebPage.photo?._ === 'photo') {\r\n apiWebPage.photo = appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\r\n } else {\r\n delete apiWebPage.photo;\r\n }\r\n \r\n if(apiWebPage.document?._ === 'document') {\r\n apiWebPage.document = appDocsManager.saveDoc(apiWebPage.document, mediaContext);\r\n } else {\r\n if(apiWebPage.type === 'document') {\r\n delete apiWebPage.type;\r\n }\r\n \r\n delete apiWebPage.document;\r\n }\r\n\r\n const siteName = apiWebPage.site_name;\r\n let shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\r\n if(siteName && shortTitle === siteName) {\r\n delete apiWebPage.site_name;\r\n }\r\n\r\n shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\r\n let contextHashtag = '';\r\n if(siteName === 'GitHub') {\r\n const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\r\n if(matches) {\r\n contextHashtag = matches[0] + '/issues/{1}';\r\n }\r\n }\r\n\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\r\n\r\n if(!photoTypeSet.has(apiWebPage.type) &&\r\n !apiWebPage.description &&\r\n apiWebPage.photo) {\r\n apiWebPage.type = 'photo';\r\n }\r\n }\r\n \r\n let pendingSet = this.pendingWebPages[id];\r\n if(messageKey) {\r\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\r\n pendingSet.add(messageKey);\r\n }\r\n \r\n if(oldWebPage === undefined) {\r\n this.webpages[id] = apiWebPage;\r\n } else {\r\n safeReplaceObject(oldWebPage, apiWebPage);\r\n }\r\n \r\n if(!messageKey && pendingSet !== undefined && isUpdated) {\r\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\r\n pendingSet.forEach((value) => {\r\n const [peerId, mid, isScheduled] = value.split('_');\r\n msgs.push({\r\n peerId: peerId.toPeerId(), \r\n mid: +mid, \r\n isScheduled: !!isScheduled\r\n });\r\n });\r\n\r\n rootScope.dispatchEvent('webpage_updated', {\r\n id,\r\n msgs\r\n });\r\n }\r\n\r\n return apiWebPage;\r\n }\r\n\r\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\r\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\r\n }\r\n\r\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\r\n const id = (webPage as WebPage.webPage).id;\r\n if(!id) return;\r\n\r\n const set = this.pendingWebPages[id];\r\n if(set && set.has(messageKey)) {\r\n set.delete(messageKey);\r\n\r\n if(!set.size) {\r\n delete this.pendingWebPages[id];\r\n }\r\n }\r\n }\r\n\r\n public getWebPage(id: WebPage.webPage['id']) {\r\n return this.webpages[id];\r\n }\r\n}\r\n\r\nconst appWebPagesManager = new AppWebPagesManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appWebPagesManager = appWebPagesManager);\r\nexport default appWebPagesManager;\r\n","import IS_WEBP_SUPPORTED from \"./webpSupport\";\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","import simulateEvent from \"../../../helpers/dom/dispatchEvent\";\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":739712882,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":142306870,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactons\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":-1826077446,\"predicate\":\"messageUserReaction\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessageUserReaction\"},{\"id\":-1553558980,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"}]},\"layer\":137} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n\nexport function sha256HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n let bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\nimport { addPadding, isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, bigInt2str, int2bigInt, sub_ } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n /* let perf = performance.now();\n const jsbnBytes: Uint8Array = new Uint8Array(8);\n const jsbnBigInt = bigStringInt(sLong);\n for(let i = 0; i < 8; i++) {\n jsbnBytes[i] = +jsbnBigInt.shiftRight(8 * i).and(bigint(255)).toString(10);\n }\n console.log('perf1', performance.now() - perf); */\n\n // perf = performance.now();\n let bigInt: number[];\n if(sLong[0] === '-') { // leemon library can't parse signed numbers\n bigInt = int2bigInt(0, 64, 8);\n sub_(bigInt, str2bigInt(sLong.slice(1), 10, 64));\n } else {\n bigInt = str2bigInt(sLong, 10, 64);\n }\n\n const hex = bigInt2str(bigInt, 16).slice(-16);\n const bytes = addPadding(bytesFromHex(hex).reverse(), 8, true, true, false);\n\n // console.log('perf2', performance.now() - perf);\n\n this.storeRawBytes(bytes);\n\n // if(jsbnBytes.hex !== bytes.hex) {\n // console.error(bigInt, sLong, bigInt2str(bigInt, 10), negative(bigInt), jsbnBytes.hex, bigInt2str(bigInt, 16), bytes.hex);\n // }\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\r\n \r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = powMod(g, x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n \r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await CryptoWorker.invokeCrypto('sha256-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport { indexOfAndSplice } from '../../helpers/array';\r\nimport App from '../../config/app';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256-hash', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n result.result = deserializer.fetchObject(type, field + '[result]');\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\n\n \nimport transportController from \"./transports/controller\";\n \n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1-hash', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1-hash', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n info.networker.changeTransport(transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n networker.changeTransport(transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","export default async function getScreenStream(constraints: DisplayMediaStreamConstraints) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n return screenStream;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from \"./getScreenStream\";\nimport getStream from \"./getStream\";\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true, \n constraints: DisplayMediaStreamConstraints,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints, \n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then(stream => out.audio = stream),\n constraints.video && cache.video.then(stream => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, { EventListenerListeners } from \"../../helpers/eventListenerBase\";\nimport noop from \"../../helpers/noop\";\nimport { logger } from \"../logger\";\nimport getAudioConstraints from \"./helpers/getAudioConstraints\";\nimport getStreamCached from \"./helpers/getStreamCached\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager, { StreamItem } from \"./streamManager\";\n\nexport type TryAddTrackOptions = {\n stream: MediaStream, \n track: MediaStreamTrack, \n type: StreamItem['type'], \n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n \n return this.getStream({\n constraints, \n muted\n }).then(stream => {\n if(stream.getVideoTracks().length) {\n this.saveInputVideoStream(stream, 'main');\n }\n \n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0], \n track: event.track, \n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream, \n track, \n type: 'input', \n source: type || 'main'\n });\n }\n \n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n \n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n \n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n \n if(!isVideo) {\n player.appendChild(element);\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n \n if(description) {\n streamManager.appendToConference(description);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' | \n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' | \n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' | \n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find(line => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map(section => section.lines))\n .map(line => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeKey } from \".\";\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'], \n port: SDPMediaLineParts['port'], \n protocol: SDPMediaLineParts['protocol'], \n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n \n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport SDPAttributeSplitted from \"./attributeSplitted\";\nimport SDPMediaLineParts from \"./mediaLineParts\";\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n \n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach(str => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n \n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n \n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n \n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from \"./attributeInner\";\nimport SDPLine from \"./line\";\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n \n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { AttributeMap } from \".\";\nimport { NoExtraProperties } from \"../../../types\";\nimport SDPAttributes from \"./attributes\";\nimport SDPLine from \"./line\";\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from \"./line\";\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter(line => line.key === 'o').map(line => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \".\";\nimport splitStringByLimitWithRest from \"../../../helpers/string/splitStringByLimitWithRest\";\nimport UniqueNumberGenerator from \"../../../helpers/uniqueNumberGenerator\";\nimport SDPLine from \"./line\";\nimport SDPMediaSection from \"./mediaSection\";\nimport SDPSessionSection from \"./sessionSection\";\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, mediaSections: SDPMediaSection[] = [], lines: SDPLine[] = [];\n str.split(/\\r?\\n/).forEach(lineStr => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach(ssrc => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach(v => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from \"../sdp\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { toTelegramSource } from \"../utils\";\nimport { parseSourceGroups } from \"./parseSourceGroups\";\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n fingerprint: true,\n setup: true,\n ssrc: true,\n mid: true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find(line => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { GroupCallParticipantVideoSourceGroup } from \"../../../layer\";\nimport { toTelegramSource } from \"../utils\";\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map(str => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map(ssrc => +ssrc)\n sources: rest.map(ssrc => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex(g => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport { copy } from \"../../../helpers/object\";\nimport { ConferenceEntry } from \"../localConferenceDescription\";\nimport { parseSdp, addSimulcast } from \"../sdp/utils\";\nimport { generateMediaFirstLine, SDPBuilder } from \"../sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit, \n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find(line => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map(payload => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n \n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n let newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../helpers/array\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { Updates, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, JoinGroupCallJsonPayload } from \"../appManagers/appGroupCallsManager\";\nimport apiManager from \"../mtproto/apiManager\";\nimport rootScope from \"../rootScope\";\nimport CallConnectionInstanceBase, { CallConnectionInstanceOptions } from \"./callConnectionInstanceBase\";\nimport GroupCallInstance from \"./groupCallInstance\";\nimport filterServerCodecs from \"./helpers/filterServerCodecs\";\nimport fixLocalOffer from \"./helpers/fixLocalOffer\";\nimport processMediaSection from \"./helpers/processMediaSection\";\nimport { ConferenceEntry } from \"./localConferenceDescription\";\nimport SDP from \"./sdp\";\nimport SDPMediaSection from \"./sdp/mediaSection\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport { UpdateGroupCallConnectionData } from \"./types\";\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract, \n isMuted?: boolean, \n joinVideo?: boolean, \n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({ \n iceServers: [], \n iceTransportPolicy: 'all', \n bundlePolicy: 'max-bundle', \n rtcpMuxPolicy: 'require', \n iceCandidatePoolSize: 0, \n // sdpSemantics: \"unified-plan\", \n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach(type => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map(section => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n \n return processed;\n });\n\n let promise: Promise;\n const audioChannel = processedChannels.find(channel => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find(channel => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach(entry => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n \n const groupCallInput = appGroupCallsManager.getGroupCallInput(groupCallId);\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params,\n };\n\n promise = apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n const update = (updates as Updates.updates).updates.find(update => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n \n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer, \n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter(media => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n \n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n \n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find(section => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle, \n entries, \n isAnswer\n })\n };\n\n entriesToDelete.forEach(entry => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n \n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n \n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { safeAssign } from \"../../helpers/object\";\nimport { logger } from \"../logger\";\nimport createDataChannel from \"./helpers/createDataChannel\";\nimport createPeerConnection from \"./helpers/createPeerConnection\";\nimport LocalConferenceDescription from \"./localConferenceDescription\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { Logger, logger } from \"../../logger\";\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { DataJSON } from \"../../../layer\";\nimport { JoinGroupCallJsonPayload } from \"../../appManagers/appGroupCallsManager\";\nimport SDP from \"../sdp\";\nimport { Ssrc } from \"../types\";\nimport parseMediaSectionInfo from \"./parseMediaSectionInfo\";\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n fingerprints: [sectionInfo.fingerprint],\n pwd: sectionInfo.pwd,\n ssrc: sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n ufrag: sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params, \n source: sectionInfo.source, \n media, \n sourceGroups: sectionInfo.sourceGroups, \n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { forEachReverse } from \"../../../helpers/array\";\nimport SDPMediaSection from \"../sdp/mediaSection\";\nimport { UpdateGroupCallConnectionData, Codec } from \"../types\";\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map(data => {\n return */['audio' as const, 'video' as const].filter(type => data[type]).map(type => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find(line => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec[\"rtp-hdrexts\"], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport { indexOfAndSplice } from \"../../helpers/array\";\nimport { safeAssign } from \"../../helpers/object\";\nimport throttle from \"../../helpers/schedulers/throttle\";\nimport { GroupCall, GroupCallParticipant, Updates } from \"../../layer\";\nimport apiUpdatesManager from \"../appManagers/apiUpdatesManager\";\nimport appGroupCallsManager, { GroupCallConnectionType, GroupCallId, GroupCallOutputSource } from \"../appManagers/appGroupCallsManager\";\nimport appPeersManager from \"../appManagers/appPeersManager\";\nimport { logger } from \"../logger\";\nimport apiManager from \"../mtproto/apiManager\";\nimport { NULL_PEER_ID } from \"../mtproto/mtproto_config\";\nimport rootScope from \"../rootScope\";\nimport CallInstanceBase, { TryAddTrackOptions } from \"./callInstanceBase\";\nimport GroupCallConnectionInstance from \"./groupCallConnectionInstance\";\nimport GROUP_CALL_STATE from \"./groupCallState\";\nimport getScreenConstraints from \"./helpers/getScreenConstraints\";\nimport getScreenStream from \"./helpers/getScreenStream\";\nimport getStream from \"./helpers/getStream\";\nimport getVideoConstraints from \"./helpers/getVideoConstraints\";\nimport stopTrack from \"./helpers/stopTrack\";\nimport localConferenceDescription from \"./localConferenceDescription\";\nimport { WebRTCLineType } from \"./sdpBuilder\";\nimport StreamManager from \"./streamManager\";\nimport { Ssrc } from \"./types\";\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n \n // will be set with negotiation\n public joined: boolean;\n \n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections']\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : this.participants.get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => appGroupCallsManager.toggleMuted());\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n clone.setAttribute('playsinline', 'true');\n clone.muted = true;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return appGroupCallsManager.editParticipant(this.id, this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n \n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n \n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n \n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise || (this.startScreenSharingPromise = this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n }));\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: appGroupCallsManager.getGroupCallInput(this.id)\n }).then(updates => {\n apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise || (this.startVideoSharingPromise = this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n }));\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await appGroupCallsManager.editParticipant(this.id, this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n \n if(!rejoin) {\n let promise: Promise;\n const groupCallInput = appGroupCallsManager.getGroupCallInput(this.id);\n\n if(discard) {\n this.log(`[api] discardGroupCall id=${this.id}`);\n promise = apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(this.joined) {\n this.log(`[api] leaveGroupCall id=${this.id}`);\n const connectionInstance = this.connections.main;\n promise = apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: connectionInstance.sources.audio.source\n });\n } else {\n this.log(`[api] id=${this.id} payload=null`);\n promise = apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: {_: 'inputPeerSelf'},\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n const updates = await promise;\n apiUpdatesManager.processUpdateMessage(updates);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n \n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n const participant = this.participants.get(entry.peerId);\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n }\n\n return source;\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = appPeersManager.getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = appGroupCallsManager.makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : appGroupCallsManager.makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach(oldSsrc => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find(ssrc => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach(ssrc => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","export default function getScreenConstraints(): DisplayMediaStreamConstraints {\n return {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n },\n audio: true\n };\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport I18n, { i18n, join, LangPackKey } from \"../lib/langPack\";\r\nimport formatDuration, { DurationType } from \"./formatDuration\";\r\n\r\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\r\n s: 'Seconds',\r\n m: 'Minutes',\r\n h: 'Hours',\r\n d: 'Days',\r\n w: 'Weeks'\r\n};\r\nexport default function formatCallDuration(duration: number, plain?: boolean) {\r\n const a = formatDuration(duration, 2);\r\n if(plain) {\r\n const strings = a.map(d => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\r\n return join(strings, false, plain);\r\n }\r\n\r\n const elements = a.map(d => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\r\n\r\n const fragment = document.createElement('span');\r\n fragment.append(...join(elements, false));\r\n\r\n return fragment;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w';\r\nexport default function formatDuration(duration: number, showLast = 2) {\r\n if(!duration) {\r\n duration = 1;\r\n }\r\n\r\n let d: {duration: number, type: DurationType}[] = [];\r\n const p = [\r\n {m: 1, t: 's'},\r\n {m: 60, t: 'm'}, \r\n {m: 60, t: 'h'}, \r\n {m: 24, t: 'd'}, \r\n {m: 7, t: 'w'}\r\n ] as Array<{m?: number, t: DurationType}>\r\n const s = 1;\r\n let t = s;\r\n p.forEach((o, idx) => {\r\n t *= o.m;\r\n\r\n if(duration < t) {\r\n return;\r\n }\r\n\r\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\r\n d.push({\r\n duration: (duration / t % modulus | 0),\r\n type: o.t\r\n });\r\n });\r\n\r\n const out = d.slice(-showLast).reverse();\r\n for(let i = out.length - 1; i >= 0; --i) {\r\n if(out[i].duration === 0) {\r\n out.splice(i, 1);\r\n }\r\n }\r\n \r\n return out;\r\n}\r\n","import { IS_APPLE_MOBILE, IS_SAFARI } from \"./userAgent\";\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","import IS_MOV_SUPPORTED from \"./movSupport\";\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import constraintSupported, { MyMediaTrackSupportedConstraints } from \"../../../environment/constraintSupport\";\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach(constraint => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean, \n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport { IS_FIREFOX } from '../../environment/userAgent';\nimport LocalConferenceDescription, { ConferenceEntry } from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport { GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData } from './types';\nimport { fromTelegramSource } from './utils';\n\nexport type WebRTCLineType = 'video' | 'audio' | 'application';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${mediaType} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n \n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n \n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach(ssrcGroup => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n \n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n \n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${type} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n \n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map(type => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`,\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n \n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach(hdrext => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n \n payloadTypes.forEach(type => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n \n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n \n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach(fb => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n \n public addConference(options: {\n conference: LocalConferenceDescription, \n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean, \n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n \n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[] = [];\n private newLine: string[] = [];\n\n constructor(private joiner = '\\r\\n') {\n\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n \n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/6.e3732f1eca587373fceb.chunk.js b/public/6.02b679f962719848ba99.chunk.js similarity index 98% rename from public/6.e3732f1eca587373fceb.chunk.js rename to public/6.02b679f962719848ba99.chunk.js index a326a4436..44c223fa1 100644 --- a/public/6.e3732f1eca587373fceb.chunk.js +++ b/public/6.02b679f962719848ba99.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[6],{111:function(e,t,n){"use strict";function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function i(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function s(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{o(e,t,!1)})}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function c(){return!!r()}n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}))},115:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},133:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(15),i=n(0);function s(e){if("Enter"===e.key&&!i.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},139:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(72);var i=function(e,t){let n,o,i,s={},r=0,c=0,a=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,c=e.offsetHeight/2-100;u(200,200),p(r,c),m(r,c),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){a=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function p(e,t){c=t*d,r=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,r,c=Math.floor(o.clientWidth+e),a=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;c<50||c>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+c,r=n+a,t<0&&(t=0),n<0&&(n=0),s>l||r>d||(u(c,c),p(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,r,c,a={x:0,y:0};e.preventDefault(),e.stopPropagation(),a.x=e.pageX||e.touches&&e.touches[0].pageX,a.y=e.pageY||e.touches&&e.touches[0].pageY,t=a.x-(s.mouse_x-s.container_left),n=a.y-(s.mouse_y-s.container_top),r=o.offsetWidth,c=o.offsetHeight,t<0?t=0:t>i.offsetWidth-r&&(t=i.offsetWidth-r),n<0?n=0:n>i.offsetHeight-c&&(n=i.offsetHeight-c),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=a,t.height=l,t.getContext("2d").drawImage(e,r,c,a,l,0,0,a,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(58),r=n(16),c=n(98),a=n(30);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(r._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(c.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(a.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},58:function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return E}));var o=n(15),i=n(18),s=n(70),r=n(49),c=n(16),a=n(6),l=n(8),d=n(80),h=n(30),u=n(133),p=n(5),m=n(48),f=n(39),v=n(111);const b=document.body;let g=b;const w=()=>{g=Object(v.c)()||b,y.reAppend()};Object(v.a)(b,w);class y extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.a.backByItem(this.navigationItem)},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.default.isOverlayActive=!1),r.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(f.e)(y.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(a.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(c.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(c.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container),y.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},r.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.default.isOverlayActive=!0,s.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(u.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)})}static getPopup(e){return this.POPUPS.find(t=>t instanceof e)}}y.POPUPS=[];const E=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},72:function(e,t,n){"use strict";var o=n(15),i=n(33),s=n(45),r=n(115),c=n(127),a=n(29);const l=new class{constructor(){this.cacheStorage=new c.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(r.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};a.a&&(a.a.appDownloadManager=l),t.a=l},80:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}}}]); -//# sourceMappingURL=6.e3732f1eca587373fceb.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[6],{111:function(e,t,n){"use strict";function o(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function i(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function s(e,t,n){const o=n?n.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach(e=>{o(e,t,!1)})}function r(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function c(){return!!r()}n.d(t,"e",(function(){return o})),n.d(t,"b",(function(){return i})),n.d(t,"a",(function(){return s})),n.d(t,"c",(function(){return r})),n.d(t,"d",(function(){return c}))},115:function(e,t,n){"use strict";n.d(t,"a",(function(){return o})),n.d(t,"b",(function(){return i}));function o(e,t){const n=""["".length-1]||"";let o;switch(e._){case"inputPhotoFileLocation":o=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":o=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":o=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":o=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":o=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":o=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),o=""}return o+(n?"."+n:n)}function i(e,t){return"/"+e+"/"+encodeURIComponent(JSON.stringify(t))}},133:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var o=n(15),i=n(0);function s(e){if("Enter"===e.key&&!i.IS_MOBILE&&!e.isComposing){if("enter"===o.default.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=i.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(i.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},139:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(73);var i=function(e,t){let n,o,i,s={},r=0,c=0,a=0,l=0,d=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,i=new Image,i.src=e.src,i.draggable=!1,i.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),n=document.createElement("div"),n.classList.add("crop-component"),o=document.createElement("div"),o.classList.add("crop-overlay");const s=document.createElement("div");s.classList.add("crop-overlay-color"),n.appendChild(o);e.parentNode.appendChild(n),n.appendChild(i),n.appendChild(e),n.appendChild(s),o.appendChild(i),i.style.maxWidth=e.width+"px",d=e.naturalWidth/e.offsetWidth;const r=e.offsetWidth/2-100,c=e.offsetHeight/2-100;u(200,200),p(r,c),m(r,c),o.addEventListener("mousedown",g,!1),o.addEventListener("touchstart",g,!1),o.addEventListener("wheel",b,!1),document.addEventListener("keypress",v,!1)}function u(e,t){a=e*d,l=t*d,o.style.width=e+"px",o.style.height=t+"px"}function p(e,t){c=t*d,r=e*d,i.style.top=-t+"px",i.style.left=-e+"px"}function m(e,t){o.style.top=t+"px",o.style.left=e+"px"}function f(e){e=e*Math.PI*2;let t,n,s,r,c=Math.floor(o.clientWidth+e),a=Math.floor(o.clientHeight+e),l=i.clientWidth,d=i.clientHeight;c<50||c>l||(t=o.offsetLeft-e/2,n=o.offsetTop-e/2,s=t+c,r=n+a,t<0&&(t=0),n<0&&(n=0),s>l||r>d||(u(c,c),p(t,n),m(t,n)))}function v(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":f(4);break;case"-":f(-4)}}function b(e){e.preventDefault(),f(e.deltaY>0?1:-1)}function g(e){e.preventDefault(),e.stopPropagation(),function(e){s.container_width=o.offsetWidth,s.container_height=o.offsetHeight,s.container_left=o.offsetLeft,s.container_top=o.offsetTop,s.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,s.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",y),document.addEventListener("touchmove",y),document.addEventListener("mouseup",w),document.addEventListener("touchend",w)}function w(e){e.preventDefault(),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y)}function y(e){let t,n,r,c,a={x:0,y:0};e.preventDefault(),e.stopPropagation(),a.x=e.pageX||e.touches&&e.touches[0].pageX,a.y=e.pageY||e.touches&&e.touches[0].pageY,t=a.x-(s.mouse_x-s.container_left),n=a.y-(s.mouse_y-s.container_top),r=o.offsetWidth,c=o.offsetHeight,t<0?t=0:t>i.offsetWidth-r&&(t=i.offsetWidth-r),n<0?n=0:n>i.offsetHeight-c&&(n=i.offsetHeight-c),p(t,n),m(t,n)}return e.complete?h():e.onload=h,{crop:function(){t.width=a,t.height=l,t.getContext("2d").drawImage(e,r,c,a,l,0,0,a,l)},removeHandlers:function(){o.removeEventListener("mousedown",g),o.removeEventListener("touchstart",g),o.removeEventListener("wheel",b),document.removeEventListener("mouseup",w),document.removeEventListener("touchend",w),document.removeEventListener("mousemove",y),document.removeEventListener("touchmove",y),document.removeEventListener("keypress",v),n.remove(),o.remove(),i.remove()}}},s=n(58),r=n(16),c=n(98),a=n(30);class l extends s.b{constructor(){super("popup-avatar",null,{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),Object(r._i18n)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",e=>{const t=e.target.files[0];t&&Object(c.b)(t).then(e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=i(this.image,this.canvas),this.input.value=""}})},!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",Object(a.b)(this.btnConfirm,()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob(e=>{this.blob=e,this.darkenCanvas(),this.resolve()},"image/jpeg",1)},{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()})}resolve(){this.onCrop(()=>o.a.upload(this.blob))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){let e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},58:function(e,t,n){"use strict";n.d(t,"b",(function(){return y})),n.d(t,"a",(function(){return E}));var o=n(15),i=n(18),s=n(71),r=n(49),c=n(16),a=n(6),l=n(8),d=n(80),h=n(30),u=n(133),p=n(5),m=n(48),f=n(39),v=n(111);const b=document.body;let g=b;const w=()=>{g=Object(v.c)()||b,y.reAppend()};Object(v.a)(b,w);class y extends m.a{constructor(e,t,n={}){super(!1),this.buttons=t,this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{r.a.backByItem(this.navigationItem)},this.destroy=()=>{this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.withoutOverlay||(o.default.isOverlayActive=!1),r.a.removeItem(this.navigationItem),this.navigationItem=void 0,Object(f.e)(y.POPUPS,this),w(),setTimeout(()=>{this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),this.withoutOverlay||s.a.checkAnimations(!1)},150)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),this.title.classList.add("popup-title"),this.header.append(this.title),this.listenerSetter=new d.a,this.confirmShortcutIsSendShortcut=n.confirmShortcutIsSendShortcut,n.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),Object(h.b)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=n.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),n.overlayClosable&&Object(h.b)(this.element,e=>{Object(a.a)(e.target,"popup-container")||this.hide()},{listenerSetter:this.listenerSetter}),n.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==n.withConfirm&&this.btnConfirm.append(Object(c.i18n)(n.withConfirm)),this.header.append(this.btnConfirm),Object(i.ripple)(this.btnConfirm)),this.container.append(this.header),n.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body));let l=this.btnConfirm;if(null==t?void 0:t.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons"),2===t.length&&e.classList.add("popup-buttons-row");const n=t.map(e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),Object(i.ripple)(t),e.text?t.innerHTML=e.text:t.append(Object(c.i18n)(e.langKey,e.langArgs)),Object(h.b)(t,()=>{e.callback&&e.callback(),this.destroy()},{listenerSetter:this.listenerSetter,once:!0}),e.element=t});if(!l&&2===t.length){const e=t.find(e=>!e.isCancel);e&&(l=e.element)}e.append(...n),this.container.append(e)}this.btnConfirmOnEnter=l,this.element.append(this.container),y.POPUPS.push(this)}show(){this.navigationItem={type:"popup",onPop:this.destroy,onEscape:this.onEscape},r.a.pushItem(this.navigationItem),Object(l.a)(),g.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.withoutOverlay||(o.default.isOverlayActive=!0,s.a.checkAnimations(!0)),this.btnConfirmOnEnter&&setTimeout(()=>{this.listenerSetter.add(document.body)("keydown",e=>{(this.confirmShortcutIsSendShortcut?Object(u.a)(e):"Enter"===e.key)&&(Object(h.d)(this.btnConfirmOnEnter),Object(p.a)(e))})},0)}static reAppend(){this.POPUPS.forEach(e=>{const{element:t,container:n}=e,o=t.parentElement;o&&o!==g&&g!==n&&g.append(t)})}static getPopup(e){return this.POPUPS.find(t=>t instanceof e)}}y.POPUPS=[];const E=e=>(e.find(e=>e.isCancel)||e.push({langKey:"Cancel",isCancel:!0}),e)},73:function(e,t,n){"use strict";var o=n(15),i=n(33),s=n(45),r=n(115),c=n(127),a=n(29);const l=new class{constructor(){this.cacheStorage=new c.a("cachedFiles"),this.downloads={},this.progress={},this.progressCallbacks={},this.uploadId=0,this.thumbsCache={photo:{},document:{}},o.default.addEventListener("download_progress",e=>{const t=e;this.progress[t.fileName]=t;const n=this.progressCallbacks[t.fileName];n&&n.forEach(e=>e(t));const o=this.downloads[t.fileName];o&&o.notifyAll(t)})}getNewDeferred(e){const t=Object(s.a)();return t.cancel=()=>{const n=new Error("Download canceled");n.name="AbortError",i.a.cancelDownload(e),t.reject(n),t.cancel=()=>{}},t.finally(()=>{delete this.progress[e],delete this.progressCallbacks[e]}),t.catch(()=>{this.clearDownload(e)}),this.downloads[e]=t}clearDownload(e){delete this.downloads[e]}fakeDownload(e,t){const n=this.getNewDeferred(e);return"string"==typeof t?fetch(t).then(e=>e.blob()).then(e=>n.resolve(e)):n.resolve(t),n}download(e){const t=Object(r.a)(e.location,{fileName:e.fileName});if(this.downloads.hasOwnProperty(t))return this.downloads[t];const n=this.getNewDeferred(t),o=e=>{n.reject(e)};return(()=>{if(!i.a.worker||e.onlyCache){const s=this.cacheStorage.getFile(t).then(t=>{if(t.sizei.a.downloadFile(e).then(n.resolve,o))}i.a.downloadFile(e).then(n.resolve,o)})(),n}upload(e,t){if(!t){const n=null==e?void 0:e.type;if(n){const e=this.uploadId+++"."+n.split("/")[1];t=["image/jpeg","image/png","image/bmp"].indexOf(n)>=0?"photo"+e:0===n.indexOf("audio/")||["video/ogg"].indexOf(n)>=0?"audio"+e:0===n.indexOf("video/")?"video"+e:"document"+e}else t="upload-"+this.uploadId++}const n=this.getNewDeferred(t);return i.a.uploadFile({file:e,fileName:t}).then(n.resolve,n.reject),n.finally(()=>{this.clearDownload(t)}),n}getDownload(e){return this.downloads[e]}addProgressCallback(e,t){var n;const o=this.progress[e];(null!==(n=this.progressCallbacks[e])&&void 0!==n?n:this.progressCallbacks[e]=[]).push(t),o&&t(o)}createDownloadAnchor(e,t,n){const o=document.createElement("a");o.href=e,o.download=t,o.target="_blank",o.style.position="absolute",o.style.top="1px",o.style.left="1px",document.body.append(o);try{var i=document.createEvent("MouseEvents");i.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),o.dispatchEvent(i)}catch(t){console.error("Download click error",t);try{o.click()}catch(t){window.open(e,"_blank")}}setTimeout(()=>{o.remove(),n&&n()},100)}downloadToDisc(e,t){const n=this.download(e);return n.then(e=>{const n=URL.createObjectURL(e);this.createDownloadAnchor(n,t,()=>{URL.revokeObjectURL(n)})}),n}getCacheContext(e,t="full"){var n,o;const i=null!==(n=this.thumbsCache[e._][e.id])&&void 0!==n?n:this.thumbsCache[e._][e.id]={};return null!==(o=i[t])&&void 0!==o?o:i[t]={downloaded:0,url:""}}};a.a&&(a.a.appDownloadManager=l),t.a=l},80:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));class o{constructor(){this.listeners=new Set}add(e){return(t,n,o)=>{const i={element:e,event:t,callback:n,options:o};return this.addManual(i),i}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,n,o){let i;for(const s of this.listeners)if(s.element===e&&s.event===t&&s.callback===n&&s.options===o){i=s;break}i&&this.remove(i)}removeAll(){this.listeners.forEach(e=>{this.remove(e)})}}}}]); +//# sourceMappingURL=6.02b679f962719848ba99.chunk.js.map \ No newline at end of file diff --git a/public/6.e3732f1eca587373fceb.chunk.js.map b/public/6.02b679f962719848ba99.chunk.js.map similarity index 99% rename from public/6.e3732f1eca587373fceb.chunk.js.map rename to public/6.02b679f962719848ba99.chunk.js.map index 18a82d1af..a1d865387 100644 --- a/public/6.e3732f1eca587373fceb.chunk.js.map +++ b/public/6.02b679f962719848ba99.chunk.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","isSendShortcutPressed","e","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","destroy","dispatchEvent","removeAll","withoutOverlay","isOverlayActive","removeItem","undefined","POPUPS","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","find","isCancel","push","onPop","pushItem","popup","parentElement","popupConstructor","addCancelButton","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener"],"mappings":"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","file":"6.e3732f1eca587373fceb.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/helpers/dom/fullScreen.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/helpers/dom/isSendShortcutPressed.ts","webpack:///./src/lib/cropper.ts","webpack:///./src/components/popups/avatar.ts","webpack:///./src/components/popups/index.ts","webpack:///./src/lib/appManagers/appDownloadManager.ts","webpack:///./src/helpers/listenerSetter.ts"],"names":["requestFullScreen","element","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","document","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","callback","listenerSetter","addListener","add","addEventListener","bind","split","forEach","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getFileNameByLocation","location","options","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","getFileURL","type","encodeURIComponent","JSON","stringify","isSendShortcutPressed","e","key","isComposing","settings","sendShortcut","shiftKey","ctrlKey","metaKey","secondaryKey","originalImage","canvas","cropComponent","container","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","init","classList","draggable","Image","src","createElement","overlayColor","appendChild","parentNode","style","maxWidth","width","naturalWidth","offsetWidth","left","CROPWIDTH","top","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","updateContainer","startMoving","resizing","keyHandler","height","imgZoom","zoom","Math","PI","right","bottom","newWidth","floor","clientWidth","newHeight","clientHeight","w","h","offsetLeft","offsetTop","preventDefault","String","fromCharCode","charCode","deltaY","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","clientX","pageX","touches","window","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","removeEventListener","currentTouch","x","y","complete","onload","crop","getContext","drawImage","removeHandlers","remove","super","closable","withConfirm","image","cropper","this","h6","btnClose","header","append","cropContainer","input","display","file","target","files","then","contents","show","value","btnConfirm","className","hide","toBlob","blob","darkenCanvas","resolve","onCrop","appDownloadManager","upload","postCanvas","click","ctx","fillStyle","fillRect","DEFAULT_APPEND_TO","body","appendPopupTo","onFullScreenChange","PopupElement","reAppend","buttons","title","onEscape","backByItem","navigationItem","destroy","dispatchEvent","removeAll","withoutOverlay","isOverlayActive","removeItem","undefined","POPUPS","setTimeout","cleanup","checkAnimations","confirmShortcutIsSendShortcut","prepend","once","overlayClosable","btnConfirmOnEnter","buttonsDiv","buttonsEl","buttonsElements","map","b","button","isDanger","text","innerHTML","langKey","langArgs","find","isCancel","push","onPop","pushItem","popup","parentElement","popupConstructor","addCancelButton","cacheStorage","downloads","progress","progressCallbacks","uploadId","thumbsCache","photo","details","fileName","callbacks","download","notifyAll","deferred","cancel","Error","name","cancelDownload","reject","finally","catch","clearDownload","getNewDeferred","fetch","response","hasOwnProperty","onError","err","worker","onlyCache","promise","getFile","size","downloadFile","tryDownload","mimeType","indexOf","uploadFile","onRemove","a","href","position","clickEvent","createEvent","initMouseEvent","open","discFileName","objectURL","URL","createObjectURL","createDownloadAnchor","revokeObjectURL","media","thumbSize","cache","downloaded","ListenerSetter","listeners","Set","event","listener","addManual","onceCallback","onceFired","delete","_listener"],"mappings":"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","file":"6.02b679f962719848ba99.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from \"../listenerSetter\";\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach(eventName => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { IS_MOBILE, IS_APPLE } from \"../../environment/userAgent\";\r\n\r\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\r\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\r\n /* if(e.ctrlKey || e.metaKey) {\r\n this.messageInput.innerHTML += '
';\r\n placeCaretAtEnd(this.message)\r\n return;\r\n } */\r\n\r\n if(rootScope.settings.sendShortcut === 'enter') {\r\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\r\n return;\r\n }\r\n\r\n return true;\r\n } else {\r\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\r\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\r\n return;\r\n }\r\n\r\n if(secondaryKey) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\r\n let cropComponent: HTMLDivElement, \r\n container: HTMLDivElement, \r\n cropImage: HTMLImageElement, \r\n event_state: Partial<{ \r\n mouse_x: number, \r\n mouse_y: number, \r\n container_width: number, \r\n container_height: number, \r\n container_left: number, \r\n container_top: number\r\n }> = {}, \r\n keyZoomValue = 4.0, \r\n MINWIDTH = 50, \r\n MINHEIGHT = 50, \r\n CROPWIDTH = 200, \r\n CROPHEIGHT = 200, \r\n cropLeft = 0, \r\n cropTop = 0, \r\n cropWidth = 0, \r\n cropHeight = 0,\r\n scaledRatio = 0;\r\n \r\n if(originalImage.complete) init();\r\n else originalImage.onload = init;\r\n \r\n function removeHandlers() {\r\n container.removeEventListener('mousedown', startMoving);\r\n container.removeEventListener('touchstart', startMoving);\r\n container.removeEventListener('wheel', resizing);\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n document.removeEventListener('keypress', keyHandler);\r\n\r\n cropComponent.remove();\r\n container.remove();\r\n cropImage.remove();\r\n }\r\n \r\n function addHandlers() {\r\n container.addEventListener('mousedown', startMoving, false);\r\n container.addEventListener('touchstart', startMoving, false);\r\n container.addEventListener('wheel', resizing, false);\r\n \r\n document.addEventListener('keypress', keyHandler, false);\r\n //document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\r\n }\r\n \r\n function init() {\r\n originalImage.classList.add('crop-blur');\r\n originalImage.draggable = false;\r\n \r\n cropImage = new Image();\r\n cropImage.src = originalImage.src;\r\n cropImage.draggable = false;\r\n cropImage.classList.add('crop-overlay-image');\r\n \r\n if(!canvas) {\r\n canvas = document.createElement('canvas');\r\n }\r\n \r\n cropComponent = document.createElement('div');\r\n cropComponent.classList.add('crop-component');\r\n \r\n container = document.createElement('div');\r\n container.classList.add('crop-overlay');\r\n \r\n const overlayColor = document.createElement('div');\r\n overlayColor.classList.add('crop-overlay-color');\r\n \r\n cropComponent.appendChild(container);\r\n const wrapper = originalImage.parentNode as HTMLElement;\r\n wrapper.appendChild(cropComponent);\r\n cropComponent.appendChild(cropImage);\r\n cropComponent.appendChild(originalImage);\r\n cropComponent.appendChild(overlayColor);\r\n container.appendChild(cropImage);\r\n\r\n cropImage.style.maxWidth = originalImage.width + 'px';\r\n\r\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\r\n \r\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\r\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\r\n \r\n updateCropSize(CROPWIDTH, CROPHEIGHT);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n addHandlers();\r\n //crop();\r\n }\r\n \r\n function updateCropSize(width: number, height: number) {\r\n cropWidth = width * scaledRatio;\r\n cropHeight = height * scaledRatio;\r\n\r\n container.style.width = width + 'px';\r\n container.style.height = height + 'px';\r\n }\r\n \r\n function updateCropImage(left: number, top: number) {\r\n cropTop = top * scaledRatio;\r\n cropLeft = left * scaledRatio;\r\n\r\n cropImage.style.top = -top + 'px';\r\n cropImage.style.left = -left + 'px';\r\n }\r\n \r\n function updateContainer(left: number, top: number) {\r\n container.style.top = top + 'px';\r\n container.style.left = left + 'px';\r\n }\r\n \r\n // Save the initial event details and container state\r\n function saveEventState(e: any) {\r\n event_state.container_width = container.offsetWidth;\r\n event_state.container_height = container.offsetHeight;\r\n \r\n event_state.container_left = container.offsetLeft;\r\n event_state.container_top = container.offsetTop;\r\n \r\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\r\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\r\n }\r\n \r\n function imgZoom(zoom: number) {\r\n zoom = zoom * Math.PI * 2\r\n let newWidth = Math.floor(container.clientWidth + zoom), \r\n newHeight = Math.floor(container.clientHeight + zoom), \r\n w = cropImage.clientWidth, \r\n h = cropImage.clientHeight, \r\n left: number, \r\n top: number, \r\n right: number, \r\n bottom: number;\r\n \r\n if(newWidth < MINWIDTH) {\r\n return;\r\n } else if(newWidth > w) {\r\n return;\r\n }\r\n \r\n left = container.offsetLeft - (zoom / 2);\r\n top = container.offsetTop - (zoom / 2);\r\n right = left + newWidth;\r\n bottom = top + newHeight;\r\n \r\n if(left < 0) left = 0;\r\n if(top < 0) top = 0;\r\n\r\n if(right > w) return;\r\n if(bottom > h) return;\r\n\r\n updateCropSize(newWidth, newWidth);\r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n \r\n function keyHandler(e: KeyboardEvent) {\r\n e.preventDefault();\r\n \r\n switch (String.fromCharCode(e.charCode)) {\r\n case '+' :\r\n imgZoom(keyZoomValue);\r\n break;\r\n case '-' :\r\n imgZoom(-keyZoomValue);\r\n break;\r\n }\r\n }\r\n \r\n function resizing(e: any) {\r\n e.preventDefault();\r\n imgZoom(e.deltaY > 0 ? 1 : -1);\r\n }\r\n \r\n function startMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n saveEventState(e);\r\n \r\n document.addEventListener('mousemove', moving);\r\n document.addEventListener('touchmove', moving);\r\n document.addEventListener('mouseup', endMoving);\r\n document.addEventListener('touchend', endMoving);\r\n }\r\n \r\n function endMoving(e: MouseEvent | TouchEvent) {\r\n e.preventDefault();\r\n \r\n document.removeEventListener('mouseup', endMoving);\r\n document.removeEventListener('touchend', endMoving);\r\n document.removeEventListener('mousemove', moving);\r\n document.removeEventListener('touchmove', moving);\r\n }\r\n \r\n function moving(e: any) {\r\n let currentTouch = {x: 0, y: 0}, \r\n left: number, \r\n top: number, \r\n w: number, \r\n h: number;\r\n \r\n e.preventDefault();\r\n e.stopPropagation();\r\n \r\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\r\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\r\n \r\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\r\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\r\n w = container.offsetWidth;\r\n h = container.offsetHeight;\r\n \r\n if(left < 0) left = 0;\r\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\r\n\r\n if(top < 0) top = 0;\r\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\r\n \r\n updateCropImage(left, top);\r\n updateContainer(left, top);\r\n //crop();\r\n }\r\n\r\n function crop() {\r\n canvas.width = cropWidth;\r\n canvas.height = cropHeight;\r\n \r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(originalImage,\r\n cropLeft, cropTop,\r\n cropWidth, cropHeight,\r\n 0, 0,\r\n cropWidth, cropHeight\r\n );\r\n }\r\n \r\n return {crop, removeHandlers};\r\n}\r\n\r\nexport default resizeableImage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport appDownloadManager from \"../../lib/appManagers/appDownloadManager\";\r\nimport resizeableImage from \"../../lib/cropper\";\r\nimport PopupElement from \".\";\r\nimport { _i18n } from \"../../lib/langPack\";\r\nimport { readBlobAsDataURL } from \"../../helpers/blob\";\r\nimport { attachClickEvent } from \"../../helpers/dom/clickEvent\";\r\n\r\nexport default class PopupAvatar extends PopupElement {\r\n private cropContainer: HTMLElement;\r\n private input: HTMLInputElement;\r\n private h6: HTMLElement;\r\n\r\n private image = new Image();\r\n\r\n private canvas: HTMLCanvasElement;\r\n private blob: Blob;\r\n private cropper = {\r\n crop: () => {},\r\n removeHandlers: () => {}\r\n };\r\n\r\n private onCrop: (upload: () => ReturnType) => void;\r\n\r\n constructor() {\r\n super('popup-avatar', null, {closable: true, withConfirm: true});\r\n\r\n this.h6 = document.createElement('h6');\r\n _i18n(this.h6, 'Popup.Avatar.Title');\r\n\r\n this.btnClose.classList.remove('btn-icon');\r\n\r\n this.header.append(this.h6);\r\n\r\n this.cropContainer = document.createElement('div');\r\n this.cropContainer.classList.add('crop');\r\n this.cropContainer.append(this.image);\r\n\r\n this.input = document.createElement('input');\r\n this.input.type = 'file';\r\n this.input.style.display = 'none';\r\n this.listenerSetter.add(this.input)('change', (e: any) => {\r\n const file = e.target.files[0];\r\n if(!file) {\r\n return;\r\n }\r\n\r\n readBlobAsDataURL(file).then(contents => {\r\n this.image = new Image();\r\n this.cropContainer.append(this.image);\r\n this.image.src = contents;\r\n \r\n this.image.onload = () => {\r\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\r\n cropContainer.style.width = w + 'px';\r\n cropContainer.style.height = h + 'px'; */\r\n this.show();\r\n \r\n this.cropper = resizeableImage(this.image, this.canvas);\r\n this.input.value = '';\r\n };\r\n });\r\n }, false);\r\n\r\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\r\n attachClickEvent(this.btnConfirm, () => {\r\n this.cropper.crop();\r\n this.hide();\r\n\r\n this.canvas.toBlob(blob => {\r\n this.blob = blob; // save blob to send after reg\r\n this.darkenCanvas();\r\n this.resolve();\r\n }, 'image/jpeg', 1);\r\n }, {listenerSetter: this.listenerSetter});\r\n\r\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\r\n\r\n this.addEventListener('closeAfterTimeout', () => {\r\n this.cropper.removeHandlers();\r\n if(this.image) {\r\n this.image.remove();\r\n }\r\n });\r\n }\r\n\r\n private resolve() {\r\n this.onCrop(() => {\r\n return appDownloadManager.upload(this.blob);\r\n });\r\n }\r\n\r\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\r\n this.canvas = postCanvas;\r\n this.onCrop = onCrop;\r\n\r\n this.input.click();\r\n }\r\n\r\n public darkenCanvas() {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.fillStyle = \"rgba(0, 0, 0, 0.3)\";\r\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../../lib/rootScope\";\r\nimport { ripple } from \"../ripple\";\r\nimport animationIntersector from \"../animationIntersector\";\r\nimport appNavigationController, { NavigationItem } from \"../appNavigationController\";\r\nimport { i18n, LangPackKey } from \"../../lib/langPack\";\r\nimport findUpClassName from \"../../helpers/dom/findUpClassName\";\r\nimport blurActiveElement from \"../../helpers/dom/blurActiveElement\";\r\nimport ListenerSetter from \"../../helpers/listenerSetter\";\r\nimport { attachClickEvent, simulateClickEvent } from \"../../helpers/dom/clickEvent\";\r\nimport isSendShortcutPressed from \"../../helpers/dom/isSendShortcutPressed\";\r\nimport { cancelEvent } from \"../../helpers/dom/cancelEvent\";\r\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\nimport { addFullScreenListener, getFullScreenElement, isFullScreen } from \"../../helpers/dom/fullScreen\";\r\n\r\nexport type PopupButton = {\r\n text?: string,\r\n callback?: () => void,\r\n langKey?: LangPackKey,\r\n langArgs?: any[],\r\n isDanger?: true,\r\n isCancel?: true,\r\n element?: HTMLButtonElement\r\n};\r\n\r\nexport type PopupOptions = Partial<{\r\n closable: true, \r\n overlayClosable: true, \r\n withConfirm: LangPackKey | true, \r\n body: true,\r\n confirmShortcutIsSendShortcut: boolean,\r\n withoutOverlay: boolean\r\n}>;\r\n\r\nexport interface PopupElementConstructable {\r\n new(...args: any[]): PopupElement;\r\n}\r\n\r\nconst DEFAULT_APPEND_TO = document.body;\r\nlet appendPopupTo = DEFAULT_APPEND_TO;\r\n\r\nconst onFullScreenChange = () => {\r\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\r\n PopupElement.reAppend();\r\n};\r\n\r\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\r\n\r\nexport default class PopupElement extends EventListenerBase<{\r\n close: () => void,\r\n closeAfterTimeout: () => void\r\n}> {\r\n private static POPUPS: PopupElement[] = [];\r\n protected element = document.createElement('div');\r\n protected container = document.createElement('div');\r\n protected header = document.createElement('div');\r\n protected title = document.createElement('div');\r\n protected btnClose: HTMLElement;\r\n protected btnConfirm: HTMLButtonElement;\r\n protected body: HTMLElement;\r\n protected buttonsEl: HTMLElement;\r\n\r\n protected onEscape: () => boolean = () => true;\r\n\r\n protected navigationItem: NavigationItem;\r\n\r\n protected listenerSetter: ListenerSetter;\r\n\r\n protected confirmShortcutIsSendShortcut: boolean;\r\n protected btnConfirmOnEnter: HTMLButtonElement;\r\n\r\n protected withoutOverlay: boolean;\r\n\r\n constructor(className: string, protected buttons?: Array, options: PopupOptions = {}) {\r\n super(false);\r\n this.element.classList.add('popup');\r\n this.element.className = 'popup' + (className ? ' ' + className : '');\r\n this.container.classList.add('popup-container', 'z-depth-1');\r\n\r\n this.header.classList.add('popup-header');\r\n this.title.classList.add('popup-title');\r\n\r\n this.header.append(this.title);\r\n\r\n this.listenerSetter = new ListenerSetter();\r\n\r\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\r\n\r\n if(options.closable) {\r\n this.btnClose = document.createElement('span');\r\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\r\n //ripple(this.closeBtn);\r\n this.header.prepend(this.btnClose);\r\n\r\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\r\n }\r\n\r\n this.withoutOverlay = options.withoutOverlay;\r\n if(this.withoutOverlay) {\r\n this.element.classList.add('no-overlay');\r\n }\r\n\r\n if(options.overlayClosable) {\r\n attachClickEvent(this.element, (e: MouseEvent) => {\r\n if(!findUpClassName(e.target, 'popup-container')) {\r\n this.hide();\r\n }\r\n }, {listenerSetter: this.listenerSetter});\r\n }\r\n\r\n if(options.withConfirm) {\r\n this.btnConfirm = document.createElement('button');\r\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\r\n if(options.withConfirm !== true) {\r\n this.btnConfirm.append(i18n(options.withConfirm));\r\n }\r\n this.header.append(this.btnConfirm);\r\n ripple(this.btnConfirm);\r\n }\r\n\r\n this.container.append(this.header);\r\n if(options.body) {\r\n this.body = document.createElement('div');\r\n this.body.classList.add('popup-body');\r\n this.container.append(this.body);\r\n }\r\n\r\n let btnConfirmOnEnter = this.btnConfirm;\r\n if(buttons?.length) {\r\n const buttonsDiv = this.buttonsEl = document.createElement('div');\r\n buttonsDiv.classList.add('popup-buttons');\r\n\r\n if(buttons.length === 2) {\r\n buttonsDiv.classList.add('popup-buttons-row');\r\n }\r\n \r\n const buttonsElements = buttons.map(b => {\r\n const button = document.createElement('button');\r\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\r\n \r\n ripple(button);\r\n \r\n if(b.text) {\r\n button.innerHTML = b.text;\r\n } else {\r\n button.append(i18n(b.langKey, b.langArgs));\r\n }\r\n \r\n attachClickEvent(button, () => {\r\n b.callback && b.callback();\r\n this.destroy();\r\n }, {listenerSetter: this.listenerSetter, once: true});\r\n \r\n return b.element = button;\r\n });\r\n \r\n if(!btnConfirmOnEnter && buttons.length === 2) {\r\n const button = buttons.find(button => !button.isCancel);\r\n if(button) {\r\n btnConfirmOnEnter = button.element;\r\n }\r\n }\r\n\r\n buttonsDiv.append(...buttonsElements);\r\n this.container.append(buttonsDiv);\r\n }\r\n\r\n this.btnConfirmOnEnter = btnConfirmOnEnter;\r\n\r\n this.element.append(this.container);\r\n\r\n PopupElement.POPUPS.push(this);\r\n }\r\n\r\n public show() {\r\n this.navigationItem = {\r\n type: 'popup',\r\n onPop: this.destroy,\r\n onEscape: this.onEscape\r\n };\r\n\r\n appNavigationController.pushItem(this.navigationItem);\r\n\r\n blurActiveElement(); // * hide mobile keyboard\r\n appendPopupTo.append(this.element);\r\n void this.element.offsetWidth; // reflow\r\n this.element.classList.add('active');\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = true;\r\n animationIntersector.checkAnimations(true);\r\n }\r\n\r\n // cannot add event instantly because keydown propagation will fire it\r\n if(this.btnConfirmOnEnter) {\r\n setTimeout(() => {\r\n this.listenerSetter.add(document.body)('keydown', (e) => {\r\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\r\n simulateClickEvent(this.btnConfirmOnEnter);\r\n cancelEvent(e);\r\n }\r\n });\r\n }, 0);\r\n }\r\n }\r\n\r\n public hide = () => {\r\n appNavigationController.backByItem(this.navigationItem);\r\n };\r\n\r\n private destroy = () => {\r\n this.dispatchEvent('close');\r\n this.element.classList.add('hiding');\r\n this.element.classList.remove('active');\r\n this.listenerSetter.removeAll();\r\n\r\n if(!this.withoutOverlay) {\r\n rootScope.isOverlayActive = false;\r\n }\r\n\r\n appNavigationController.removeItem(this.navigationItem);\r\n this.navigationItem = undefined;\r\n\r\n indexOfAndSplice(PopupElement.POPUPS, this);\r\n\r\n // ! calm\r\n onFullScreenChange();\r\n\r\n setTimeout(() => {\r\n this.element.remove();\r\n this.dispatchEvent('closeAfterTimeout');\r\n this.cleanup();\r\n\r\n if(!this.withoutOverlay) {\r\n animationIntersector.checkAnimations(false);\r\n }\r\n }, 150);\r\n };\r\n\r\n public static reAppend() {\r\n this.POPUPS.forEach(popup => {\r\n const {element, container} = popup;\r\n const parentElement = element.parentElement;\r\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\r\n appendPopupTo.append(element);\r\n }\r\n });\r\n }\r\n\r\n public static getPopup(popupConstructor: PopupElementConstructable) {\r\n return this.POPUPS.find(element => element instanceof popupConstructor);\r\n }\r\n}\r\n\r\nexport const addCancelButton = (buttons: PopupButton[]) => {\r\n const button = buttons.find(b => b.isCancel);\r\n if(!button) {\r\n buttons.push({\r\n langKey: 'Cancel',\r\n isCancel: true\r\n });\r\n }\r\n\r\n return buttons;\r\n};\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { DownloadOptions } from \"../mtproto/apiFileManager\";\r\nimport type { ApiError } from \"../mtproto/apiManager\";\r\nimport type { MyDocument } from \"./appDocsManager\";\r\nimport type { MyPhoto } from \"./appPhotosManager\";\r\nimport rootScope from \"../rootScope\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport { deferredPromise, CancellablePromise } from \"../../helpers/cancellablePromise\";\r\nimport { InputFile } from \"../../layer\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nexport type ResponseMethodBlob = 'blob';\r\nexport type ResponseMethodJson = 'json';\r\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\r\n\r\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\r\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\r\nexport type DownloadBlob = CancellablePromise;\r\nexport type DownloadJson = CancellablePromise;\r\n//export type Download = DownloadBlob/* | DownloadJson */;\r\nexport type Download = DownloadBlob/* | DownloadJson */;\r\n\r\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\r\nexport type ProgressCallback = (details: Progress) => void;\r\n\r\nexport type ThumbCache = {\r\n downloaded: number, \r\n url: string\r\n};\r\n\r\nexport type ThumbsCache = {\r\n [id: string]: {\r\n [size: string]: ThumbCache\r\n }\r\n};\r\n\r\nexport class AppDownloadManager {\r\n public cacheStorage = new CacheStorageController('cachedFiles');\r\n private downloads: {[fileName: string]: Download} = {};\r\n private progress: {[fileName: string]: Progress} = {};\r\n private progressCallbacks: {[fileName: string]: Array} = {};\r\n\r\n private uploadId = 0;\r\n\r\n private thumbsCache: {\r\n photo: ThumbsCache,\r\n document: ThumbsCache\r\n } = {\r\n photo: {},\r\n document: {}\r\n };\r\n\r\n constructor() {\r\n rootScope.addEventListener('download_progress', (e) => {\r\n const details = e as {done: number, fileName: string, total: number, offset: number};\r\n this.progress[details.fileName] = details;\r\n\r\n const callbacks = this.progressCallbacks[details.fileName];\r\n if(callbacks) {\r\n callbacks.forEach(callback => callback(details));\r\n }\r\n\r\n const download = this.downloads[details.fileName];\r\n if(download) {\r\n download.notifyAll(details);\r\n }\r\n });\r\n }\r\n\r\n private getNewDeferred(fileName: string) {\r\n const deferred = deferredPromise();\r\n\r\n deferred.cancel = () => {\r\n //try {\r\n const error = new Error('Download canceled');\r\n error.name = 'AbortError';\r\n \r\n apiManager.cancelDownload(fileName);\r\n \r\n deferred.reject(error);\r\n deferred.cancel = () => {};\r\n /* } catch(err) {\r\n\r\n } */\r\n };\r\n\r\n deferred.finally(() => {\r\n delete this.progress[fileName];\r\n delete this.progressCallbacks[fileName];\r\n });\r\n\r\n deferred.catch(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return this.downloads[fileName] = deferred as any;\r\n }\r\n\r\n private clearDownload(fileName: string) {\r\n delete this.downloads[fileName];\r\n }\r\n\r\n public fakeDownload(fileName: string, value: Blob | string) {\r\n const deferred = this.getNewDeferred(fileName);\r\n if(typeof(value) === 'string') {\r\n fetch(value)\r\n .then(response => response.blob())\r\n .then(blob => deferred.resolve(blob));\r\n } else {\r\n deferred.resolve(value);\r\n }\r\n\r\n return deferred;\r\n }\r\n\r\n public download(options: DownloadOptions): DownloadBlob {\r\n const fileName = getFileNameByLocation(options.location, {fileName: options.fileName});\r\n if(this.downloads.hasOwnProperty(fileName)) return this.downloads[fileName];\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n\r\n const onError = (err: ApiError) => {\r\n deferred.reject(err);\r\n };\r\n\r\n const tryDownload = (): Promise => {\r\n //return Promise.resolve();\r\n\r\n if(!apiManager.worker || options.onlyCache) {\r\n const promise = this.cacheStorage.getFile(fileName).then((blob) => {\r\n if(blob.size < options.size) throw 'wrong size';\r\n else deferred.resolve(blob);\r\n });\r\n \r\n if(options.onlyCache) return promise.catch(onError);\r\n return promise.catch(() => {\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n });\r\n } else {\r\n /* return apiManager.downloadFile(options).then(res => {\r\n setTimeout(() => deferred.resolve(res), 5e3);\r\n }, onError); */\r\n\r\n return apiManager.downloadFile(options).then(deferred.resolve, onError);\r\n }\r\n };\r\n\r\n tryDownload();\r\n\r\n //console.log('Will download file:', fileName, url);\r\n return deferred;\r\n }\r\n\r\n public upload(file: File | Blob, fileName?: string) {\r\n if(!fileName) {\r\n const mimeType = file?.type;\r\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\r\n const ext = this.uploadId++ + '.' + mimeType.split('/')[1];\r\n \r\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\r\n fileName = 'photo' + ext;\r\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\r\n fileName = 'audio' + ext;\r\n } else if(mimeType.indexOf('video/') === 0) {\r\n fileName = 'video' + ext;\r\n } else {\r\n fileName = 'document' + ext;\r\n }\r\n \r\n } else {\r\n fileName = 'upload-' + this.uploadId++;\r\n }\r\n }\r\n\r\n const deferred = this.getNewDeferred(fileName);\r\n apiManager.uploadFile({file, fileName}).then(deferred.resolve, deferred.reject);\r\n\r\n deferred.finally(() => {\r\n this.clearDownload(fileName);\r\n });\r\n\r\n return deferred as any as CancellablePromise;\r\n }\r\n\r\n public getDownload(fileName: string) {\r\n return this.downloads[fileName];\r\n }\r\n\r\n public addProgressCallback(fileName: string, callback: ProgressCallback) {\r\n const progress = this.progress[fileName];\r\n (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\r\n\r\n if(progress) {\r\n callback(progress);\r\n }\r\n }\r\n\r\n public createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.target = '_blank';\r\n \r\n a.style.position = 'absolute';\r\n a.style.top = '1px';\r\n a.style.left = '1px';\r\n \r\n document.body.append(a);\r\n \r\n try {\r\n var clickEvent = document.createEvent('MouseEvents');\r\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n a.dispatchEvent(clickEvent);\r\n } catch (e) {\r\n console.error('Download click error', e);\r\n try {\r\n a.click();\r\n } catch (e) {\r\n window.open(url as string, '_blank');\r\n }\r\n }\r\n \r\n setTimeout(() => {\r\n a.remove();\r\n onRemove && onRemove();\r\n }, 100);\r\n }\r\n\r\n /* public downloadToDisc(fileName: string, url: string) {\r\n this.createDownloadAnchor(url);\r\n \r\n return this.download(fileName, url);\r\n } */\r\n\r\n public downloadToDisc(options: DownloadOptions, discFileName: string) {\r\n const download = this.download(options);\r\n download/* .promise */.then(blob => {\r\n const objectURL = URL.createObjectURL(blob);\r\n this.createDownloadAnchor(objectURL, discFileName, () => {\r\n URL.revokeObjectURL(objectURL);\r\n });\r\n });\r\n \r\n return download;\r\n }\r\n\r\n public getCacheContext(media: MyPhoto | MyDocument, thumbSize: string = 'full'): ThumbCache {\r\n /* if(media._ === 'photo' && thumbSize !== 'i') {\r\n thumbSize = 'full';\r\n } */\r\n\r\n const cache = this.thumbsCache[media._][media.id] ?? (this.thumbsCache[media._][media.id] = {});\r\n return cache[thumbSize] ?? (cache[thumbSize] = {downloaded: 0, url: ''});\r\n }\r\n}\r\n\r\nconst appDownloadManager = new AppDownloadManager();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\r\nexport default appDownloadManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport type Listener = {\r\n element: ListenerElement, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions,\r\n\r\n onceFired?: true, // will be set only when options.once is set\r\n onceCallback?: () => void,\r\n};\r\n\r\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\r\nexport type ListenerEvent = string;\r\nexport type ListenerCallback = Function;\r\nexport type ListenerOptions = AddEventListenerOptions;\r\n\r\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\r\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\r\n console.log('nu zdarova', name);\r\n originalAddEventListener.call(this, name, callback, options);\r\n\r\n if(options?.ls) {\r\n return options.ls.addFromElement(this, name, callback as any, options);\r\n }\r\n}; */\r\n\r\nexport default class ListenerSetter {\r\n private listeners: Set = new Set();\r\n\r\n public add(element: T): T['addEventListener'] {\r\n return ((event: string, callback: Function, options: ListenerOptions) => {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n }) as any;\r\n }\r\n\r\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\r\n const listener: Listener = {element, event, callback, options};\r\n this.addManual(listener);\r\n return listener;\r\n } */\r\n\r\n public addManual(listener: Listener) {\r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.options?.once) { // remove listener when its called\r\n listener.onceCallback = () => {\r\n this.remove(listener);\r\n listener.onceFired = true;\r\n };\r\n \r\n // @ts-ignore\r\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n\r\n this.listeners.add(listener);\r\n }\r\n\r\n public remove(listener: Listener) {\r\n if(!listener.onceFired) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\r\n\r\n if(listener.onceCallback) {\r\n // @ts-ignore\r\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\r\n }\r\n }\r\n\r\n this.listeners.delete(listener);\r\n }\r\n\r\n public removeManual(\r\n element: T, \r\n event: ListenerEvent, \r\n callback: ListenerCallback, \r\n options?: ListenerOptions\r\n ) {\r\n let listener: Listener;\r\n for(const _listener of this.listeners) {\r\n if(_listener.element === element && \r\n _listener.event === event && \r\n _listener.callback === callback && \r\n _listener.options === options) {\r\n listener = _listener;\r\n break;\r\n }\r\n }\r\n\r\n if(listener) {\r\n this.remove(listener);\r\n }\r\n }\r\n\r\n public removeAll() {\r\n this.listeners.forEach(listener => {\r\n this.remove(listener);\r\n });\r\n }\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.08583f871c38d9c5a426.chunk.js.map b/public/8.08583f871c38d9c5a426.chunk.js.map deleted file mode 100644 index 4cb7f350d..000000000 --- a/public/8.08583f871c38d9c5a426.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"8.08583f871c38d9c5a426.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"WordDelimiter\": \", \",\n \"WordDelimiterLast\": \" and \",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.AutoplayMedia\": \"Auto-Play Media\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Modal.Send\": \"Send\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\"\n};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/8.08583f871c38d9c5a426.chunk.js b/public/8.f871e2581e2cce7ecaef.chunk.js similarity index 56% rename from public/8.08583f871c38d9c5a426.chunk.js rename to public/8.f871e2581e2cce7ecaef.chunk.js index 591cd3e32..7499cd97f 100644 --- a/public/8.08583f871c38d9c5a426.chunk.js +++ b/public/8.f871e2581e2cce7ecaef.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{156:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots",WordDelimiter:", ",WordDelimiterLast:" and ","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.AutoplayMedia":"Auto-Play Media","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Modal.Send":"Send","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","InstalledStickers.LoopAnimated":"Loop Animated Stickers","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters."}}}]); -//# sourceMappingURL=8.08583f871c38d9c5a426.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[8],{156:function(e,t,o){"use strict";o.r(t);t.default={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots",WordDelimiter:", ",WordDelimiterLast:" and ","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.AutoplayMedia":"Auto-Play Media","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.InvalidPassword":"Invalid password","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","CreateGroup.NameHolder":"Group Name","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Modal.Send":"Send","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","InstalledStickers.LoopAnimated":"Loop Animated Stickers","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SignMessages":"Sign Messages","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","MessageContext.CopyMessageLink1":"Copy Message Link","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","UsernameSettings.ChangeDescription":"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\n\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters."}}}]); +//# sourceMappingURL=8.f871e2581e2cce7ecaef.chunk.js.map \ No newline at end of file diff --git a/public/8.f871e2581e2cce7ecaef.chunk.js.map b/public/8.f871e2581e2cce7ecaef.chunk.js.map new file mode 100644 index 000000000..b945436b6 --- /dev/null +++ b/public/8.f871e2581e2cce7ecaef.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"8.f871e2581e2cce7ecaef.chunk.js","sourcesContent":["const lang = {\n \"Animations\": \"Animations\",\n \"AttachAlbum\": \"Album\",\n \"Appearance.Color.Hex\": \"HEX\",\n \"Appearance.Color.RGB\": \"RGB\",\n \"BlockModal.Search.Placeholder\": \"Block user...\",\n \"DarkMode\": \"Dark Mode\",\n \"FilterIncludeExcludeInfo\": \"Choose chats and types of chats that will\\nappear and never appear in this folder.\",\n \"FilterMenuDelete\": \"Delete Folder\",\n \"FilterHeaderEdit\": \"Edit Folder\",\n \"FilterAllGroups\": \"All Groups\",\n \"FilterAllContacts\": \"All Contacts\",\n \"FilterAllNonContacts\": \"All Non-Contacts\",\n \"FilterAllChannels\": \"All Channels\",\n \"FilterAllBots\": \"All Bots\",\n \"WordDelimiter\": \", \",\n \"WordDelimiterLast\": \" and \",\n \"EditContact.OriginalName\": \"original name\",\n \"EditProfile.FirstNameLabel\": \"Name\",\n \"EditProfile.BioLabel\": \"Bio (optional)\",\n \"EditProfile.Username.Label\": \"Username (optional)\",\n \"EditProfile.Username.Available\": \"Username is available\",\n \"EditProfile.Username.Taken\": \"Username is already taken\",\n \"EditProfile.Username.Invalid\": \"Username is invalid\",\n \"ExceptionModal.Search.Placeholder\": \"Add exception...\",\n \"Chat.Menu.SelectMessages\": \"Select Messages\",\n \"Chat.Menu.ClearSelection\": \"Clear Selection\",\n \"Chat.Menu.Hint\": \"To **edit** or **reply**, close this menu.\\nThen tap next to a message.\",\n \"Chat.Input.UnpinAll\": \"Unpin All Messages\",\n \"Chat.Input.Attach.PhotoOrVideo\": \"Photo or Video\",\n \"Chat.Input.Attach.Document\": \"Document\",\n \"Chat.Subscribe\": \"SUBSCRIBE\",\n \"Chat.Selection.LimitToast\": \"Max selection count reached.\",\n \"Chat.Search.MessagesFound\": {\n \"one_value\": \"%d message found\",\n \"other_value\": \"%d messages found\"\n },\n \"Chat.Search.NoMessagesFound\": \"No messages found\",\n \"Chat.Search.PrivateSearch\": \"Private Search\",\n \"ChatList.Main.EmptyPlaceholder.Title\": \"Your chats will appear here\",\n \"ChatList.Main.EmptyPlaceholder.Subtitle\": \"You have %s on Telegram\",\n \"ChatList.Main.EmptyPlaceholder.SubtitleNoContacts\": \"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts\",\n //\"ChatList.Menu.Archived\": \"Archived\",\n \"ChatList.Menu.SwitchTo.Webogram\": \"Switch to Old Version\",\n \"ChatList.Menu.SwitchTo.Z\": \"Switch to Z version\",\n \"ChatMigration.From\": \"Migrated from %s\",\n \"ChatMigration.To\": \"Migrated to %s\",\n \"ConnectionStatus.ForceReconnect\": \"force reconnect\",\n \"ConnectionStatus.ReconnectIn\": \"Reconnect in %ds, %s\",\n \"ConnectionStatus.Reconnect\": \"reconnect\",\n \"ConnectionStatus.Reconnecting\": \"Reconnecting...\",\n \"ConnectionStatus.TimedOut\": \"Request timed out, %s\",\n \"ConnectionStatus.Waiting\": \"Waiting for network...\",\n \"Contacts.Count\": {\n \"one_value\": \"%d contact\",\n \"other_value\": \"%d contacts\"\n },\n \"Deactivated.Title\": \"Too many tabs...\",\n \"Deactivated.Subtitle\": \"Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.\",\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n \"General.Keyboard\": \"Keyboard\",\n \"General.SendShortcut.Enter\": \"Send by Enter\",\n \"General.SendShortcut.CtrlEnter\": \"Send by %s + Enter\",\n \"General.SendShortcut.NewLine.ShiftEnter\": \"New line by Shift + Enter\",\n \"General.SendShortcut.NewLine.Enter\": \"New line by Enter\",\n \"General.AutoplayMedia\": \"Auto-Play Media\",\n \"General.TimeFormat\": \"Time Format\",\n \"General.TimeFormat.h12\": \"12-hour\",\n \"General.TimeFormat.h23\": \"24-hour\",\n \"ChatBackground.UploadWallpaper\": \"Upload Wallpaper\",\n \"ChatBackground.Blur\": \"Blur Wallpaper Image\",\n \"Notifications.Sound\": \"Notification Sound\",\n \"NewPrivateChat\": \"New Private Chat\",\n \"NewPoll.OptionLabel\": \"Option %d\",\n \"Message.Context.Selection.Copy\": \"Copy selected\",\n \"Message.Context.Selection.Clear\": \"Clear selection\",\n \"Message.Context.Selection.Delete\": \"Delete selected\",\n \"Message.Context.Selection.Forward\": \"Forward selected\",\n \"Message.Context.Selection.SendNow\": \"Send Now selected\",\n \"Message.Unsupported.Desktop\": \"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__\",\n \"Message.Unsupported.Mobile\": \"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__\",\n \"Checkbox.Enabled\": \"Enabled\",\n \"Checkbox.Disabled\": \"Disabled\",\n \"Error.PreviewSender.CaptionTooLong\": \"Caption is too long.\",\n \"PreviewSender.GroupItems\": \"Group items\",\n \"PreviewSender.SendAlbum\": {\n \"one_value\": \"Send Album\",\n \"other_value\": \"Send %d Albums\"\n },\n \"Presence.YourChat\": \"chat with yourself\",\n \"Privacy.Devices\": {\n \"one_value\": \"%1$d device\",\n \"other_value\": \"%1$d devices\"\n },\n \"Privacy.SensitiveContent\": \"Sensitive Content\",\n \"PrivacyModal.Search.Placeholder\": \"Add Users or Groups...\",\n \"Permissions.NoExceptions\": \"No exceptions\",\n \"Permissions.ExceptionsCount\": {\n \"one_value\": \"%d exception\",\n \"other_value\": \"%d exceptions\"\n },\n \"Link.Available\": \"Link is available\",\n \"Link.Taken\": \"Link is already taken\",\n \"Link.Invalid\": \"Link is invalid\",\n \"StickersTab.SearchPlaceholder\": \"Search Stickers\",\n \"ForwardedFrom\": \"Forwarded from %s\",\n \"Popup.Avatar.Title\": \"Drag to Reposition\",\n \"Popup.Unpin.AllTitle\": \"Unpin all messages\",\n \"Popup.Unpin.HideTitle\": \"Hide pinned messages\",\n \"Popup.Unpin.HideDescription\": \"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.\",\n \"Popup.Unpin.Hide\": \"Hide\",\n \"TwoStepAuth.InvalidPassword\": \"Invalid password\",\n \"TwoStepAuth.EmailCodeChangeEmail\": \"Change Email\",\n \"MarkupTooltip.LinkPlaceholder\": \"Enter URL...\",\n \"MediaViewer.Context.Download\": \"Download\",\n \"Profile\": \"Profile\",\n \"Saved\": \"Saved\",\n \"Deleted\": \"Deleted\",\n \"ReportBug\": \"Report Bug\",\n \"Notifications.Count\": {\n \"one_value\": \"%d notification\",\n \"other_value\": \"%d notifications\"\n },\n \"Notifications.Forwarded\": {\n \"one_value\": \"Forwarded %d message\",\n \"other_value\": \"Forwarded %d messages\"\n },\n \"Notifications.New\": \"New notification\",\n \"PushNotification.Action.Mute1d\": \"Mute background alerts for 1 day\",\n\t\"PushNotification.Action.Settings\": \"Background alerts settings\",\n\t\"PushNotification.Action.Mute1d.Mobile\": \"Mute for 24H\",\n\t\"PushNotification.Action.Settings.Mobile\": \"Alerts settings\",\n\t\"PushNotification.Message.NoPreview\": \"You have a new message\",\n \"LogOut.Description\": \"Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.\",\n\t//\"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n\n // * android\n \"AccDescrEditing\": \"Editing\",\n \"ActionCreateChannel\": \"Channel created\",\n \"ActionCreateGroup\": \"un1 created the group\",\n \"ActionChangedTitle\": \"un1 changed the group name to un2\",\n \"ActionRemovedPhoto\": \"un1 removed the group photo\",\n \"ActionChangedPhoto\": \"un1 changed the group photo\",\n \"ActionChangedVideo\": \"un1 changed the group video\",\n \"ActionAddUser\": \"un1 added un2\",\n \"ActionAddUserSelf\": \"un1 returned to the group\",\n \"ActionAddUserSelfYou\": \"You returned to the group\",\n \"ActionAddUserSelfMega\": \"un1 joined the group\",\n \"ActionLeftUser\": \"un1 left the group\",\n \"ActionKickUser\": \"un1 removed un2\",\n \"ActionInviteUser\": \"un1 joined the group via invite link\",\n \"ActionPinnedNoText\": \"un1 pinned a message\",\n \"ActionMigrateFromGroup\": \"This group was upgraded to a supergroup\",\n \"ActionYouScored\": \"You scored %1$s\",\n \"ActionUserScored\": \"un1 scored %1$s\",\n \"ActionYouScoredInGame\": \"You scored %1$s in un2\",\n \"ActionUserScoredInGame\": \"un1 scored %1$s in un2\",\n \"AndOther\": {\n \"one_value\": \"and %1$d other\",\n \"other_value\": \"and %1$d others\"\n },\n \"AttachPhoto\": \"Photo\",\n \"AttachVideo\": \"Video\",\n \"AttachGif\": \"GIF\",\n \"AttachLocation\": \"Location\",\n \"AttachLiveLocation\": \"Live Location\",\n \"AttachContact\": \"Contact\",\n //\"AttachDocument\": \"File\",\n \"AttachSticker\": \"Sticker\",\n \"AttachAudio\": \"Voice message\",\n \"AttachRound\": \"Video message\",\n \"AttachGame\": \"Game\",\n \"Bot\": \"bot\",\n //\"ChannelJoined\": \"You joined this channel\",\n \"ChannelMegaJoined\": \"You joined this group\",\n \"EnterChannelName\": \"Channel name\",\n \"DescriptionOptionalPlaceholder\": \"Description (optional)\",\n \"DescriptionPlaceholder\": \"Description\",\n \"DiscussionStarted\": \"Discussion started\",\n \"Draft\": \"Draft\",\n \"FilterAlwaysShow\": \"Include Chats\",\n \"FilterNeverShow\": \"Exclude Chats\",\n \"FilterInclude\": \"Included Chats\",\n \"FilterExclude\": \"Excluded Chats\",\n \"FilterChatTypes\": \"Chat types\",\n \"FilterChats\": \"Chats\",\n \"FilterNew\": \"New Folder\",\n \"Filters\": \"Folders\",\n \"FilterRecommended\": \"Recommended Folders\",\n \"FilterShowMoreChats\": {\n \"one_value\": \"Show %1$d More Chat\",\n \"other_value\": \"Show %1$d More Chats\"\n },\n \"ForwardedMessageCount\": {\n \"one_value\": \"Forwarded message\",\n \"other_value\": \"%1$d forwarded messages\"\n },\n \"FromYou\": \"You\",\n \"Add\": \"Add\",\n \"Chats\": {\n \"one_value\": \"%1$d chat\",\n \"other_value\": \"%1$d chats\"\n },\n \"Channels\": {\n \"one_value\": \"%1$d channel\",\n \"other_value\": \"%1$d channels\"\n },\n \"Comments\": {\n \"one_value\": \"%1$d Comment\",\n \"other_value\": \"%1$d Comments\"\n },\n \"Groups\": {\n \"one_value\": \"%1$d group\",\n \"other_value\": \"%1$d groups\"\n },\n \"Users\": {\n \"one_value\": \"%1$d user\",\n \"other_value\": \"%1$d users\"\n },\n \"Members\": {\n \"one_value\": \"%1$d member\",\n \"other_value\": \"%1$d members\"\n },\n \"messages\": {\n \"one_value\": \"%1$d message\",\n \"other_value\": \"%1$d messages\"\n },\n \"UsernameHelpLink\": \"This link opens a chat with you:\\n%1$s\",\n \"NewChannel\": \"New Channel\",\n \"NewGroup\": \"New Group\",\n \"Contacts\": \"Contacts\",\n \"SavedMessages\": \"Saved Messages\",\n \"Settings\": \"Settings\",\n \"SettingsHelp\": \"Help\",\n \"General\": \"General\",\n \"TextSize\": \"Message Text Size\",\n \"ChatBackground\": \"Chat Background\",\n \"EnableAnimations\": \"Enable Animations\",\n \"AutoDownloadMedia\": \"Auto-Download Media\",\n \"AutodownloadContacts\": \"Contacts\",\n \"AutodownloadPrivateChats\": \"Private Chats\",\n \"AutodownloadGroupChats\": \"Group Chats\",\n \"AutodownloadChannels\": \"Channels\",\n \"AutoplayGIF\": \"GIFs\",\n \"AutoplayVideo\": \"Videos\",\n \"NotificationsForGroups\": \"Notifications for groups\",\n \"NotificationsForPrivateChats\": \"Notifications for private chats\",\n \"NotificationsForChannels\": \"Notifications for channels\",\n \"NotificationsPrivateChats\": \"Private Chats\",\n \"NotificationsGroups\": \"Groups\",\n \"NotificationsChannels\": \"Channels\",\n \"NotificationsOther\": \"Other\",\n \"MarkAsUnread\": \"Mark as unread\",\n \"MarkAsRead\": \"Mark as read\",\n \"ContactJoined\": \"Contact joined Telegram\",\n \"Loading\": \"Loading...\",\n \"Unblock\": \"Unblock\",\n \"BlockedUsers\": \"Blocked Users\",\n \"BlockedUsersInfo\": \"Blocked users will not be able to contact you and will not see your Last Seen time.\",\n \"BlockedEmpty\": \"None\", \n \"TwoStepVerification\": \"Two-Step Verification\",\n \"TwoStepVerificationTitle\": \"Two-Step Verification\",\n \"PinnedMessage\": \"Pinned Message\",\n \"PinnedMessagesCount\": {\n \"one_value\": \"Pinned Message\",\n \"other_value\": \"%1$d Pinned Messages\"\n },\n //\"PreviousPinnedMessage\": \"Previous Message\",\n \"PrivacyExceptions\": \"Exceptions\",\n \"PrivacyLastSeen\": \"Last Seen & Online\",\n \"PrivacySettings\": \"Privacy and Security\",\n \"PrivacyTitle\": \"Privacy\",\n \"PrivacyPhone\": \"Phone Number\",\n \"PrivacyPhoneTitle\": \"Who can see my phone number?\",\n \"PrivacyPhoneTitle2\": \"Who can find me by my number?\",\n \"PrivacyPhoneInfo\": \"Users who have your number saved in their contacts will also see it on Telegram.\",\n \"PrivacyPhoneInfo3\": \"Users who add your number to their contacts will see it on Telegram only if they are your contacts.\",\n \"PrivacyProfilePhoto\": \"Profile Photos\",\n \"PrivacyProfilePhotoTitle\": \"Who can see my profile photos & videos?\",\n \"PrivacyP2PHeader\": \"Peer-to-Peer\",\n \"PrivacyForwardsTitle\": \"Who can add a link to my account when forwarding my messages?\",\n \"Reminders\": \"Reminders\",\n \"ScheduledMessages\": \"Scheduled Messages\",\n \"LastSeenTitle\": \"Who can see your Last Seen time?\",\n \"SessionsTitle\": \"Active Sessions\",\n \"CurrentSession\": \"This device\",\n \"TerminateAllSessions\": \"Terminate All Other Sessions\",\n \"TerminateSessionText\": \"Are you sure you want to terminate this session?\",\n \"OtherSessions\": \"Active sessions\",\n \"AreYouSureDeleteSingleMessage\": \"Are you sure you want to delete this message?\",\n \"AreYouSureDeleteFewMessages\": \"Are you sure you want to delete these messages?\",\n \"AreYouSureDeleteSingleMessageMega\": \"Are you sure you want to delete this message for everyone?\",\n \"AreYouSureDeleteFewMessagesMega\": \"Are you sure you want to delete these messages for everyone?\",\n \"AreYouSureDeleteAndExitName\": \"Are you sure you want to delete and leave the group **%1$s**?\",\n \"AreYouSureDeleteThisChatSavedMessages\": \"Are you sure you want to delete **Saved Messages**?\",\n \"AreYouSureDeleteThisChatWithUser\": \"Are you sure you want to delete the chat with **%1$s**?\",\n \"AreYouSureSessionTitle\": \"Terminate session\",\n \"AreYouSureSessionsTitle\": \"Terminate sessions\",\n \"AreYouSureSessions\": \"Are you sure you want to terminate all other sessions?\",\n \"Terminate\": \"Terminate\",\n \"WhoCanCallMe\": \"Who can call me?\",\n \"WhoCanAddMe\": \"Who can add me to group chats?\",\n \"ArchivedChats\": \"Archived Chats\",\n \"Cancel\": \"Cancel\",\n \"HistoryCleared\": \"History was cleared\",\n \"Archive\": \"Archive\",\n \"Unarchive\": \"Unarchive\",\n \"Delete\": \"Delete\",\n \"Reply\": \"Reply\",\n \"Edit\": \"Edit\",\n \"Forward\": \"Forward\",\n \"CopyLink\": \"Copy Link\",\n \"Copy\": \"Copy\",\n \"Search\": \"Search\",\n \"LinkCopied\": \"Link copied to clipboard\",\n \"LinkCopiedPrivateInfo\": \"This link will only work for members of this chat.\",\n \"GroupAddMembers\": \"Add Members\",\n \"SendMessageTo\": \"Add people...\",\n //\"SelectChat\": \"Select Chat\",\n \"JumpToDate\": \"Jump to Date\",\n \"Caption\": \"Caption\",\n \"Message\": \"Message\",\n \"Poll\": \"Poll\",\n \"SharedFilesTab2\": \"Files\",\n \"SharedMediaTab2\": \"Media\",\n //\"SharedMediaTabFull2\": \"Shared Media\",\n //\"SharedGroupsTab2\": \"Groups\",\n \"SharedLinksTab2\": \"Links\",\n \"SharedMusicTab2\": \"Music\",\n \"SharedVoiceTab2\": \"Voice\",\n //\"SharedGIFsTab2\": \"GIFs\",\n \"NewPoll\": \"New Poll\",\n \"PollOptions\": \"Poll options\",\n \"AskAQuestion\": \"Ask a Question\",\n \"AddAnExplanationInfo\": \"Users will see this text after choosing the wrong answer, good for educational purposes.\",\n \"AccDescrQuizExplanation\": \"Explanation\",\n \"PhoneCopied\": \"Phone copied to clipboard\",\n \"UsernameCopied\": \"Username copied to clipboard.\",\n //\"HashtagCopied\": \"Hashtag copied to clipboard.\",\n \"BioCopied\": \"Bio copied to clipboard.\",\n \"UserBio\": \"Bio\",\n \"Username\": \"Username\",\n \"Phone\": \"Phone\",\n \"Notifications\": \"Notifications\",\n \"AreYouSureDeleteContact\": \"Are you sure you want to delete this contact?\",\n \"AreYouSureDeleteAndExit\": \"Are you sure you want to delete and leave the group?\",\n \"AreYouSureDeleteAndExitChannel\": \"Do you want to delete and leave the channel?\",\n \"DeleteContact\": \"Delete contact\",\n \"GroupType\": \"Group Type\",\n \"ChannelType\": \"Channel Type\",\n \"TypePrivate\": \"Private\",\n \"TypePublic\": \"Public\",\n \"TypePrivateGroup\": \"Private\",\n \"TypePublicGroup\": \"Public\",\n \"GroupMembers\": \"Members\",\n \"DeleteMega\": \"Delete Group\",\n \"DeleteMegaMenu\": \"Delete group\",\n \"DeleteAndExitButton\": \"Delete and Leave Group\",\n \"ChannelDelete\": \"Delete Channel\",\n \"ChannelDeleteMenu\": \"Delete channel\",\n \"ChannelPermissions\": \"Permissions\",\n \"ChannelPermissionsHeader\": \"What can members of this group do?\",\n \"ChannelAddException\": \"Add Exception\",\n \"ChannelBlockedUsers\": \"Removed users\",\n \"NoBlockedUsers\": \"No removed users\",\n \"UserRestrictions\": \"User Permissions\",\n \"UserRestrictionsDisabled\": \"This option is disabled for all members in Group Permissions\",\n \"UserRestrictionsCanDo\": \"What can this user do?\",\n \"UserRestrictionsRead\": \"Read Messages\",\n \"UserRestrictionsSend\": \"Send Messages\",\n \"UserRestrictionsSendMedia\": \"Send Media\",\n \"UserRestrictionsSendPolls\": \"Send Polls\",\n \"UserRestrictionsSendStickers\": \"Send Stickers and GIFs\",\n \"UserRestrictionsEmbedLinks\": \"Embed Links\",\n \"UserRestrictionsChangeInfo\": \"Change Chat Info\",\n \"UserRestrictionsPinMessages\": \"Pin Messages\",\n \"UserRestrictionsInviteUsers\": \"Add Users\",\n //\"UserRestrictionsNoRead\": \"can't read\",\n \"UserRestrictionsNoSend\": \"can't send messages\",\n \"UserRestrictionsNoSendMedia\": \"no media\",\n \"UserRestrictionsNoSendPolls\": \"no polls\",\n \"UserRestrictionsNoSendStickers\": \"no stickers & GIFs\",\n \"UserRestrictionsNoEmbedLinks\": \"no embed links\",\n \"UserRestrictionsNoChangeInfo\": \"can't change Info\",\n \"UserRestrictionsNoPinMessages\": \"no pins\",\n \"UserRestrictionsNoInviteUsers\": \"can't add users\",\n \"UserRestrictionsBlock\": \"Ban and remove from group\",\n \"ChannelPublic\": \"Public Channel\",\n \"MegaPublic\": \"Public Group\",\n //\"MegaLocation\": \"Location-based Group\",\n \"ChannelPublicInfo\": \"Public channels can be found in search, anyone can join them.\",\n \"MegaPublicInfo\": \"Public groups can be found in search, chat history is available to everyone and anyone can join.\",\n \"ChannelPrivate\": \"Private Channel\",\n \"MegaPrivate\": \"Private Group\",\n \"ChannelPrivateInfo\": \"Private channels can only be joined via an invite link.\",\n \"MegaPrivateInfo\": \"Private groups can only be joined if you were invited or have an invite link.\",\n \"ChannelPrivateLinkHelp\": \"People can join your channel by following this link. You can revoke the link any time.\",\n \"MegaPrivateLinkHelp\": \"People can join your group by following this link. You can revoke the link any time.\",\n \"RevokeButton\": \"Revoke\",\n \"RevokeLink\": \"Revoke Link\",\n \"RevokeAlert\": \"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.\",\n \"SetUrlPlaceholder\": \"Link\",\n \"Subscribers\": {\n \"one_value\": \"%1$d subscriber\",\n \"other_value\": \"%1$d subscribers\"\n },\n \"SearchGifsTitle\": \"Search GIFs\",\n \"PinMessageAlert\": \"Pin this message in the group?\",\n \"PinMessageAlertTitle\": \"Pin message\",\n \"PinMessageAlertChannel\": \"Do you want to pin this message in this channel?\",\n \"PinMessageAlertChat\": \"Do you want to pin this message at the top of the chat?\",\n \"UnpinMessageAlertTitle\": \"Unpin message\",\n \"UnpinMessageAlert\": \"Do you want to unpin this message?\",\n \"PinNotify\": \"Notify all members\",\n \"PinMessage\": \"Pin\",\n \"UnpinMessage\": \"Unpin\",\n \"PinAlsoFor\": \"Also pin for %1$s\",\n \"DeleteMessagesTitle\": \"Delete %1$s\",\n \"DeleteSingleMessagesTitle\": \"Delete message\",\n \"DeleteMessagesOption\": \"Unsend My Messages\",\n \"DeleteMessagesOptionAlso\": \"Also delete for %1$s\",\n \"DeleteForAll\": \"Delete for all members\",\n \"DeleteMessagesTextGroup\": \"You can also delete the %1$s you sent from the inboxes of other group members by checking \\\"Unsend my messages\\\".\",\n \"LeaveChannel\": \"Leave Channel\",\n \"LeaveChannelMenu\": \"Leave channel\",\n \"ChannelLeaveAlertWithName\": \"Are you sure you want to leave **%1$s**?\",\n \"LeaveMegaMenu\": \"Leave group\",\n \"DeleteChatUser\": \"Delete chat\",\n \"PleaseEnterCurrentPassword\": \"Enter your password\",\n \"PleaseEnterFirstPassword\": \"Enter a password\",\n \"PleaseReEnterPassword\": \"Re-enter your password\",\n \"Continue\": \"Continue\",\n \"YourEmailSkip\": \"Skip\",\n \"YourEmailSkipWarning\": \"Warning\",\n \"YourEmailSkipWarningText\": \"No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.\",\n \"TurnPasswordOffQuestionTitle\": \"Disable password\",\n \"TurnPasswordOffQuestion\": \"Are you sure you want to disable your password?\",\n \"Disable\": \"Disable\",\n \"TwoStepVerificationSetPassword\": \"Set Password\",\n \"TwoStepVerificationPasswordSet\": \"Password Set!\",\n \"TwoStepVerificationPasswordSetInfo\": \"This password will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepVerificationPasswordReturnSettings\": \"Return to Settings\",\n \"RecoveryEmail\": \"Recovery email\",\n \"RecoveryEmailTitle\": \"Recovery Email\",\n \"ResendCode\": \"Resend code\",\n \"PasswordAsHintError\": \"Hint must be different from your password\",\n \"AddStickersCount\": \"ADD %1$s\",\n \"RemoveStickersCount\": \"REMOVE %1$s\",\n \"Stickers\": {\n \"one_value\": \"%1$d sticker\",\n \"other_value\": \"%1$d stickers\"\n },\n \"HidAccount\": \"The account was hidden by the user\",\n \"TelegramFeatures\": \"Telegram Features\",\n \"SetColor\": \"Set a color\",\n \"Open\": \"Open\",\n \"OpenUrlTitle\": \"Open Link\",\n \"OpenUrlAlert2\": \"Do you want to open %1$s?\",\n \"FilterNoChatsToDisplay\": \"Folder is empty\",\n \"FilterNoChatsToDisplayInfo\": \"No chats currently belong to this folder.\",\n \"SupportStatus\": \"support\",\n \"Lately\": \"last seen recently\",\n \"WithinAWeek\": \"last seen within a week\",\n \"WithinAMonth\": \"last seen within a month\",\n \"ALongTimeAgo\": \"last seen a long time ago\",\n \"Online\": \"online\",\n \"MessageScheduleSend\": \"Send Now\",\n \"MessageScheduleEditTime\": \"Reschedule\",\n \"YouLeft\": \"You left this group\",\n \"Recent\": \"Recent\",\n \"Of\": \"%1$d of %2$d\",\n \"NoResult\": \"No results\",\n \"Updating\": \"Updating...\",\n \"Emoji\": \"Emoji\",\n \"AddContactTitle\": \"Add Contact\",\n \"HiddenName\": \"Deleted Account\",\n \"Seconds\": {\n \"one_value\": \"%1$d second\",\n \"other_value\": \"%1$d seconds\"\n },\n \"Minutes\": {\n \"one_value\": \"%1$d minute\",\n \"other_value\": \"%1$d minutes\"\n },\n \"Hours\": {\n \"one_value\": \"%1$d hour\",\n \"other_value\": \"%1$d hours\"\n },\n \"Days\": {\n \"one_value\": \"%1$d day\",\n \"other_value\": \"%1$d days\"\n },\n \"Weeks\": {\n \"one_value\": \"%1$d week\",\n \"other_value\": \"%1$d weeks\"\n },\n \"TodayAtFormattedWithToday\": \"today at %1$s\",\n \"formatDateAtTime\": \"%1$s at %2$s\",\n \"JoinByPeekChannelTitle\": \"Join Channel\",\n \"JoinByPeekGroupTitle\": \"Join Group\",\n \"YouWereKicked\": \"you were removed\",\n \"ViaBot\": \"via\",\n \"InviteExpired\": \"This invite link has expired.\",\n \"NoUsernameFound\": \"There is no Telegram account with this username.\",\n \"PrivacyDeleteCloudDrafts\": \"Delete All Cloud Drafts\",\n \"AreYouSureClearDraftsTitle\": \"Delete cloud drafts\",\n \"AreYouSureClearDrafts\": \"Are you sure you want to delete all cloud drafts?\",\n \"BotInfoTitle\": \"What can this bot do?\",\n \"ChatYourSelf\": \"forward here to save\",\n \"GroupEmptyTitle1\": \"You have created a **group**.\",\n \"GroupEmptyTitle2\": \"Groups can have:\",\n \"GroupDescription1\": \"Up to 200,000 members\",\n \"GroupDescription2\": \"Persistent chat history\",\n \"GroupDescription3\": \"Public links such as t.me/title\",\n \"GroupDescription4\": \"Admins with different rights\",\n \"ChatYourSelfDescription1\": \"Forward messages here to save them\",\n \"ChatYourSelfDescription2\": \"Send media and files to store them\",\n \"ChatYourSelfDescription3\": \"Access this chat from any device\",\n \"ChatYourSelfDescription4\": \"Use search to quickly find things\",\n \"ChatYourSelfTitle\": \"Your cloud storage\",\n \"ActionYouCreateGroup\": \"You created the group\",\n \"NoMessages\": \"No messages here yet...\",\n \"NoScheduledMessages\": \"No scheduled messages here yet...\",\n \"NoMessagesGreetingsDescription\": \"Send a message or tap the greeting below.\",\n \"InviteToGroupError\": \"Sorry, you can't add this user to groups because of user's privacy settings.\",\n \"InviteToChannelError\": \"Sorry, you can't add this user to channels because of user's privacy settings.\",\n \"AddMembersAlertTitle\": \"Add %1$s\",\n \"AddOneMemberAlertTitle\": \"Add member\",\n \"AddMembersAlertNamesText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersAlertCountText\": \"Are you sure you want to add %1$s to **%2$s**?\",\n \"AddMembersForwardMessages\": \"Show the last 100 messages to the new members\",\n \"AddOneMemberForwardMessages\": \"Show the last 100 messages to **%1$s**\",\n \"PinToTopLimitReached2\": \"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.\",\n \"FiltersSetupPinAlert\": \"Set Up Folders\",\n \"AppName\": \"Telegram\",\n \"OK\": \"OK\",\n \"PinFolderLimitReached\": \"Sorry, you can't pin any more chats to the top.\",\n \"Send\": \"Send\",\n \"ChannelJoin\": \"JOIN\",\n \"Yesterday\": \"yesterday\",\n \"LeaveAComment\": \"Leave a comment\",\n \"ViewInChat\": \"View in chat\",\n \"LinkNotFound\": \"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.\",\n \"Create\": \"Create\",\n \"ViewDiscussion\": \"View discussion\",\n \"MessageScheduledUntilOnline\": \"Scheduled until online\",\n \"ReportChat\": \"Report\",\n \"ReportChatSpam\": \"Spam\",\n // \"ReportChatFakeAccount\": \"Fake Account\",\n \"ReportChatViolence\": \"Violence\",\n \"ReportChatPornography\": \"Pornography\",\n \"ReportChatChild\": \"Child Abuse\",\n \"ReportChatOther\": \"Other\",\n \"ReportChatDescription\": \"Description\",\n \"ReportInfo\": \"Please enter any additional details relevant to your report.\",\n \"ReportSentInfo\": \"Telegram moderators will review your report.\\nThank you for your cooperation!\",\n \"ReportHint\": \"Additional details...\",\n \"ChatHistory\": \"Chat history for new members\",\n \"ShareContact\": \"Share contact\",\n \"SendMessageTitle\": \"Send message\",\n \"SendContactToGroupText\": \"Do you want to send this contact to **%1$s**?\",\n \"ChannelBroadcast\": \"Broadcast\",\n \"ChannelSilentBroadcast\": \"Silent Broadcast\",\n \"Comment\": \"Comment\",\n \"SendAnonymously\": \"Send anonymously\",\n \"DiscardVoiceMessageTitle\": \"Discard Voice Message\",\n \"DiscardVoiceMessageDescription\": \"Are you sure you want to stop recording and discard your voice message?\",\n \"DiscardVoiceMessageAction\": \"Discard\",\n \"AddContact\": \"Add to contacts\",\n \"BlockUser\": \"Block user\",\n \"MobileHidden\": \"Mobile hidden\",\n \"MobileHiddenExceptionInfo\": \"Phone number will be visible once %1$s adds you as a contact.\",\n \"FirstName\": \"First name (required)\",\n \"LastName\": \"Last name (optional)\",\n \"AreYouSureBlockContact2\": \"Are you sure you want to block **%1$s**?\",\n \"UserBlocked\": \"User blocked\",\n \"UserUnblocked\": \"User unblocked\",\n \"AudioUnknownArtist\": \"Unknown artist\",\n \"AudioUnknownTitle\": \"Unknown title\",\n \"LogOut\": \"Log out\",\n \"OnlineCount\": {\n \"one_value\": \"%1$d online\",\n \"other_value\": \"%1$d online\"\n },\n \"EditedMessage\": \"edited\",\n \"GlobalSearch\": \"Global search\",\n \"SearchMessages\": \"Messages\",\n \"SearchAllChatsShort\": \"Chats\",\n \"ClearButton\": \"Clear\",\n \"FilterAllChats\": \"All Chats\",\n \"FilterAllChatsShort\": \"All\",\n \"Call\": \"Call\",\n \"VideoCall\": \"Video Call\",\n \"CallMessageOutgoing\": \"Outgoing Call\",\n \"CallMessageIncoming\": \"Incoming Call\",\n \"CallMessageVideoOutgoing\": \"Outgoing Video Call\",\n \"CallMessageVideoIncoming\": \"Incoming Video Call\",\n \"VoipExchangingKeys\": \"Exchanging encryption keys\",\n \"VoipUnmute\": \"Unmute\",\n \"SavingContentTitle\": \"Saving content\",\n \"RestrictSavingContent\": \"Restrict saving content\",\n \"RestrictSavingContentInfoGroup\": \"Members won't be able to copy, save and forward content from this group.\",\n \"RestrictSavingContentInfoChannel\": \"Subscribers won't be able to copy, save and forward content from this channel.\",\n \"ClearOtherSessionsHelp\": \"Logs out all devices except for this one.\",\n \"SessionsListInfo\": \"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.\",\n \"SponsoredMessage\": \"sponsored\",\n \"OpenChannelPost\": \"VIEW POST\",\n \"FilterNameHint\": \"Folder name\",\n \"BotStart\": \"START\",\n \"BotUnblock\": \"RESTART\",\n \"BotStop\": \"Stop bot\",\n \"BotRestart\": \"Restart bot\",\n \"ShareYouPhoneNumberTitle\": \"Share your phone number?\",\n \"AreYouSureShareMyContactInfoBot\": \"The bot will know your phone number. This can be useful for integration with other services.\",\n \"DistanceUnitsTitle\": \"Distance units\",\n \"DistanceUnitsKilometers\": \"Kilometers\",\n \"DistanceUnitsMiles\": \"Miles\",\n \"PeopleNearby\": \"People Nearby\",\n \"MakeMyselfVisible\": \"Make Myself Visible\",\n \"MakeMyselfVisibleTitle\": \"Show Your Profile?\",\n \"MakeMyselfVisibleInfo\": \"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.\",\n \"StopShowingMe\": \"Stop Showing Me\",\n \"PeopleNearbyInfo2\": \"Exchange contact info with people nearby and find new friends.\",\n \"NearbyCreateGroup\": \"Create a Local group\",\n \"AwayTo\": \"%1$s away\",\n \"MessagePreview\": \"Message Preview\",\n \"KMetersAway2\": \"%1$s km away\",\n \"MetersAway2\": \"%1$s m away\",\n \"MilesAway\": \"%1$s mi away\",\n \"FootsAway\": \"%1$s ft away\",\n \"PeopleNearbyHeader\": \"People nearby\",\n \"ChatsNearbyHeader\": \"Groups nearby\",\n \"ChatLocation\": \"Location\",\n \"RequestToJoinGroupDescription\": \"This group accepts new members only after they are approved by its admins.\",\n \"RequestToJoinChannelDescription\": \"This channel accepts new subscribers only after they are approved by its admins.\",\n \"RequestToJoinSent\": \"Join request sent\",\n \"RequestToJoinGroupApproved\": \"Your request to join the group was approved\",\n \"RequestToJoinChannelApproved\": \"Your request to join the channel was approved\",\n \"Update\": \"UPDATE\",\n\n // * macos\n \"AccountSettings.Filters\": \"Chat Folders\",\n \"AccountSettings.Notifications\": \"Notifications and Sounds\",\n \"AccountSettings.PrivacyAndSecurity\": \"Privacy and Security\",\n \"AccountSettings.Language\": \"Language\",\n \"Alert.UserDoesntExists\": \"Sorry, this user doesn't seem to exist.\",\n \"Alert.Confirm.Discard\": \"Discard\",\n \"Appearance.Reset\": \"Reset to Defaults\",\n \"Bio.Description\": \"Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco\",\n \"Call.Accept\": \"Accept\",\n \"Call.Decline\": \"Decline\",\n \"Call.End\": \"End\",\n \"Call.Camera\": \"Camera\",\n \"Call.Mute\": \"Mute\",\n \"Call.Recall\": \"Recall\",\n \"Call.Close\": \"Close\",\n \"Call.Screen\": \"Screen\",\n \"Call.Confirm.Discard.Voice.Header\": \"Video Chat in Progress\",\n \"Call.Confirm.Discard.Voice.ToVoice.Text\": \"Leave video chat in \\\"%1$@\\\" and start a new one in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Voice.ToCall.Text\": \"Leave video chat in \\\"%1$@\\\" and start a call with \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.Header\": \"Call in Progress\",\n \"Call.Confirm.Discard.Call.ToVoice.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.Confirm.Discard.Call.ToCall.Text\": \"End call with \\\"%1$@\\\" and start a video chat in \\\"%2$@\\\"?\",\n \"Call.PrivacyErrorMessage\": \"Sorry, you cannot call %@ because of their privacy settings.\",\n \"Call.StatusRequesting\": \"Contacting...\",\n \"Call.StatusRinging\": \"Ringing...\",\n \"Call.StatusConnecting\": \"Connecting...\",\n \"Call.StatusEnded\": \"Call Ended\",\n \"Call.StatusFailed\": \"Call Failed\",\n \"Call.StatusBusy\": \"Busy\",\n \"Call.StatusCalling\": \"is calling you...\",\n \"Contacts.PhoneNumber.NotRegistred\": \"The person with this phone number is not registered on Telegram yet.\",\n \"Channel.UsernameAboutChannel\": \"People can share this link with others and can find your channel using Telegram search.\",\n \"Channel.UsernameAboutGroup\": \"People can share this link with others and find your group using Telegram search.\",\n \"Chat.Accessory.Forward\": {\n \"one_value\": \"Forward Message\",\n \"other_value\": \"Forward %d Messages\"\n },\n \"Chat.Accessory.Forward.You\": \"You\",\n \"Chat.Accessory.Forward.From\": \"From\",\n \"Chat.Accessory.Hidden\": {\n \"one_value\": \"Forward Message (sender's name hidden)\",\n \"other_value\": \"Forward %d Messages (senders' names hidden)\"\n },\n \"Chat.Alert.Forward.Action.Another\": \"Forward to Another Chat\",\n \"Chat.Alert.Forward.Action.Hide1\": {\n \"one_value\": \"Hide Sender's Name\",\n \"other_value\": \"Hide Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.Show1\": {\n \"one_value\": \"Show Sender's Name\",\n \"other_value\": \"Show Senders' Names\"\n },\n \"Chat.Alert.Forward.Action.ShowCaption\": {\n \"one_value\": \"Show Caption\",\n \"other_value\": \"Show Captions\"\n },\n \"Chat.Alert.Forward.Action.HideCaption\": {\n \"one_value\": \"Hide Caption\",\n \"other_value\": \"Hide Captions\"\n },\n \"Chat.CopySelectedText\": \"Copy Selected Text\",\n \"Chat.Confirm.Unpin\": \"Would you like to unpin this message?\",\n \"Chat.Date.ScheduledFor\": \"Scheduled for %@\",\n \"Chat.Date.ScheduledForToday\": \"Scheduled for today\",\n \"Chat.DropTitle\": \"Drop files here to send them\",\n \"Chat.DropQuickDesc\": \"in a quick way\",\n \"Chat.DropAsFilesDesc\": \"without compression\",\n \"Chat.Edit.Cancel.Text\": \"Are you sure you want to discard all changes?\",\n \"Chat.Service.Call.Cancelled\": \"Cancelled\",\n \"Chat.Service.Call.Missed\": \"Missed\",\n \"Chat.Service.PeerJoinedTelegram\": \"%@ joined Telegram\",\n \"Chat.Service.Channel.UpdatedTitle\": \"Channel renamed to \\\"%@\\\"\",\n \"Chat.Service.Channel.UpdatedPhoto\": \"Channel photo updated\",\n \"Chat.Service.Channel.RemovedPhoto\": \"Channel photo removed\",\n \"Chat.Service.Channel.UpdatedVideo\": \"Channel video updated\",\n \"Chat.Service.BotPermissionAllowed\": \"You allowed this bot to message you when you logged in on %@\",\n \"Chat.Service.Group.UpdatedPinnedMessage\": \"%@ pinned \\\"%@\\\"\",\n \"Chat.Service.VoiceChatStarted\": \"%1$@ started a [video chat](open)\",\n \"Chat.Service.VoiceChatStartedYou\": \"You started a [video chat](open)\",\n \"Chat.Service.VoiceChatStarted.Channel\": \"[Live Stream](open) started\",\n \"Chat.Service.VoiceChatFinished\": \"%1$@ ended the video chat (%2$@)\",\n \"Chat.Service.VoiceChatFinishedYou\": \"You ended the video chat (%@)\",\n \"Chat.Service.VoiceChatFinished.Channel\": \"Live Stream ended (%1$@)\",\n \"Chat.Service.VoiceChatInvitation\": \"%1$@ invited %2$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationByYou\": \"You invited %1$@ to the [video chat](open)\",\n \"Chat.Service.VoiceChatInvitationForYou\": \"%1$@ invited you to the [video chat](open)\",\n \"ChatService.UserJoinedGroupByRequest\": \"%@ was accepted to the group\",\n \"ChatService.UserJoinedChannelByRequest\": \"%@ joined the channel by request\",\n \"ChatList.Service.VoiceChatScheduled\": \"%1$@ scheduled a video chat for %2$@\",\n \"ChatList.Service.VoiceChatScheduledYou\": \"You scheduled a video chat for %2$@\",\n \"Chat.Poll.Unvote\": \"Retract Vote\",\n \"Chat.Poll.Stop\": \"Stop Poll\",\n \"Chat.Poll.ViewResults\": \"View Results\",\n \"Chat.Poll.SubmitVote\": \"Vote\",\n \"Chat.Poll.Type.Anonymous\": \"Anonymous Poll\",\n \"Chat.Poll.Type.Public\": \"Poll\",\n \"Chat.Poll.Type.AnonymousQuiz\": \"Anonymous Quiz\",\n \"Chat.Poll.Type.Quiz\": \"Quiz\",\n \"Chat.Poll.Type.Closed\": \"Final Results\",\n \"Chat.Poll.TotalVotes1\": {\n \"one_value\": \"%d vote\",\n \"other_value\": \"%d votes\"\n },\n \"Chat.Quiz.TotalVotes\": {\n \"one_value\": \"%d answer\",\n \"other_value\": \"%d answers\"\n },\n \"Chat.Poll.TotalVotesEmpty\": \"No votes yet\",\n \"Chat.Poll.TotalVotesResultEmpty\": \"No votes\",\n \"Chat.Quiz.TotalVotesEmpty\": \"No answers yet\",\n \"Chat.Quiz.TotalVotesResultEmpty\": \"No answers\",\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n \"Chat.Pinned.DontShow\": \"Don't Show Pinned Messages\",\n \"Chat.Title.Comments\": {\n \"one_value\": \"%d Comment\",\n \"other_value\": \"%d Comments\"\n },\n \"ChatTitle.ReportMessages\": \"Report Messages\",\n \"Chat.Send.WithoutSound\": \"Send Without Sound\",\n \"Chat.Send.SetReminder\": \"Set a Reminder\",\n \"Chat.Send.ScheduledMessage\": \"Schedule Message\",\n \"Chat.UnpinAllMessagesConfirmation\": {\n \"one_value\": \"Do you want to unpin %d message in this chat?\",\n \"other_value\": \"Do you want to unpin all %d messages in this chat?\"\n },\n \"Chat.Message.Ad.Text\": \"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.\",\n \"Chat.Message.Ad.ReadMore\": \"Read More\",\n \"Chat.Message.ViewChannel\": \"VIEW CHANNEL\",\n \"Chat.Message.ViewBot\": \"VIEW BOT\",\n \"Chat.Message.ViewGroup\": \"VIEW GROUP\",\n \"Chat.Message.Sponsored.What\": \"What are sponsored messages?\",\n \"Chat.Message.Sponsored.Link\": \"https://promote.telegram.org\",\n \"ChatList.Context.Mute\": \"Mute\",\n \"ChatList.Context.Unmute\": \"Unmute\",\n \"ChatList.Context.Pin\": \"Pin\",\n \"ChatList.Context.Unpin\": \"Unpin\",\n \"ChatList.Context.DeleteChat\": \"Delete Chat\",\n \"ChatList.Context.DeleteAndExit\": \"Delete and Leave\",\n \"ChatList.Context.LeaveChannel\": \"Leave Channel\",\n \"ChatList.Context.LeaveGroup\": \"Leave Group\",\n \"ChatList.Service.Call.incoming\": \"Incoming Call (%@)\",\n \"ChatList.Service.Call.outgoing\": \"Outgoing Call (%@)\",\n \"ChatList.Service.VideoCall.incoming\": \"Incoming Video Call (%@)\",\n \"ChatList.Service.VideoCall.outgoing\": \"Outgoing Video Call (%@)\",\n \"ChatList.Service.Call.Cancelled\": \"Cancelled Call\",\n \"ChatList.Service.Call.Missed\": \"Missed Call\",\n \"ChatList.Service.VideoCall.Cancelled\": \"Cancelled Video Call\",\n \"ChatList.Service.VideoCall.Missed\": \"Missed Video Call\",\n \"ChatList.Service.VoiceChatScheduled.Channel\": \"Voice chat scheduled for %@\",\n \"ChatList.Filter.Header\": \"Create folders for different groups of chats and quickly switch between them.\",\n \"ChatList.Filter.NewTitle\": \"Create Folder\",\n \"ChatList.Filter.List.Title\": \"Chat Folders\",\n \"ChatList.Filter.Include.AddChat\": \"Add Chats\",\n \"ChatList.Filter.Exclude.AddChat\": \"Add Chats\",\n //\"ChatList.Filter.All\": \"All\",\n \"ChatList.Filter.Contacts\": \"Contacts\",\n \"ChatList.Filter.NonContacts\": \"Non-Contacts\",\n \"ChatList.Filter.Groups\": \"Groups\",\n \"ChatList.Filter.Channels\": \"Channels\",\n \"ChatList.Filter.Bots\": \"Bots\",\n \"ChatList.Filter.MutedChats\": \"Muted\",\n \"ChatList.Filter.ReadChats\": \"Read\",\n \"ChatList.Filter.Archive\": \"Archived\",\n \"ChatList.Filter.Include.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Exclude.LimitReached\": \"Sorry, you can only add up to 100 individual chats. Try using chat types.\",\n \"ChatList.Filter.Confirm.Remove.Header\": \"Remove Folder\",\n \"ChatList.Filter.Confirm.Remove.Text\": \"Are you sure you want to remove this folder? Your chats will not be deleted.\",\n \"Channel.DescriptionHolderDescrpiton\": \"You can provide an optional description for your channel.\",\n \"CreateGroup.NameHolder\": \"Group Name\",\n \"Date.Today\": \"Today\",\n \"DeleteChat.DeleteGroupForAll\": \"Delete for all members\",\n \"DeleteChannelForAll\": \"Delete for all subscribers\",\n \"EditAccount.Username\": \"Username\",\n \"EditAccount.Title\": \"Edit Profile\",\n \"EditAccount.Logout\": \"Log Out\",\n \"Emoji.Recent\": \"Frequently Used\",\n \"Emoji.SmilesAndPeople\": \"Smileys & People\",\n \"Emoji.AnimalsAndNature\": \"Animals & Nature\",\n \"Emoji.FoodAndDrink\": \"Food & Drink\",\n \"Emoji.ActivityAndSport\": \"Activity & Sport\",\n \"Emoji.TravelAndPlaces\": \"Travel & Places\",\n \"Emoji.Objects\": \"Objects\",\n //\"Emoji.Symbols\": \"Symbols\",\n \"Emoji.Flags\": \"Flags\",\n \"LastSeen.HoursAgo\": {\n \"one_value\": \"last seen %d hour ago\",\n \"other_value\": \"last seen %d hours ago\"\n },\n \"Login.Register.LastName.Placeholder\": \"Last Name\",\n \"Modal.Send\": \"Send\",\n \"Telegram.GeneralSettingsViewController\": \"General Settings\",\n \"Telegram.InstalledStickerPacksController\": \"Stickers\",\n \"Telegram.NotificationSettingsViewController\": \"Notifications\",\n \"Telegram.LanguageViewController\": \"Language\",\n \"Stickers.SearchAdd\": \"Add\",\n \"Stickers.SearchAdded\": \"Added\",\n \"Stickers.SuggestStickers\": \"Suggest Stickers by Emoji\",\n \"ShareModal.Search.Placeholder\": \"Share to...\",\n \"ShareModal.Search.ForwardPlaceholder\": \"Forward to...\",\n \"InstalledStickers.LoopAnimated\": \"Loop Animated Stickers\",\n \"Peer.Activity.User.PlayingGame\": \"playing a game\",\n \"Peer.Activity.User.TypingText\": \"typing\",\n \"Peer.Activity.User.SendingPhoto\": \"sending a photo\",\n \"Peer.Activity.User.RecordingVideo\": \"recording video\",\n \"Peer.Activity.User.SendingVideo\": \"sending a video\",\n \"Peer.Activity.User.RecordingAudio\": \"recording voice\",\n \"Peer.Activity.User.SendingFile\": \"sending file\",\n \"Peer.Activity.User.ChoosingSticker\": \"choosing a sticker\",\n \"Peer.Activity.User.EnjoyingAnimations\": \"watching %@\",\n \"Peer.Activity.Chat.PlayingGame\": \"%@ is playing a game\",\n \"Peer.Activity.Chat.TypingText\": \"%@ is typing\",\n \"Peer.Activity.Chat.SendingPhoto\": \"%@ is sending a photo\",\n \"Peer.Activity.Chat.RecordingVideo\": \"%@ is recording video\",\n \"Peer.Activity.Chat.SendingVideo\": \"%@ is sending a video\",\n \"Peer.Activity.Chat.RecordingAudio\": \"%@ is recording voice\",\n \"Peer.Activity.Chat.SendingFile\": \"%@ is sending a file\",\n \"Peer.Activity.Chat.ChoosingSticker\": \"%@ is choosing a sticker\",\n \"Peer.Activity.Chat.EnjoyingAnimations\": \"%@ is watching %@\",\n \"Peer.Activity.Chat.Multi.PlayingGame1\": \"%@ and %d others are playing a game\",\n \"Peer.Activity.Chat.Multi.TypingText1\": \"%@ and %d others are typing\",\n \"Peer.Activity.Chat.Multi.SendingPhoto1\": \"%@ and %d others are sending photos\",\n \"Peer.Activity.Chat.Multi.RecordingVideo1\": \"%@ and %d others are recording video\",\n \"Peer.Activity.Chat.Multi.SendingVideo1\": \"%@ and %d others are sending videos\",\n \"Peer.Activity.Chat.Multi.RecordingAudio1\": \"%@ and %d others are recording voice\",\n //\"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n \"Peer.Activity.Chat.Multi.SendingFile1\": \"%@ and %d others are sending files\",\n \"Peer.Activity.Chat.Multi.ChoosingSticker1\": \"%@ and %d others are choosing stickers\",\n \"Peer.ServiceNotifications\": \"service notifications\",\n \"Peer.RepliesNotifications\": \"Reply Notifications\",\n \"Peer.Status.justNow\": \"last seen just now\",\n \"Peer.Status.Today\": \"today\",\n \"Peer.Status.Yesterday\": \"yesterday\",\n \"Peer.Status.LastSeenAt\": \"last seen %@ at %@\",\n \"Peer.Status.minAgo\": {\n \"one_value\": \"last seen %d minute ago\",\n \"other_value\": \"last seen %d minutes ago\"\n },\n \"Peer.Status.Member\": {\n \"one_value\": \"%d member\",\n \"other_value\": \"%d members\"\n },\n \"Peer.Status.Subscribers\": {\n \"one_value\": \"%d subscriber\",\n \"other_value\": \"%d subscribers\"\n },\n \"PeerInfo.Administrators\": \"Administrators\",\n \"PeerInfo.DeleteChannel\": \"Delete Channel\",\n \"PeerInfo.Discussion\": \"Discussion\",\n \"PeerInfo.Discussion.Add\": \"Add\",\n \"PeerInfo.SignMessages\": \"Sign Messages\",\n \"PeerInfo.SharedMedia\": \"Shared Media\",\n \"PeerInfo.Subscribers\": \"Subscribers\",\n \"PeerInfo.DeleteContact\": \"Delete Contact\",\n //\"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n \"PeerInfo.Action.VoiceChat\": \"Video Chat\",\n \"PeerInfo.Action.LiveStream\": \"Live Stream\",\n \"PeerMedia.Members\": \"Members\",\n \"PollResults.Title.Poll\": \"Poll Results\",\n \"PollResults.Title.Quiz\": \"Quiz Results\",\n \"PollResults.LoadMore\": {\n \"other_value\": \"Show More (%d)\"\n },\n //\"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n \"Preview.Dragging.AddItems\": {\n \"one_value\": \"Add Item\",\n \"other_value\": \"Add Items\"\n },\n \"PreviewSender.CaptionPlaceholder\": \"Add a caption...\",\n \"PreviewSender.CompressFile\": \"Send compressed\",\n \"PreviewSender.SendFile\": {\n \"one_value\": \"Send File\",\n \"other_value\": \"Send %d Files\"\n },\n \"PreviewSender.SendPhoto\": {\n \"one_value\": \"Send Photo\",\n \"other_value\": \"Send %d Photos\"\n },\n \"PreviewSender.SendVideo\": {\n \"one_value\": \"Send Video\",\n \"other_value\": \"Send %d Videos\"\n },\n \"PrivacyAndSecurity.Item.On\": \"On\",\n \"PrivacyAndSecurity.Item.Off\": \"Off\",\n \"PrivacyAndSecurity.SensitiveText\": \"Disable filtering\",\n \"PrivacyAndSecurity.SensitiveDesc\": \"Display sensitive media in public channels on all your Telegram devices.\",\n \"PrivacySettings.VoiceCalls\": \"Calls\",\n \"PrivacySettings.Forwards\": \"Forwarded Messages\",\n \"PrivacySettings.Groups\": \"Groups and Channels\",\n \"PrivacySettingsController.AddUsers\": \"Add Users\",\n \"PrivacySettingsController.GroupDescription\": \"You can restrict who can add you to groups and channels with granular precision.\",\n \"PrivacySettingsController.Forwards.CustomHelp\": \"You can restrict who can add a link to your account when forwarding your messages.\",\n \"PrivacySettingsController.P2p.Desc\": \"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.\",\n \"PrivacySettingsController.PhoneCallDescription\": \"You can restrict who can call you with granular precision.\",\n \"PrivacySettingsController.ProfilePhoto.CustomHelp\": \"You can restrict who can see your profile photo with granular precision.\",\n \"PrivacySettingsController.LastSeenDescription\": \"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).\",\n \"PrivacySettingsController.PeerInfo\": \"You can add users or entire groups as exceptions that will override the settings above.\",\n \"PrivacySettingsController.Everbody\": \"Everybody\",\n \"PrivacySettingsController.MyContacts\": \"My Contacts\",\n \"PrivacySettingsController.Nobody\": \"Nobody\",\n \"PrivacySettingsController.NeverShare\": \"Never Share With\",\n \"PrivacySettingsController.AlwaysShare\": \"Always Share With\",\n \"PrivacySettingsController.NeverAllow\": \"Never Allow\",\n \"PrivacySettingsController.AlwaysAllow\": \"Always Allow\",\n \"PrivacySettingsController.UserCount\": {\n \"one_value\": \"%d user\",\n \"other_value\": \"%d users\"\n },\n \"RecentSessions.Error.FreshReset\": \"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.\",\n \"RequestJoin.Button\": \"Request to Join\",\n \"Message.Context.Select\": \"Select\",\n \"Message.Context.Pin\": \"Pin\",\n \"Message.Context.Unpin\": \"Unpin\",\n \"Message.Context.Goto\": \"Show Message\",\n \"MessageContext.CopyMessageLink1\": \"Copy Message Link\",\n \"NewPoll.Anonymous\": \"Anonymous Voting\",\n \"NewPoll.Explanation.Placeholder\": \"Add a Comment (Optional)\",\n \"NewPoll.OptionsAddOption\": \"Add an Option\",\n \"NewPoll.MultipleChoice\": \"Multiple Answers\",\n \"NewPoll.Quiz\": \"Quiz Mode\",\n \"GeneralSettings.BigEmoji\": \"Large Emoji\",\n \"GeneralSettings.EmojiPrediction\": \"Suggest Emoji\",\n \"GroupPermission.Delete\": \"Delete Exception\",\n \"Search.Confirm.ClearHistory\": \"Are you sure you want to clear your search history?\",\n \"Separator.ShowMore\": \"show more\",\n \"Separator.ShowLess\": \"show less\",\n \"ScheduleController.at\": \"at\",\n \"Schedule.SendToday\": \"Send today at %@\",\n \"Schedule.SendDate\": \"Send on %@ at %@\",\n \"Schedule.SendWhenOnline\": \"Send When Online\",\n \"Stickers.Recent\": \"Recent\",\n //\"Stickers.Favorite\": \"Favorite\",\n \"StickerSet.DontExist\": \"Sorry, this sticker set doesn't seem to exist.\",\n \"VoiceChat.Chat.StartNew\": \"Video chat ended. Start a new one?\",\n \"VoiceChat.Chat.StartNew.OK\": \"Start\",\n \"VoiceChat.Chat.Ended\": \"Video chat ended.\",\n \"VoiceChat.Invite.InviteMembers\": \"Invite members\",\n \"VoiceChat.Status.Connecting\": \"Connecting...\",\n \"VoiceChat.Status.Members\": {\n \"one_value\": \"%d participant\",\n \"other_value\": \"%d participants\"\n },\n \"VoiceChat.Status.MutedForYou\": \"muted for you\",\n \"VoiceChat.Status.Speaking\": \"speaking\",\n \"VoiceChat.Status.Listening\": \"listening\",\n \"VoiceChat.Status.WantsSpeak\": \"wants to speak\",\n \"VoiceChat.Status.Muted\": \"muted\",\n \"VoiceChat.Status.You\": \"This is you\",\n \"VoiceChat.Video.Stream.Video\": \"video\",\n \"VoiceChat.Video.Stream.Screencast\": \"screen\",\n \"VoiceChat.Video.Stream.More\": \"more\",\n \"VoiceChat.Leave\": \"Leave\",\n \"VoiceChat.End.Title\": \"Leave video chat\",\n \"VoiceChat.End.Text\": \"Are you sure you want to leave this video chat?\",\n \"VoiceChat.End.Third\": \"End Video Chat\",\n \"VoiceChat.End.OK\": \"Leave\",\n \"VoiceChat.MutePeer\": \"Mute\",\n \"VoiceChat.UnmutePeer\": \"Allow To Speak\",\n \"VoiceChat.RemovePeer\": \"Remove\",\n \"VoiceChat.OpenProfile\": \"Open Profile\",\n \"VoiceChat.MuteForMe\": \"Mute For Me\",\n \"VoiceChat.UnmuteForMe\": \"Unmute For Me\",\n \"VoiceChat.RemovePeer.Confirm.Channel\": \"Do you want to remove %1$@ from the channel?\",\n \"VoiceChat.RemovePeer.Confirm\": \"Are you sure you want to remove %1$@ from the group?\",\n \"VoiceChat.RemovePeer.Confirm.OK\": \"Remove\",\n \"Text.Context.Copy.Username\": \"Copy Username\",\n \"Text.Context.Copy.Hashtag\": \"Copy Hashtag\",\n \"Time.TomorrowAt\": \"tomorrow at %@\",\n \"TwoStepAuth.SetPasswordHelp\": \"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.\",\n \"TwoStepAuth.GenericHelp\": \"You have enabled Two-Step verification.\\nYou'll need the password you set up here to log in to your Telegram account.\",\n \"TwoStepAuth.ChangePassword\": \"Change Password\",\n \"TwoStepAuth.RemovePassword\": \"Turn Password Off\",\n \"TwoStepAuth.SetupEmail\": \"Set Recovery Email\",\n \"TwoStepAuth.ChangeEmail\": \"Change Recovery Email\",\n \"TwoStepAuth.ConfirmEmailCodeDesc\": \"Please enter the code we've just emailed to %@.\",\n \"TwoStepAuth.RecoveryTitle\": \"Email Code\",\n \"TwoStepAuth.RecoveryCode\": \"Code\",\n \"TwoStepAuth.RecoveryCodeInvalid\": \"Invalid code. Please try again.\",\n \"TwoStepAuth.RecoveryCodeExpired\": \"Code Expired\",\n \"TwoStepAuth.SetupHintTitle\": \"Password Hint\",\n \"TwoStepAuth.SetupHintPlaceholder\": \"Hint\",\n \"UsernameSettings.ChangeDescription\": \"You can choose a username on Telegram. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\n\\nYou can use a-z, 0-9 and underscores. Minimum length is 5 characters.\"\n};\n\nexport default lang;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 230b411f8..f152c69e9 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.624478a518e31a4f8433.css b/public/main.624478a518e31a4f8433.css deleted file mode 100644 index 650730f81..000000000 --- a/public/main.624478a518e31a4f8433.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} -:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius 0.1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity 0.1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height 0.1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility 0.1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0.1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity 0.1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity 0.1s 0.1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity 0.1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url("assets/img/bg.jpeg");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity 0.1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity 0.1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu-item{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description,.topbar-call-container .call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker){cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:" ";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,.settings-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:" ";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:" ";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen{border-radius:0}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7}.call-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * 2));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * 2))}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0} -@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?onwvlx") format("truetype"),url("assets/fonts/tgico.woff?onwvlx") format("woff"),url("assets/fonts/tgico.svg?onwvlx#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward_filled:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-play:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply_filled:before{content:""}.tgico-reply:before{content:""}.tgico-rightpanel:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings_filled:before{content:""}.tgico-settings:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videocamera:before{content:""}.tgico-videochat:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} - -/*# sourceMappingURL=main.624478a518e31a4f8433.css.map*/ \ No newline at end of file diff --git a/public/main.624478a518e31a4f8433.css.map b/public/main.624478a518e31a4f8433.css.map deleted file mode 100644 index 842497168..000000000 --- a/public/main.624478a518e31a4f8433.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss","webpack:///./src/scss/tgico.scss"],"names":[],"mappings":"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","file":"main.624478a518e31a4f8433.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius 0.1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity 0.1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height 0.1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility 0.1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0.1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity 0.1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity 0.1s 0.1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity 0.1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url(\"assets/img/bg.jpeg\");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity 0.1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity 0.1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu-item{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description,.topbar-call-container .call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker){cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:\" \";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,.settings-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:\" \";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:\" \";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen{border-radius:0}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7}.call-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * 2));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * 2))}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0}","@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?onwvlx\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?onwvlx\") format(\"woff\"),url(\"assets/fonts/tgico.svg?onwvlx#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.9c67b3d788e233efd43d.css b/public/main.9c67b3d788e233efd43d.css new file mode 100644 index 000000000..bea73ad99 --- /dev/null +++ b/public/main.9c67b3d788e233efd43d.css @@ -0,0 +1,5 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word} +:root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:" ";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:""}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:""}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:" ";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:" ";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:"";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:" ";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:"";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius 0.1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity 0.1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height 0.1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:""}html.is-ios .chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:"" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:"";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:" ";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility 0.1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0.1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity 0.1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity 0.1s 0.1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity 0.1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url("assets/img/bg.jpeg");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity 0.1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity 0.1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu-item{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:" ";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description,.topbar-call-container .call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:" ";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:"Unread messages";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker){cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:" "}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:" ";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:"";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:" ";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:""}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:""}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:""}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:""}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:" ";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:" ";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:" ";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:" "}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:" ";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:" ";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:" ";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:" ";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:" ";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,.settings-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:" ";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:" ";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:" ";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:"";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:"";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:" ";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:"";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:" • "}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:" ";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:" ";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:" ";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:" ";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:" ";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:" ";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen{border-radius:0}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7}.call-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * 2));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * 2))}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:500;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:"Roboto";font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:"Roboto",-apple-system,apple color emoji,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:" "}.media-round.is-paused .video-time:after{content:"";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:" ";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:"Roboto" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0} +@font-face{font-family:"tgico";src:url("assets/fonts/tgico.ttf?onwvlx") format("truetype"),url("assets/fonts/tgico.woff?onwvlx") format("woff"),url("assets/fonts/tgico.svg?onwvlx#tgico") format("svg");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=" tgico-"]:before,[class*=" tgico-"]:after{font-family:"tgico";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete_filled:before{content:""}.tgico-delete:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward_filled:before{content:""}.tgico-forward:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-help:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-play:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply_filled:before{content:""}.tgico-reply:before{content:""}.tgico-rightpanel:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings_filled:before{content:""}.tgico-settings:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-sport:before{content:""}.tgico-stickers:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videocamera:before{content:""}.tgico-videochat:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""} + +/*# sourceMappingURL=main.9c67b3d788e233efd43d.css.map*/ \ No newline at end of file diff --git a/public/main.9c67b3d788e233efd43d.css.map b/public/main.9c67b3d788e233efd43d.css.map new file mode 100644 index 000000000..a80655ba9 --- /dev/null +++ b/public/main.9c67b3d788e233efd43d.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss","webpack:///./src/scss/tgico.scss"],"names":[],"mappings":"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","file":"main.9c67b3d788e233efd43d.css","sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{text-decoration:none;-webkit-tap-highlight-color:transparent}img,video{-webkit-user-drag:none}.valign-wrapper{display:flex;align-items:center}.z-depth-0{box-shadow:none !important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none !important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.no-transition{transition:none !important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start !important}.justify-self-start{justify-self:flex-start !important}.justify-self-end{justify-self:flex-end !important}.position-center{position:absolute !important;left:50%;top:50%;transform:translate(-50%, -50%)}.text-bold{font-weight:500 !important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap !important}.no-border-radius{border-radius:0 !important}.disable-hover{pointer-events:none !important}a{text-decoration:none}html{line-height:1.5;font-weight:normal}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}pre,code{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}",":root{--vh: 1vh;--z-below: -1;--hover-alpha: 0.08;--transition-standard-easing: cubic-bezier(.4, .0, .2, 1);--transition-standard-in-time: .3s;--transition-standard-out-time: .25s;--transition-standard-in: var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out: var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition: .2s ease-in-out;--layer-transition: .2s cubic-bezier(.4, .0, .2, 1);--slide-header-transition: .4s ease-in-out;--tabs-transition: .25s ease-in-out;--btn-menu-transition: .2s cubic-bezier(.4, 0, .2, 1);--esg-transition: var(--btn-menu-transition);--popup-transition-function: cubic-bezier(.4, 0, .2, 1);--popup-transition-time: .15s;--btn-corner-transition: .2s cubic-bezier(.34, 1.56, .64, 1);--chatlist-badge-transition-in: .2s cubic-bezier(.35,.35,.47,1);--chatlist-badge-transition-out: .2s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin: 5.5625rem;--message-beside-button-size: 2.375rem;--message-beside-button-margin: calc((var(--message-beside-button-size) + .5rem) * -1);--message-time-background: rgba(0, 0, 0, .35);--message-highlightning-color: hsla(85.5319, 36.9171%, 40.402%, .4);--messages-container-width: 728px;--messages-text-size: 16px;--messages-secondary-text-size: calc(var(--messages-text-size) - 2px);--line-height: 1.3125;--esg-sticker-size: 80px;--disabled-opacity: .3;--round-video-size: 280px;--topbar-floating-scaleX: 1;--topbar-call-height: 3rem;--topbar-floating-call-height: 0px;--call-button-size: 3.375rem;--call-button-margin: 2rem;--peer-avatar-red-top: #ff885e;--peer-avatar-red-bottom: #ff516a;--peer-avatar-orange-top: #ffcd6a;--peer-avatar-orange-bottom: #ffa85c;--peer-avatar-violet-top: #82b1ff;--peer-avatar-violet-bottom: #665fff;--peer-avatar-green-top: #a0de7e;--peer-avatar-green-bottom: #54cb68;--peer-avatar-cyan-top: #53edd6;--peer-avatar-cyan-bottom: #28c9b7;--peer-avatar-blue-top: #72d5fd;--peer-avatar-blue-bottom: #2a9ef1;--peer-avatar-pink-top: #e0a2f3;--peer-avatar-pink-bottom: #d669ed}@media only screen and (max-width: 600px){:root{--right-column-width: 100vw;--esg-sticker-size: 68px;--round-video-size: 200px;--chat-input-size: 2.875rem;--chat-input-padding: 0.5rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 601px){:root{--right-column-width: calc(1680px / 4);--chat-input-size: 3.375rem;--chat-input-padding: 0.8125rem;--chat-input-inner-padding: 0.5rem}}@media only screen and (max-height: 569px){:root{--chat-input-size: 2.875rem;--chat-input-inner-padding: 0.25rem}}@media only screen and (min-width: 1276px)and (max-width: 1680px){:root{--right-column-width: 25vw}}:root{--body-background-color: #fff;--background-color-true: #f4f4f5;--background-color: var(--background-color-true);--border-color: #dfe1e5;--surface-color: #fff;--scrollbar-color: rgba(0, 0, 0, .2);--section-box-shadow-color: rgba(0, 0, 0, .06);--input-search-background-color: #fff;--input-search-border-color: #dfe1e5;--primary-color: #3390ec;--light-primary-color: rgba(51, 144, 236, 0.08);--dark-primary-color: #157ce1;--primary-text-color: #000;--secondary-color: #c4c9cc;--secondary-text-color: #707579;--light-secondary-text-color: rgba(112, 117, 121, 0.08);--danger-color: #df3f40;--light-danger-color: rgba(223, 63, 64, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-blue-top);--avatar-color-bottom: var(--peer-avatar-blue-bottom);--chatlist-status-color: var(--avatar-online-color);--chatlist-pinned-color: #a2abb2;--badge-text-color: #fff;--link-color: #00488f;--ripple-color: rgba(0, 0, 0, .08);--poll-circle-color: var(--border-color);--spoiler-background-color: #e3e5e8;--spoiler-draft-background-color: #d9d9d9;--message-background-color: var(--surface-color);--message-checkbox-color: #61c642;--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #eeffde;--light-message-out-background-color: rgba(238, 255, 222, 0.08);--dark-message-out-background-color: #d9ffb5;--message-out-link-color: var(--link-color);--message-out-primary-color: #4fae4e;--message-out-status-color: var(--message-out-primary-color);--message-out-audio-play-button-color: #fff;--gc-background-color: #212121;--gc-button-leave-color: rgba(255, 89, 90, .3);--gc-button-unmuted-color: rgba(1, 200, 80, .2);--gc-button-muted-color: rgba(60, 135, 247, .2);--gc-button-hand-color: rgba(223, 68, 184, .2);--gc-button-unmuted-fill-color: #195530;--gc-button-muted-fill-color: #3C87F7;--gc-green-color: #195530;--gc-blue-color: #3C87F7;--gc-red-color: #643333;--gc-primary-text-color: #fff;--gc-secondary-text-color: #aaaaaa;--gc-green-text-color: #5CC85E;--gc-blue-text-color: #3390ec;--gc-red-text-color: #ff595a;--gc-right-column-width: 26.25rem}.night{--body-background-color: #181818;--background-color-true: #181818;--background-color: var(--background-color-true);--border-color: #0f0f0f;--surface-color: #212121;--scrollbar-color: rgba(255, 255, 255, .2);--section-box-shadow-color: rgba(0, 0, 0, .12);--input-search-background-color: #181818;--input-search-border-color: #2f2f2f;--primary-color: #8774E1;--light-primary-color: rgba(135, 116, 225, 0.08);--dark-primary-color: #6a52da;--primary-text-color: #fff;--secondary-color: #707579;--secondary-text-color: #aaaaaa;--light-secondary-text-color: rgba(170, 170, 170, 0.08);--danger-color: #ff595a;--light-danger-color: rgba(255, 89, 90, 0.08);--avatar-online-color: #0ac630;--avatar-color-top: var(--peer-avatar-violet-top);--avatar-color-bottom: var(--peer-avatar-violet-bottom);--chatlist-status-color: var(--primary-color);--chatlist-pinned-color: var(--secondary-color);--badge-text-color: #fff;--link-color: var(--primary-color);--ripple-color: rgba(255, 255, 255, .08);--poll-circle-color: #fff;--spoiler-background-color: #373e4e;--spoiler-draft-background-color: #484848;--message-background-color: var(--surface-color);--message-checkbox-color: var(--primary-color);--message-checkbox-border-color: #fff;--message-secondary-color: var(--secondary-color);--message-out-background-color: #8774E1;--light-message-out-background-color: rgba(135, 116, 225, 0.08);--dark-message-out-background-color: #6a52da;--message-out-link-color: #fff;--message-out-primary-color: #fff;--message-out-status-color: rgba(255, 255, 255, .6);--message-out-audio-play-button-color: var(--message-out-background-color)}.input-wrapper{width:360px;margin:0 auto}.input-field{--height: 54px;--border-radius: 10px;position:relative}@media only screen and (max-width: 600px){.input-field{--height: 50px}}.input-field .arrow-down{position:absolute;content:\" \";top:50%;bottom:0;right:21px;cursor:pointer;height:0;width:0;border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;display:inline-block;padding:5px;vertical-align:middle;z-index:2;margin-top:-9px;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:.2s all}.input-field label{position:absolute;color:#9e9e9e;top:0;left:1rem;right:auto;z-index:2;height:1.5rem;transform:translate(0, 0);background-color:#fff;background-color:var(--surface-color);transform-origin:left center;pointer-events:none;margin-top:calc((var(--height) - 1.5rem) / 2);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}body.animation-level-2 .input-field label{transition:.2s transform,.2s padding,.1s opacity,font-weight 0s .1s}.input-field-border{position:absolute;top:0;right:0;bottom:0;left:0;border:2px solid #3390ec;border:2px solid var(--primary-color);opacity:0;border-radius:var(--border-radius);pointer-events:none;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-input{--padding: 1rem;--padding-horizontal: 1rem;--border-width: 1px;border:var(--border-width) solid #dfe1e5;border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);background-color:#fff;background-color:var(--surface-color);padding:calc(var(--padding) - var(--border-width));box-sizing:border-box;width:100%;min-height:var(--height);transition:0s border-color;position:relative;z-index:1;line-height:1.3125;line-height:var(--line-height)}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{-webkit-box-shadow:0 0 0px 1000px #fff inset;-webkit-box-shadow:0 0 0px 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill::first-line,.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:hover,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:active{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif !important;font-size:1rem !important;color:#000 !important;color:var(--primary-text-color) !important}@media only screen and (max-width: 600px){.input-field-input{--padding: .9375rem}}body.animation-level-0 .input-field-input{transition:none !important}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:.2s border-color}html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40 !important;color:var(--danger-color) !important}.input-field-input.error~.input-field-border{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f !important}.input-field-input.valid~.input-field-border{border-color:#26962f !important}.input-field-input:focus~.arrow-down{margin-top:-4px;transform:rotate(225deg);border-color:#3390ec;border-color:var(--primary-color)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:focus~label,.input-field-input:valid~label,.input-field-input:not(:empty)~label,.input-field-input:disabled~label{transform:translate(-0.25rem, calc(var(--height) / -2 + .125rem)) scale(0.75);padding:0 6px;opacity:1}.input-field-input-fake{opacity:0;pointer-events:none;position:absolute !important;top:0;left:0;bottom:auto !important;right:auto !important;height:auto !important;z-index:-3}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}input:focus,button:focus{outline:none}.input-clear{outline:none;border:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40 !important;color:var(--danger-color) !important}body:not(.animation-level-0) .input-clear.error{-webkit-animation:input-shake .2s ease-in-out forwards;animation:input-shake .2s ease-in-out forwards}@-webkit-keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-0.5rem)}75%{transform:translateX(0.5rem)}100%{transform:translateX(0)}}.input-search{position:relative;width:100%;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;--border-radius: 22px}@media only screen and (max-width: 600px){.input-search{margin-left:1rem}}.input-search-input{--height: 42px;background-color:#fff;background-color:var(--input-search-background-color);padding:0px calc(var(--height) + 3px - var(--border-width));height:var(--height);min-height:var(--height) !important;max-height:var(--height) !important;border-color:#dfe1e5;border-color:var(--input-search-border-color);line-height:var(--height)}body.animation-level-2 .input-search-input{transition:background-color .2s ease-in-out,border-color .2s ease-in-out}html.no-touch .input-search-input:hover:not(:focus),html.no-touch .input-search-input:active:not(:focus){border-color:#c4c9cc !important;border-color:var(--secondary-color) !important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:hover,html.no-touch .input-search-input:focus~.btn-icon:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:-ms-input-placeholder~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{position:absolute;top:50%;transform:translate(0, -50%);text-align:center;font-size:24px;color:#707579;color:var(--secondary-text-color);opacity:.6;line-height:1;z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}.input-search>.tgico-search{width:24px;height:24px;left:.8125rem;pointer-events:none}.input-search>.tgico-close{right:0px;z-index:1;width:42px;height:42px}.input-search>.tgico-close:before{margin-right:-1px}.input-field-password .input-field-input{padding-right:2.5rem;max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-size:2.25rem;padding-left:calc(.875rem - var(--border-width));line-height:1;padding-top:0;padding-bottom:0}@media(-webkit-min-device-pixel-ratio: 2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{position:absolute;right:.375rem;z-index:2;font-size:1.5rem;color:#9e9e9e;cursor:pointer;transition:color .2s;padding:.5rem;display:flex;align-items:center;justify-content:center;top:50%;transform:translateY(-50%)}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:hover,html.no-touch .input-field-password .toggle-visible:active{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing: .24px}.input-field-phone .input-field-input:after{content:attr(data-left-pattern);color:#9e9e9e;letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;outline:none;border:none;cursor:pointer}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn:hover,html.no-touch .btn:active,html.no-touch .btn-icon:hover,html.no-touch .btn-icon:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn.primary:hover,html.no-touch .btn.primary:active,html.no-touch .btn.blue:hover,html.no-touch .btn.blue:active,html.no-touch .btn.active:hover,html.no-touch .btn.active:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn-icon.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn:disabled,.btn-icon:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{text-align:center;font-size:1.5rem;line-height:1;border-radius:50% !important;color:#707579;color:var(--secondary-text-color);background-color:transparent;border:none;padding:.5rem;position:relative;transition:color .15s ease-in-out,opacity .15s ease-in-out,background-color .15s ease-in-out;display:flex;align-items:center;justify-content:center}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}.btn-corner{--offset: 1.25rem;--translateY: calc(54px + var(--offset));position:absolute !important;bottom:var(--offset);right:var(--offset);transition:transform .2s cubic-bezier(.34, 1.56, .64, 1) !important;transition:transform var(--btn-corner-transition) !important;transform:translate3d(0, var(--translateY), 0);z-index:3;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#3390ec;background-color:var(--primary-color);text-align:center;font-size:1.5rem;color:#fff;border:none;outline:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 !important}.btn-corner.is-visible{--translateY: 0}body.animation-level-0 .btn-corner{transition:none !important}.btn-corner:disabled{opacity:1 !important;pointer-events:all !important}.btn-corner .preloader-circular{width:2.5rem;height:2.5rem}.btn-menu{visibility:hidden;position:absolute;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 2px 8px 1px rgba(0,0,0,.24);z-index:3;top:100%;padding:.5rem 0;border-radius:10px;opacity:0;transform:scale(0.8);transition:opacity .2s cubic-bezier(.4, 0, .2, 1),transform .2s cubic-bezier(.4, 0, .2, 1),visibility .2s cubic-bezier(.4, 0, .2, 1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);font-size:16px;-webkit-user-select:none;-webkit-touch-callout:none}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{visibility:visible;opacity:1;transform:scale3d(1, 1, 1)}.btn-menu:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !important}.btn-menu.bottom-left{right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right{left:0;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{top:auto;top:initial;right:0;bottom:100%;transform-origin:bottom right}.btn-menu.top-right{top:auto;top:initial;left:0;bottom:100%;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}.btn-menu-item{display:flex;position:relative;padding:0 40px 0 1rem;height:56px;cursor:pointer !important;pointer-events:all !important;color:#000;color:var(--primary-text-color);text-transform:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;align-items:center;text-align:left;line-height:1.3125;line-height:var(--line-height)}html.no-touch .btn-menu-item:hover,html.no-touch .btn-menu-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:hover,html.no-touch .btn-menu-item.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-menu-item:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}@media only screen and (max-width: 600px){.btn-menu-item{padding:0 30px 0 16px;height:50px}}.btn-menu-item-text{flex:1 1 auto}.btn-menu-overlay{position:fixed !important;left:0;right:0;top:0;bottom:0;z-index:3;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn-menu-overlay{left:-100vw;right:-100vw;top:-100vh;bottom:-100vh;width:auto !important;max-width:none !important}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{height:2.5rem;background:#f4f4f5;background:var(--background-color-true);display:flex;align-items:center;justify-content:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;font-size:.875rem;color:currentColor}.btn-menu hr{padding:0;margin:.5rem 0}.btn-primary{border-radius:10px;width:100%;text-align:center;height:54px;border:none;font-weight:500;cursor:pointer;overflow:hidden;position:relative;padding:0;transition:.2s opacity}html.no-touch .btn-primary:hover,html.no-touch .btn-primary:active{transition:.2s background-color,.2s opacity;background:#157ce1;background:var(--dark-primary-color)}.btn-primary-transparent{color:#3390ec;color:var(--primary-color);background-color:transparent}html.no-touch .btn-primary-transparent:hover,html.no-touch .btn-primary-transparent:active{background:rgba(51, 144, 236, 0.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:hover,html.no-touch .btn-primary-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}.btn-primary>svg,.btn-primary use{height:calc(100% - 20px);right:15px;left:auto}.btn-primary:disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}.btn-control{width:auto;height:40px;align-items:center;margin:15px auto 1rem;border-radius:20px;padding:0 24px 0 12px;display:flex}.btn-control.tgico:before{font-size:1.5rem;margin-right:.375rem}.btn-transparent{color:#000;color:var(--primary-text-color);background-color:transparent;display:flex;align-items:center;padding:0 1rem;height:3.5rem;font-weight:normal;line-height:1.3125}@media only screen and (max-width: 600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:hover,html.no-touch .btn-transparent:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:hover,html.no-touch .btn-transparent.danger:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;margin-right:2rem}.btn-transparent.btn-short:before{margin-right:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);right:auto;left:auto;margin:0;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{position:relative;overflow:visible !important;font-weight:normal !important;cursor:pointer !important;pointer-events:all !important}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size: 54px;border-radius:50%;height:var(--size);width:var(--size);line-height:var(--size)}@media only screen and (max-width: 600px){.btn-circle{--size: 46px}}.btn-circle path{fill:#fff}.btn-disabled{pointer-events:none !important;cursor:default !important;color:#707579 !important;color:var(--secondary-text-color) !important}.btn-disabled:before{color:inherit !important}.btn-secondary:not(:first-child){margin-top:.5rem !important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{width:3.375rem;width:var(--call-button-size);height:3.375rem;height:var(--call-button-size);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:1.5rem;position:relative;border-radius:50%;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px)}.call-button-container{display:flex;flex-direction:column;align-items:center;cursor:pointer;width:3.375rem;width:var(--call-button-size)}.call-button-container.disabled{pointer-events:none}.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{white-space:nowrap;font-size:.875rem;margin-top:.25rem}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}.call-button+.call-button,.call-button-container+.call-button-container{margin-left:2rem;margin-left:var(--call-button-margin)}.btn-update{width:auto;padding:0 2rem !important;border-radius:var(--size);font-size:1rem;font-weight:500;right:auto}.animated-close-icon{position:absolute;transform:rotate(-45deg);pointer-events:none}.animated-close-icon,.animated-close-icon:before,.animated-close-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color)}.animated-close-icon:before,.animated-close-icon:after{position:absolute;left:0;top:0;content:\"\"}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:before,body.animation-level-2 .animated-close-icon:after{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}body.animation-level-2 .animated-close-icon.no-transition,body.animation-level-2 .animated-close-icon.no-transition:before,body.animation-level-2 .animated-close-icon.no-transition:after{transition:none}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translateY(-0.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translateY(0.375rem)}.animated-menu-icon{position:absolute}.animated-menu-icon,.animated-menu-icon:before,.animated-menu-icon:after{width:1.125rem;height:.125rem;border-radius:.125rem;background-color:#707579;background-color:var(--secondary-text-color);transform:rotate(0)}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:before,body.animation-level-2 .animated-menu-icon:after{transition:transform .25s}.animated-menu-icon:before,.animated-menu-icon:after{position:absolute;left:0;content:\"\"}.animated-menu-icon:before{top:-0.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(0.75) translate(0.375rem, -0.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(0.75) translate(0.375rem, 0.1875rem)}.animated-button-icon>.tgico{position:absolute;height:24px;line-height:24px}body:not(.animation-level-0) .animated-button-icon>.tgico{-webkit-animation:hide-icon .4s forwards ease-in-out;animation:hide-icon .4s forwards ease-in-out}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden;-webkit-animation:none !important;animation:none !important}.autocomplete-helper{--border-radius: 10px;position:absolute !important;bottom:calc(100% + .5rem);overflow:hidden;padding:0 !important;border-radius:var(--border-radius) !important;max-width:100%;left:0;width:auto !important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){-webkit-animation-name:fade-in-opacity;animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width: 319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal) * 4)}}.autocomplete-peer-helper .scrollable{position:relative;max-height:232px}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{height:3.125rem;display:flex;padding:0 2.125rem 0 .75rem;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{margin-left:.875rem;font-weight:500;flex:0 0 auto}.autocomplete-peer-helper-list-element-description{margin-left:.5625rem;color:#707579;color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{border-radius:.75rem;font-weight:500;color:#fff;color:var(--badge-text-color);font-size:.875rem;text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{height:1.25rem;min-width:1.25rem;line-height:1.25rem !important;padding:0 .375rem}.badge-24{height:1.5rem;min-width:1.5rem;line-height:1.5rem !important;padding:0 .5rem}.badge-24.tgico:before{font-size:1.5rem}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000;border-radius:0 !important;display:flex}.ckin__player.ckin__fullscreen video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.ckin__player .time{margin-left:.875rem;font-size:.875rem;color:#fff}@media only screen and (max-width: 600px){.ckin__player .time{margin-left:1.125rem}}.default{position:relative;font-size:0;display:flex;align-items:center;justify-content:center}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;line-height:1;color:#fff;text-align:center;outline:0;padding:0;cursor:pointer;position:absolute;opacity:1;visibility:visible;top:50%;left:50%;transform:translate3d(-50%, -50%, 0) scale(1);font-size:4rem;touch-action:manipulation}body.animation-level-2 .default__button--big{transition:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-transition),opacity var(--layer-transition)}@media only screen and (max-width: 600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default__controls{position:absolute;bottom:0;right:0;left:0;text-align:left;direction:ltr;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}.default__controls .progress-line{margin:0 16px;border-radius:var(--border-radius)}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:rgba(255,255,255,.38)}@media only screen and (max-width: 600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{height:49px;padding-top:93px;bottom:0;z-index:2;background-position:bottom;width:100%;position:absolute;background-repeat:repeat-x;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);pointer-events:none}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}@media only screen and (max-width: 600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0, 50px, 0)}.default .default__controls{transform:translate3d(0, 52px, 0)}@media only screen and (max-width: 600px){.default .default__controls{transform:translate3d(0, 65px, 0)}}.default.show-controls .default__gradient-bottom,.default.show-controls .default__controls{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0;visibility:hidden}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{margin:0 .125rem 0 .625rem;display:flex;align-items:center}html.is-touch .default .player-volume{display:none}.default .player-volume__icon{fill:#fff;width:2.25rem;height:2.25rem;margin-right:.5rem;cursor:pointer;padding:.375rem}.default .player-volume .progress-line{--color: #fff;margin:0;width:50px;--thumb-size: 15px}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none !important}video::-webkit-media-controls-enclosure{display:none !important}.progress-line{--color: var(--primary-color);--height: 5px;--border-radius: 6px;--thumb-size: 13px;border-radius:var(--border-radius);height:var(--height);position:relative;cursor:pointer}.progress-line:before{position:absolute;left:0;top:0;right:0;bottom:0;display:block;content:\" \";border-radius:inherit}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;width:100%;cursor:pointer;padding:0;margin:0;outline:none;caret-color:var(--color);position:absolute;top:-0.5rem;bottom:-0.5rem}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;width:0;height:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{content:\" \";display:block;height:var(--thumb-size);width:var(--thumb-size);border-radius:50%;background-color:var(--color);cursor:pointer;position:absolute;right:0;top:50%;transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translate(calc(var(--thumb-size) / 2), -50%) scale(1.25)}.progress-line__loaded,.progress-line:before{opacity:.3;background-color:#c4c9cc;background-color:var(--secondary-color)}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);position:absolute;top:0;bottom:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{width:100%;transform-origin:left center}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;color:none;border:none}input[type=range]::-ms-thumb{visibility:hidden}input[type=range]::-ms-tooltip{visibility:hidden}.left-controls,.right-controls{display:flex;align-items:center}.bottom-controls{padding:0 .625rem;height:2.25rem;display:flex;justify-content:space-between;align-items:center}@media only screen and (max-width: 600px){.bottom-controls{height:3.625rem}}.checkbox-field{--size: 1.25rem;margin:1.5rem 1.1875rem;display:block;text-align:left;position:relative;cursor:pointer;min-width:var(--size);min-height:var(--size)}body.animation-level-2 .checkbox-field{transition:.2s opacity}.checkbox-field.checkbox-disabled{pointer-events:none !important;opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width: 600px){.checkbox-field{margin-bottom:27px}}.checkbox-field .checkbox-box{position:absolute;left:0;top:50%;transform:translateY(-50%);width:var(--size);height:var(--size);border-radius:.25rem;overflow:hidden}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.checkbox-field .checkbox-box-check,.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border{position:absolute;top:0;left:0}.checkbox-field .checkbox-box-border{right:0;bottom:0;border-radius:inherit;border:2px solid #8d969c}.checkbox-field .checkbox-box-background{top:-15%;right:-15%;bottom:-15%;left:-15%;background-color:#3390ec;background-color:var(--primary-color);transform:scale(1);border-radius:50%;transition:transform .2s 0s ease-in-out}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none !important}.checkbox-field .checkbox-box-check{--offset: 3px;width:calc(var(--size) - var(--offset));height:calc(var(--size) - var(--offset));top:50%;left:50%;transform:translate(-50%, -50%)}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:2.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s .15s ease-in-out,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none !important}.checkbox-field .checkbox-caption{position:relative;padding-left:3.375rem;cursor:pointer;display:inline-block;min-height:24px;margin-top:1px;line-height:26px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:.2s opacity;color:inherit}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin-left:0;margin-right:0}.checkbox-field.hover-effect .checkbox-box{left:auto}.checkbox-ripple{overflow:hidden;border-radius:10px}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size: 1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{top:0;right:0;bottom:0;left:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset: calc(var(--size) - (var(--size) / 2 + .125rem))}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}.radio-field{--size: 1.375rem;position:relative;text-align:left;margin:1.25rem 0;line-height:1.3125;cursor:pointer}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main::before,.radio-field.hidden-widget .radio-field-main::after{visibility:hidden}.radio-field>input:checked~.radio-field-main::before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main::after{transform:translateY(-50%) scale(1)}.radio-field .radio-field-main{padding-left:3.5rem;position:relative;color:inherit}.radio-field .radio-field-main::before,.radio-field .radio-field-main::after{content:\"\";display:block;position:absolute;left:0;top:50%;width:var(--size);height:var(--size);transform:translateY(-50%)}.radio-field .radio-field-main::before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main::before{transition:border-color .1s ease,opacity .1s ease}.radio-field .radio-field-main::after{left:.3125rem;width:.75rem;height:.75rem;border-radius:50%;background:#3390ec;background:var(--primary-color);transform:translateY(-50%) scale(0);transform-origin:center}body.animation-level-2 .radio-field .radio-field-main::after{transition:transform .1s ease}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0;opacity:0;z-index:-1;z-index:var(--z-below);position:absolute}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;visibility:hidden;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transition:transform .2s .05s ease-in-out;transform:scale(0)}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none !important;transition:background-color .2s !important}.checkbox-field-restriction .checkbox-box-check use{visibility:visible !important;stroke-dasharray:24.19,24.19 !important;transform:rotate(0) translateY(0);transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out !important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{transform:rotate(45deg) translateY(-10px);stroke-dashoffset:35.5}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size: 20px;margin:0 .3125rem;padding:0;display:flex;align-items:center;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset: 3px;--toggle-width: 1.9375rem;width:var(--toggle-width);height:.875rem;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;position:relative;display:flex;align-items:center;margin:0 var(--offset)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{width:1.25rem;height:1.25rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);background-color:#fff;background-color:var(--surface-color);content:\" \";transform:translateX(calc(var(--offset) * -1));border-radius:50%;position:absolute}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width: 600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{width:100%;padding:1rem 0 .5rem;margin-bottom:17px}@media only screen and (max-width: 600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);padding:0 23px;padding-bottom:1rem;font-weight:500;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (max-width: 600px){.chatlist-container .search-group__name{padding:5px 9px 0 16px;font-size:15px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width: 600px){.chatlist-container .search-group-contacts{padding:0px 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0 5px !important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0px;padding:4px 0 0}.chatlist-container .search-super .search-group__name{padding-top:1rem;display:flex;justify-content:space-between}ul.chatlist{padding:0 .5rem}@media only screen and (max-width: 600px){ul.chatlist{padding:0}}.chatlist{margin:0;display:flex;flex-direction:column;position:relative;width:100%;background-color:#fff;background-color:var(--surface-color);-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.chatlist-chat{--background: unset;height:72px;border-radius:10px;display:flex;align-items:flex-start;flex-direction:row;position:relative;cursor:pointer;padding:.5625rem;overflow:hidden;background:var(--background)}@media only screen and (max-width: 600px){.chatlist-chat{border-radius:0}}html.no-touch .chatlist-chat:hover,html.no-touch .chatlist-chat:active{--background:var(--light-secondary-text-color)}.chatlist-chat.is-muted .user-title:after{flex:0 0 auto;content:\"\";color:#a2abb2;color:var(--chatlist-pinned-color);font-size:1.125rem;margin-left:.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{-webkit-animation:fade-in-backwards-opacity .2s ease-in-out forwards;animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat p{margin:0;display:flex;flex-direction:row;align-items:flex-start;height:27px}.chatlist-chat a{color:inherit}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat.menu-open{--background: var(--light-secondary-text-color)}@media only screen and (min-width: 601px){.chatlist-chat.active{--background: var(--primary-color) !important}.chatlist-chat.active .user-caption,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .message-status,.chatlist-chat.active .text-highlight{color:#fff}.chatlist-chat.active b{color:#fff !important}.chatlist-chat.active .user-title:after{color:rgba(255,255,255,.7)}.chatlist-chat.active .verified-background{fill:#fff !important}.chatlist-chat.active .verified-check{fill:#3390ec !important;fill:var(--primary-color) !important}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff !important;color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color: #fff}}.chatlist li span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:27px}.chatlist .peer-typing-container{--color: var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .dialog-title-details{font-size:.75rem;padding:1px 0px 0px 0px;flex:0 0 auto;margin-left:.5rem}.chatlist .dialog-subtitle{margin-top:-3px}.chatlist .dialog-subtitle-badge{display:block !important;margin-top:4px;margin-right:-3px;margin-left:.5rem;flex:0 0 auto}.chatlist .dialog-subtitle-media{width:1.25rem;height:1.25rem;position:relative;flex:0 0 auto;border-radius:.1875rem;margin-top:-0.1875rem;margin-right:.375rem;display:inline-block;vertical-align:middle}.chatlist .dialog-subtitle-media .tgico-play{position:absolute;z-index:1;color:#fff;left:50%;top:50%;transform:translate(-50%, -50%);line-height:1;font-size:.625rem}.chatlist .dialog-subtitle-media .media-photo{width:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;border-radius:inherit}.chatlist .dialog-group-call-icon{position:absolute;left:45px;top:45px;border:2px solid #fff;border:2px solid var(--surface-color);overflow:hidden;border-radius:50%;background-color:#0ac630;background-color:var(--avatar-online-color);width:20px;height:20px;z-index:2}body.animation-level-2 .chatlist .dialog-subtitle-badge,body.animation-level-2 .chatlist .dialog-group-call-icon{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating,body.animation-level-2 .chatlist .dialog-group-call-icon.animating{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards,body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{transition:none;transform:scale(0);opacity:1}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .2s cubic-bezier(.35,.35,.47,1),transform .2s cubic-bezier(.35,.35,.47,1);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .2s cubic-bezier(.35,.35,.7,1),transform .2s cubic-bezier(.35,.35,.7,1),opacity .2s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .user-caption{overflow:hidden;color:#707579;color:var(--secondary-text-color);flex:1 1 auto;padding:.0625rem .4375rem .0625rem .5625rem}.chatlist .dialog-avatar,.chatlist .user-caption{pointer-events:none;position:relative}.chatlist .user-title{display:flex !important;align-items:center}.chatlist .user-title img.emoji{vertical-align:top;margin-top:4px;width:18px;height:18px}.chatlist .user-last-message img.emoji{width:20px;height:20px;margin-top:-3px}.chatlist .user-title,.chatlist .user-last-message{flex-grow:1}.chatlist .user-title i,.chatlist .user-last-message i{font-style:normal}.chatlist .message-status{margin-right:.125rem;display:inline-block;vertical-align:middle;color:#0ac630;color:var(--chatlist-status-color);line-height:1;width:1.25rem;height:1.25rem;font-size:1.25rem;position:relative;margin-top:-0.0625rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{position:absolute;top:0;left:0}.chatlist .mention{padding:0;background-color:#0ac630 !important;background-color:var(--chatlist-status-color) !important}html.is-mac .chatlist .mention{line-height:22px !important}.chatlist .mention-badge{margin-right:-2px}.chatlist .unread,.chatlist .is-muted.backwards .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{padding-bottom:0;margin-bottom:0 !important}.chatlist-bottom .chatlist-new{padding:0}.chatlist-new .chatlist-chat{height:4.5rem;padding:0 .75rem;align-items:center}.chatlist-new .user-caption{padding-left:.75rem}.chatlist-new p{height:auto !important}.chatlist-new span{line-height:1.3125 !important;line-height:var(--line-height) !important}.chatlist-new .dialog-subtitle{margin-top:.125rem}.chatlist-new .user-last-message{font-size:.875rem}.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{padding:.75rem}@media only screen and (max-width: 600px){.contacts-container .chatlist-chat,.search-group-contacts .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.contacts-container .user-caption,.search-group-contacts .user-caption{padding:1px 3.5px 1px 13px}@media only screen and (max-width: 600px){.contacts-container .user-caption,.search-group-contacts .user-caption{padding:0 4px 0 14px}}.contacts-container .user-title,.contacts-container b,.contacts-container .user-last-message b,.search-group-contacts .user-title,.search-group-contacts b,.search-group-contacts .user-last-message b{font-weight:normal}.contacts-container p,.search-group-contacts p{height:24px}@media only screen and (max-width: 600px){.contacts-container p,.search-group-contacts p{height:26px}}.contacts-container span.user-last-message,.search-group-contacts span.user-last-message{font-size:14px}.chatlist-new.chatlist-48 .chatlist-chat{height:3.5rem}.chatlist-new.chatlist-48 .user-caption{padding-left:1.125rem}.chatlist-new.chatlist-48 .dialog-subtitle{margin-top:.0625rem}.chat-input{--translateY: 0;--padding-bottom: 0.5rem;--bottom: var(--padding-bottom);display:flex;width:100%;max-width:100%;padding-top:.25rem;flex-direction:column;flex:0 0 auto;position:relative;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translate3d(0, var(--translateY), 0)}body.animation-level-0 .chat-input{transition:none !important}@media only screen and (min-height: 570px)and (min-width: 601px){.chat-input{max-width:728px !important;max-width:var(--messages-container-width) !important}}@media only screen and (min-width: 601px){.chat-input{--padding-bottom: 1.25rem}}@media only screen and (max-height: 569px){.chat-input{--padding-bottom: 0.5rem}}@media only screen and (min-width: 1276px){.chat-input{width:calc(100% - var(--right-column-width)) !important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0) !important}}.chat-input.is-hidden{--translateY: 100%;transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, var(--translateY), 0) !important;position:absolute !important;bottom:0}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY: 0}.chat-input-container{--padding-horizontal: var(--chat-input-padding);display:flex;align-items:flex-end;justify-content:center;max-width:728px;max-width:var(--messages-container-width);margin:0 auto;width:100%;padding:0 var(--padding-horizontal);flex:0 0 auto;position:relative;padding-bottom:var(--bottom)}.chat-input-container .btn-circle{width:var(--chat-input-size);height:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{max-height:var(--chat-input-size);border-bottom-right-radius:12px}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{transform:scaleX(-1) translateX(1.125rem);opacity:0}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0 !important;opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius 0.1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity 0.1s .075s}.chat-input-container.is-centering.animating .btn-send{transition:.2s transform}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform 0.1s,opacity .025s .075s}.chat-input .menu-send{top:auto;bottom:calc(100% + .5rem)}.chat-input .input-message-input{background:none;border:none;width:100%;padding:.5rem .5625rem;margin-top:-1px;max-height:calc(30rem - 2.5rem);overflow-y:none;resize:none;border:none;outline:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height)}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height 0.1s}@media only screen and (max-height: 30rem){.chat-input .input-message-input{max-height:max(36px, calc(100vh - 10rem))}}@media only screen and (max-width: 600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{content:attr(data-inline-placeholder);color:#a2acb4;pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}html.is-ios .chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\" !important}.chat-input .btn-record-cancel{visibility:hidden;opacity:0;padding:0;z-index:3;position:absolute;right:0;top:0;transform:translateX(calc(-100% + var(--padding-horizontal) * -1 + -0.5rem))}.chat-input .btn-scheduled:after{content:\"\";position:absolute;top:5px;right:5px;width:.5rem;height:.5rem;border-radius:50%;background:#61c642;background:var(--message-checkbox-color)}.chat-input .btn-preloader .preloader{width:1.5rem;height:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{-webkit-animation:hide-icon .4s forwards ease-in-out !important;animation:hide-icon .4s forwards ease-in-out !important}.chat-input .float{align-self:center;display:none !important;margin:0 .75rem 0 0 !important}body.animation-level-2 .chat-input .float{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.chat-input .float{margin-right:.125rem !important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex !important}.chat-input .btn-send-container{position:absolute;right:var(--padding-horizontal);bottom:0;padding-bottom:inherit;display:flex;align-items:center;justify-content:center}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:.2s color,background-color .2s,.2s opacity}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-send{color:#707579;color:var(--secondary-text-color);z-index:3}.chat-input .btn-send .tgico-send{color:#3390ec !important;color:var(--primary-color) !important}.chat-input .btn-send .tgico-check{color:#3390ec !important;color:var(--primary-color) !important;height:32px !important;font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:bold}.chat-input .btn-send .tgico-schedule{background-color:#3390ec;background-color:var(--primary-color);color:#fff;border-radius:50%;width:34px;height:34px;display:flex;align-items:center;justify-content:center}.chat-input .btn-send.send .tgico-send,.chat-input .btn-send.record .tgico-microphone,.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.schedule .tgico-schedule{visibility:visible !important}.chat-input .btn-send:not(.record) .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}body.animation-level-2 .chat-input .btn-send.send .tgico-send,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone,body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem;background-color:#fff !important;background-color:var(--surface-color) !important}.chat-input .record-time{height:44px;line-height:44px;display:none}.chat-input .record-time:after{content:\" \";width:10px;height:10px;background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;margin:0 9px;display:inline-block}body.animation-level-2 .chat-input .record-time:after{-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.chat-input .record-ripple{border-radius:50%;background-color:rgba(0,0,0,.2);width:300px;height:300px;transform:scale(0);position:absolute;visibility:hidden}@media only screen and (max-width: 600px){.chat-input .record-ripple{width:240px;height:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-send,.chat-input.is-recording:not(.backwards) .btn-record-cancel{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - (var(--chat-input-size) * 2 + 1rem))}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility 0.1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s 0.1s,opacity 0.1s 0.1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}.chat-input:not(.is-recording) .btn-record-cancel{margin-right:0;width:0px}.chat-input .new-message-wrapper{opacity:1}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity 0.1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity 0.1s 0.1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity 0.1s 0s}@-webkit-keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}100%{opacity:1}}#column-center{width:100%;position:relative;flex:3}@media only screen and (max-width: 600px){body.is-left-column-shown #column-center{transform:translate3d(100vw, 0, 0)}body.is-right-column-shown #column-center{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-center{position:fixed !important;left:0;top:0;bottom:0;right:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem, 0, 0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex !important;width:100%;align-items:center;flex-direction:column;transition:transform .25s ease-in-out,filter .25s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body.animation-level-0 .chat{transition:none !important}.chat:not(.active):not(:last-child){filter:brightness(0.8)}@media only screen and (min-width: 926px){.chat:not(.active){transform:translate3d(calc((100vw - min(calc(100vw * .4), 420px)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(calc(100vw * .4), 420px)), 0, 0)}}@media only screen and (min-width: 1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width)) * -.25), 0, 0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)), 0, 0)}}@media only screen and (min-width: 1276px)and (max-width: 1680px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(75vw, 0, 0)}}@media only screen and (max-width: 925px){.chat:not(.active){transform:translate3d(-25vw, 0, 0)}.chat:not(.active):last-child{transform:translate3d(100vw, 0, 0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.chat-background{overflow:hidden;background-color:#e6ebee}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none !important}.chat-background,.chat-background-item{position:absolute !important;top:0;left:0;bottom:0;right:0}.chat-background-item{background-image:url(\"assets/img/bg.jpeg\");background-size:cover;background-position:center center;background-color:inherit}body.animation-level-2 .chat-background-item{transition:opacity .25s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-out);opacity:0}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in);opacity:1}@media only screen and (min-width: 1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem 0;transform:scale(1);transform-origin:left center;transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out) !important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(0.666666667);transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1) !important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in) !important}}.chat .drops-container{--padding: 20px;--pinned-floating-height: 0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width: 1276px){body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}}@media only screen and (max-width: 600px){.chat .drops-container{--padding: 10px}}.chat .drop{max-width:696px;--wrapper-padding: 15px}.chat.type-chat .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);display:flex;align-items:center;flex-direction:column;width:calc(100% - (var(--chat-input-size) + 0.5rem));max-width:calc(100% - (var(--chat-input-size) + 0.5rem));justify-content:center;border-radius:12px;min-height:var(--chat-input-size);max-height:30rem;flex:0 0 auto;position:relative;z-index:3}.chat-input-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;box-shadow:0px 1px 8px 1px rgba(0,0,0,.18);background-color:#fff;background-color:#fff;background-color:var(--surface-color);opacity:1}.chat-input-control{--padding-vertical: .3125rem;--padding-horizontal: var(--chat-input-inner-padding);--padding: var(--padding-vertical) var(--padding-horizontal);position:absolute;margin:0 auto;width:auto;height:var(--chat-input-size);padding:var(--padding);background-color:#fff;background-color:var(--surface-color);z-index:3;visibility:hidden}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;padding:0 .625rem;justify-content:center}@media only screen and (max-width: 600px){.chat-input-control-button{font-size:15px}}.chat-input-control-button::before{margin-right:10px}.selection-wrapper,.fake-selection-wrapper{position:absolute;top:0;width:28.75rem;max-width:calc(100% - (var(--chat-input-padding) * 2))}.selection-wrapper,.chat-input-control{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{display:flex;justify-content:space-between;height:100%;border-radius:inherit;padding:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:15px;display:flex;justify-content:space-between;align-items:center;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{display:flex;justify-content:space-between;align-items:center;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);font-weight:500;flex-grow:1;white-space:nowrap;text-transform:capitalize}.selection-wrapper .selection-container .btn-icon{margin:0 5px 0 6px;height:42px;width:42px;line-height:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width: 600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width: 380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}.selection-wrapper .selection-container-forward:before{margin-right:14px}.selection-wrapper .selection-container-delete{margin-right:.625rem;margin-left:.375rem}.selection-wrapper .selection-container-delete:before{margin-right:10px}.fake-wrapper{position:absolute;z-index:-1;visibility:hidden}.fake-rows-wrapper{left:var(--padding-horizontal);top:0;width:calc(100% - var(--chat-input-size) - (var(--padding-horizontal) * 2) - .5rem)}.rows-wrapper-wrapper{width:100%;display:flex}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s 0.15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity 0.1s .075s,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity 0.1s 0s,visibility 0s .2s}.rows-wrapper{transform:translateX(0) scaleX(1);border-bottom-right-radius:0}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width: 600px){.rows-wrapper{--padding-vertical: 1px}}@media only screen and (max-width: 420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height: 569px){.rows-wrapper{--padding-vertical: 1px}}.rows-wrapper .bubble-tail{position:absolute;bottom:-1px;right:-8.4px;width:11px;height:20px;fill:#fff;fill:var(--surface-color);transform:scaleX(-1)}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color);background-color:rgba(51, 144, 236, 0.08) !important;background-color:var(--light-primary-color) !important}.rows-wrapper .attach-file .btn-menu{right:calc(var(--padding-horizontal) * -1 - .125rem);bottom:calc(100% + 1.125rem)}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .attach-file .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .attach-file .btn-menu-item{padding:0 38px 0 16px}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{display:flex;justify-content:space-between;align-items:center;width:100%;position:relative;background-color:#fff;background-color:var(--surface-color);border-radius:.75rem;padding:var(--padding)}.rows-wrapper .reply-wrapper{justify-content:flex-start;height:0;width:calc(100% - var(--padding-horizontal) * 2);padding:0;margin-top:.5625rem;margin-bottom:-0.5625rem;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;opacity:0;pointer-events:none}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.rows-wrapper .reply-wrapper{margin-top:.3125rem;margin-bottom:-0.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{pointer-events:unset;height:36px;opacity:1}.rows-wrapper .reply-wrapper .reply{order:1;flex:1 1 auto;margin:0 .625rem}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}.rows-wrapper .reply-wrapper .btn-menu{top:auto;bottom:calc(100% + 1.0625rem);left:3.125rem;transform:scale(1) !important}.rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size: 1.5rem;order:0;margin:0 2rem 0 0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#3390ec;stroke:var(--primary-color)}@media only screen and (max-width: 600px){.rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal) * -1)}}.rows-wrapper .new-message-wrapper{align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .input-message-container{width:1%;max-height:inherit;flex:1 1 auto;position:relative;overflow:hidden;align-self:center;min-height:calc(var(--chat-input-size) - var(--padding-vertical) * 2);display:flex;align-items:center}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{flex:0 0 auto;font-size:24px;color:#707579;color:var(--secondary-text-color);margin:0 .125rem 5px;padding:0;width:34px;height:34px}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY: 0;width:100%;flex:1 1 auto;position:relative;transform:translate3d(0, var(--translateY), 0);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles{transition:none !important}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);--translateY: -78px}@media only screen and (max-width: 600px){.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY: -58px}}.chat.type-chat .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translateY(calc(var(--translateY) * -1))}.bubbles>.scrollable{height:auto;display:block}@media only screen and (min-width: 1276px){body.is-right-column-shown .bubbles{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(calc(var(--right-column-width) / -2), var(--translateY), 0)}}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:scale(1) translateX(2.5rem)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:opacity var(--layer-transition),visibility 0s 0s !important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY: calc(var(--chat-input-size) * -1 + -.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{width:100%;display:flex;flex-direction:column;margin:0 auto;min-height:100%;justify-content:flex-end;padding:0 .8125rem;max-width:728px;max-width:var(--messages-container-width);transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);transform:translateY(0)}body.animation-level-0 .bubbles-inner{transition:none !important}@media only screen and (min-width: 1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width: 600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}@media only screen and (max-width: 600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - calc((2.375rem + .5rem) * -1) * -1) !important;max-width:calc(100% - var(--message-beside-button-margin) * -1) !important}.bubbles-inner:not(.is-channel) .message,.bubbles-inner.is-chat .message{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999 !important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY) * -1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width: 1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden;transform:none !important;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention{--translateY: 0;cursor:default;opacity:0;visibility:hidden;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s .2s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s !important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible;transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1),visibility 0s 0s !important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s !important}.bubbles-corner-button{position:absolute;background-color:#fff;background-color:var(--surface-color);border-radius:50%;color:#707579;color:var(--secondary-text-color);font-size:1.5rem;display:flex;align-items:center;justify-content:center;right:var(--chat-input-padding);bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);z-index:2;overflow:visible}body.animation-level-0 .bubbles-corner-button{transition:none !important}.bubbles-corner-button .badge{position:absolute;top:-0.25rem;right:-0.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width: 600px){.bubbles-corner-button .badge{top:-0.75rem;right:.1875rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height: var(--topbar-call-height)}@media only screen and (min-width: 1276px){body.is-right-column-shown{--topbar-floating-scaleX: calc(1 - var(--right-column-proportion))}}.topbar{--topbar-height: 3.5rem;--pinned-floating-audio-height: 0px;--pinned-floating-message-height: 0px;--pinned-floating-height: calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height: 52px;--pinned-message-height: 52px;width:100%;z-index:1;min-height:var(--topbar-height) !important;max-height:var(--topbar-height) !important;margin-bottom:var(--pinned-floating-height);position:relative;cursor:pointer !important}.topbar:before{content:\" \";position:absolute;height:calc(var(--topbar-height) + var(--pinned-floating-height) - 0px);height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));top:0;right:0;left:0;box-shadow:0px 1px 5px -1px rgba(0,0,0,.21);pointer-events:none}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height: var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height: var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width: 601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width: 926px){.chat:first-child .topbar .sidebar-close-button{display:none}.chat:first-child .topbar .chat-info{padding-left:.1875rem}}@media only screen and (min-width: 1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{font-size:1rem;line-height:1.5rem;max-width:calc(100% - 1.5rem);display:flex;align-items:center}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .peer-title,.topbar .info{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{top:calc(100% + 7px);max-height:calc(100 * 1vh - 4.375rem);max-height:calc(100 * var(--vh) - 4.375rem)}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem);top:29px}}@media only screen and (max-width: 600px){.topbar .btn-menu-toggle{margin-left:0}}.topbar .chat-info{flex:1 1 auto;overflow:hidden;padding-left:49px;max-width:calc(100% - var(--utils-width))}@media only screen and (max-width: 600px){.topbar .chat-info{padding-left:52px}}@media only screen and (min-width: 1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{display:flex;align-items:center;justify-content:space-between;height:3.5rem;max-height:3.5rem;flex:1 1 auto}.topbar .chat-utils{display:flex;align-items:center;flex:0 0 auto}@media only screen and (min-width: 1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width: 600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}.topbar .chat-join{width:auto;height:2.25rem;font-weight:400;font-size:.875rem;margin-right:.5rem;padding:0 1.375rem}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}.topbar .content{flex:1 1 auto;padding-left:1.125rem;max-width:100%;overflow:hidden}.topbar .person{display:flex;align-items:center}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{font-size:.875rem;color:#707579;color:var(--secondary-text-color)}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height: 0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}.chat:not(.type-chat) .topbar .content{padding-left:16px}.topbar-call-container{height:3rem !important;height:var(--topbar-call-height) !important;min-height:auto !important;position:absolute;top:calc(3rem * -1);top:calc(var(--topbar-call-height) * -1);right:0;left:1px;color:#fff;z-index:2;cursor:pointer !important}body:not(.has-chat) .topbar-call-container{background:none !important}@media only screen and (max-width: 925px){.topbar-call-container{left:0}}.topbar-call-container .btn-icon{color:inherit;width:2.5rem;height:2.5rem;padding:0}.topbar-call-container .peer-title{font-weight:500;white-space:nowrap}@media only screen and (max-width: 480px){.topbar-call-container .topbar-call-left,.topbar-call-container .topbar-call-right{width:auto}.topbar-call-container .group-call-description,.topbar-call-container .call-description{display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{display:flex;align-items:center}.topbar-call-left .btn-icon{margin-right:.375rem}.topbar-call-left .call-description-duration{font-weight:500}.topbar-call-center{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}@media only screen and (min-width: 1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width) * -.5), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width: 1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width) * -1), 0, 0);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{position:absolute;top:0;right:0;bottom:-1.125rem;left:0;z-index:-1;transform:scale(1, -1);transform:scale(var(--topbar-floating-scaleX), -1);transform-origin:left center;pointer-events:none}@media only screen and (min-width: 1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{width:100%;height:100%}@-webkit-keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubble{position:relative;z-index:1;margin:0 auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);position:absolute;top:50%;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);transform:translateY(-50%);color:#fff;border-radius:50%;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);opacity:0;display:flex;align-items:center;justify-content:center;transform:translateY(-50%) scale(0.6);visibility:hidden}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem !important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{visibility:visible;transform:translateY(-50%) scale(1)}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{position:absolute;left:-50%;top:-0.125rem;bottom:-0.125rem;content:\" \";z-index:-1}.bubble.is-highlighted:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}@media only screen and (max-width: 600px){.bubble.is-first-unread{max-width:unset}}.bubble.is-first-unread:before{content:\"Unread messages\";height:30px;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;text-align:center;color:#3390ec;color:var(--primary-color);line-height:2.1;font-weight:500;font-size:15px;background-color:#fff;background-color:var(--surface-color);z-index:2;position:relative}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(0.125rem + 30px)}.bubble.is-selected:after{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{width:200%;display:block}.bubble.is-multiple-documents:before,.bubble.is-multiple-documents:after{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0 !important}.bubble-select-checkbox{z-index:3;position:absolute;left:0;display:flex;margin:0}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none !important}.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video,.bubbles.is-selecting .bubble a{pointer-events:none}.bubble-content{min-width:56px;max-width:100%;border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);position:relative;display:flex;flex-direction:column-reverse;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-color:var(--message-background-color)}body.animation-level-0 .bubble-content{transition:none}html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content,html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{margin:0 auto;max-width:100%;box-shadow:none}.bubble.is-date{position:sticky;top:.25rem;padding-bottom:.25rem;z-index:2;transition:opacity .3s ease;opacity:.99999;pointer-events:none}.bubble.is-date:before,.bubble.is-date:after{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat.type-chat .bubble.is-date .bubble-content,.chat.type-discussion .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubble-beside-button{position:absolute;right:calc((2.375rem + .5rem) * -1);right:var(--message-beside-button-margin);bottom:0;width:2.375rem;width:var(--message-beside-button-size);height:2.375rem;height:var(--message-beside-button-size);font-size:1.5rem;align-items:center;display:flex;justify-content:center;color:#fff;color:var(--badge-text-color);border-radius:50%;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color);cursor:pointer}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out}.bubble-view-button{border-radius:6px;border:1px solid #3390ec;border:1px solid var(--primary-color);height:2rem;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble:hover .bubble-beside-button,html.no-touch .bubble:active .bubble-beside-button{opacity:1}.bubble .forward svg{width:22px;height:22px}.bubble.is-group-last{margin-bottom:0.5rem}.bubble.is-group-last:after{bottom:-0.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-0.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-webkit-min-content;width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0 !important}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;width:18px;vertical-align:bottom}.bubble .thumbnail{position:absolute}.bubble.emoji-big{font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big:not(.sticker) .attachment{padding-top:.5rem;padding-bottom:1.5rem;max-height:-webkit-fit-content !important;max-height:-moz-fit-content !important;max-height:fit-content !important}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.chat:not(.no-forwards) .bubble.emoji-big:not(.sticker){cursor:text;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.bubble.emoji-big.sticker .bubble-content{max-width:140px !important;max-height:140px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.bubble.emoji-1x .attachment{font-size:96px}.bubble.emoji-1x .attachment img.emoji{height:64px;width:64px}.bubble.emoji-2x .attachment{font-size:64px}.bubble.emoji-2x .attachment img.emoji{height:48px;width:48px}.bubble.emoji-3x .attachment{font-size:52px}.bubble.emoji-3x .attachment img.emoji{height:32px;width:32px}.bubble.just-media .bubble-content{background:none !important;box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.bubble.sticker .attachment{border-radius:0;z-index:1}.bubble.sticker .bubble-content{max-width:200px !important;max-height:200px !important}.bubble.round .attachment{max-width:280px !important;max-width:var(--round-video-size) !important;max-height:280px !important;max-height:var(--round-video-size) !important;width:280px !important;width:var(--round-video-size) !important;height:280px !important;height:var(--round-video-size) !important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{max-width:100%;border-radius:inherit;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;justify-content:center;position:relative;cursor:pointer}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{position:absolute;left:0;top:0;height:100%;width:100%;cursor:pointer;display:flex;justify-content:center;align-items:center}.bubble .attachment .download span{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);font-size:23px;color:#fff;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{position:relative;margin:0 auto;z-index:1}.bubble .media-container-fitted{background-color:transparent !important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{-webkit-animation:thumbnail-fade-in-opacity .2s ease-in-out forwards;animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-width:min(420px, 100%);max-height:min(340px, 100%);width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-width:min(451px, 100%);max-height:none}.bubble .album-item{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);max-width:100%;cursor:pointer;position:absolute;overflow:hidden}body.animation-level-0 .bubble .album-item{transition:none !important}.bubble .album-item img,.bubble .album-item video{border-radius:inherit}.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none !important}.bubble .album-item .bubble-select-checkbox{bottom:auto !important;left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4, .0, .2, 1),border-radius .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transition:transform .3s cubic-bezier(.4, .0, .2, 1),border-radius .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in);transform:scale(0.883333)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:hover,html.no-touch .bubble a:active{text-decoration:underline}.bubble-first{order:-1;margin-top:.5rem;justify-content:center;align-items:center;max-width:100%}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column;align-items:flex-start !important;padding:.75rem 1rem .875rem !important}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-size:1rem !important}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{margin-right:.25rem;font-size:1.25rem;vertical-align:bottom;margin-left:-0.1875rem}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubble-first.empty-bubble-placeholder:not(:first-child:last-child) .bubble-content-wrapper{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0;pointer-events:none}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem !important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem !important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem !important;position:relative;width:200px;height:200px;cursor:pointer}.bubble-first .time{display:none !important}.bubble-first:before,.bubble-first:after{display:none}.bubble .web{margin:.125rem 0 -0.5625rem;max-width:100%;overflow:hidden;line-height:1.3125;line-height:var(--line-height)}.bubble .web .preview{max-width:min(420px, 100%);max-height:min(340px, 100%);border-radius:4px;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;position:relative;width:-webkit-max-content;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .webpage-name{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size);text-decoration:none}html.no-touch .bubble .web .webpage-name:hover,html.no-touch .bubble .web .webpage-name:active{text-decoration:underline}.bubble .web .text{word-break:break-word;margin-top:1px;font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble .web .quote{max-width:100%;overflow:hidden;width:100%;display:flex}.bubble .web .quote-text{width:100%;max-width:100%;padding-left:.625rem;margin-left:-0.625rem}.bubble .web .quote:before{flex:0 0 auto;width:.125rem;border-radius:.125rem;background-color:#3390ec;background-color:var(--primary-color);margin:.1875rem .5rem .125rem 0;content:\" \"}.bubble .web,.bubble .reply{font-size:calc(16px - 2px);font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{margin:0;width:3rem;height:3rem;float:right;margin-left:.625rem;margin-top:.1875rem}.bubble.is-square-photo .web .preview{max-width:min(3rem, 100%);max-height:min(3rem, 100%);margin:0}.bubble .reply{padding:.25rem;margin:0 .25rem .375rem .375rem;cursor:pointer;border-radius:.25rem;min-width:10rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{position:absolute;max-width:calc(100% - 1.25rem);height:auto;min-height:32px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.bubble .message+.reply{margin-bottom:0}.bubble.just-media .reply,.bubble.just-media .name{padding:10px;border-radius:12px;position:absolute;top:0;margin-bottom:0;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);white-space:nowrap;max-width:15rem}@media only screen and (max-width: 600px){.bubble.just-media .reply,.bubble.just-media .name{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff !important;padding:.3125rem .625rem;line-height:1.3125;line-height:var(--line-height)}.bubble.just-media .name .peer-title{font-weight:400 !important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width: 600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{margin-top:0;position:relative;max-width:none !important}.bubble.just-media .reply-title,.bubble.just-media .reply-subtitle,.bubble.just-media .reply i{color:#fff !important}.bubble.just-media .reply-border{background:#fff}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message{font-size:16px;font-size:var(--messages-text-size);padding:0 .5rem .375rem .625rem;max-width:100%;color:#000;color:var(--primary-text-color);line-height:1.3125;word-break:break-word;white-space:pre-wrap;position:relative}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width: 600px){.bubble .document-ico,.bubble .document-download,.bubble .audio-ico,.bubble .audio-download{height:2.25rem;width:2.25rem}}.bubble .audio .audio-title{font-weight:500}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width: 600px){.bubble .audio{height:2.375rem;padding-left:calc(2.375rem + .5625rem)}.bubble .audio .audio-details{margin-top:2px;margin-bottom:0}.bubble .audio .audio-subtitle{margin-top:-1px}.bubble .audio.corner-download .audio-download{margin:1.375rem 1.375rem 0}}.bubble .message.audio-message{width:335px;max-width:min(100%, 335px) !important}@media only screen and (max-width: 600px){.bubble .message.audio-message{width:280px;max-width:min(100%, 300px) !important}}.bubble .message.voice-message .document-message{max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px !important}.bubble .message.contact-message,.bubble .message.call-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{display:flex;padding:2px 0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{padding-left:12px;margin-top:8px;display:flex;flex-direction:column}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px !important}.bubble .message.document-message .document{padding-left:66px;height:58px}@media only screen and (max-width: 600px){.bubble .message.document-message .document{padding-left:44px;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0px 0px 0px}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;padding:.125rem 0;padding-left:2.5625rem;display:flex;flex-direction:column;justify-content:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble-call:before{position:absolute;left:.3125rem;font-size:1.5rem}.bubble-call-title{font-weight:500}.bubble-call-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex;align-items:center;margin-top:.0625rem;margin-left:-0.1875rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;transform:rotate(135deg);font-size:1rem}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document-container .time.tgico{position:relative !important;height:0px !important;visibility:hidden !important;float:none}.bubble .document-container .time.tgico .inner{visibility:hidden !important}.bubble.is-multiple-documents .message{padding:0 !important;border-radius:inherit}.bubble.is-multiple-documents .document-container{position:relative;border-radius:inherit}.bubble.is-multiple-documents .document-container .document-selection{position:absolute;top:0;bottom:0;z-index:-1;width:200vw;left:-75vw}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.06);border-radius:inherit}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before{-webkit-animation:bubbleSelected 2s linear;animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection,body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-wrapper:before{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{left:2rem;top:2rem;background:#fff;border-radius:50%}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size: 1.125rem;left:20px;top:25px}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size: .125rem;content:\" \";position:absolute;width:calc(var(--size) - (var(--inner-size) * 2));height:calc(var(--size) - (var(--inner-size) * 2));left:var(--inner-size);top:var(--inner-size);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-0.125rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{padding-top:.5rem;border-top-left-radius:inherit;border-top-right-radius:inherit}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-0.125rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{padding-bottom:.5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-0.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-0.25rem}.bubble.is-multiple-documents .document{height:54px !important}@media only screen and (max-width: 600px){.bubble.is-multiple-documents .document{height:38px !important}}.bubble.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color);padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{padding:0 0 .25rem 0;margin-top:-0.1875rem}.bubble .message.document-message .time,.bubble .message.audio-message .time,.bubble .message.voice-message .time,.bubble .message.poll-message .time,.bubble .message.contact-message .time{position:absolute;right:0;bottom:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{position:absolute;bottom:.1875rem;right:.1875rem;border-radius:.75rem;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0 .3125rem;z-index:2}.bubble.is-message-empty .message .time{margin-left:0;display:flex;align-items:center;padding:0;margin:0;white-space:nowrap;height:18px}.bubble.is-message-empty .message .time .inner{right:unset;bottom:unset;color:#fff;margin:inherit}.bubble.is-message-empty .message .time .inner:after{color:#fff}.bubble.is-message-empty.with-replies:not(.sticker) .message{bottom:55px}.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message,.bubble.is-message-empty.emoji-big .message{bottom:0}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble .time{visibility:hidden;font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:1;vertical-align:middle;pointer-events:none;display:inline-flex;z-index:1;height:12px;direction:ltr;float:right;cursor:pointer}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{margin-left:2px;pointer-events:none}.bubble .time i.edited{overflow:visible;font-size:inherit}.bubble .time .inner{pointer-events:all;position:absolute;bottom:0;right:0;display:flex;align-items:center;line-height:1;padding:inherit;white-space:nowrap;height:12px;visibility:visible}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble.webpage .time{float:none}.bubble .video-time,.bubble .video-play{pointer-events:none}.bubble .video-time{position:absolute;top:3px;left:3px;border-radius:12px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 6px;z-index:2;font-size:12px;color:#fff;display:flex;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:1.125rem;line-height:1}.bubble .video-time.can-autoplay:after{content:\"\";padding:0 1px 0 3px;font-size:1.25rem;color:#fff}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);color:#fff;text-align:center;font-size:2.125rem;display:flex;align-items:center;justify-content:center;z-index:1}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{padding:5px 9px 0 9px;font-weight:500 !important;color:#3390ec;color:var(--primary-color);font-size:.9rem;max-width:100%;overflow:hidden;text-overflow:ellipsis}.bubble:not(.webpage).photo .bubble-content>.name,.bubble:not(.webpage).video .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{position:absolute;width:11px;height:20px;z-index:-2;display:block;fill:#fff;fill:var(--message-background-color);transform:translateY(1px)}.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{cursor:pointer;border-radius:inherit}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.bubble .replies .rp{width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;border-radius:inherit;cursor:pointer}.bubble .replies-beside{flex-direction:column;width:36px;min-height:36px;height:auto;max-height:52px;bottom:47px;border-radius:2rem;right:-44px;padding:5.5px 0}.bubble .replies-beside .tgico-commentssticker{font-size:23px}.bubble .replies-beside-text{font-size:.75rem}.bubble .replies-footer{height:50px;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);position:relative;display:flex;align-items:center;padding:0 .5rem;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:#3390ec;color:var(--primary-color);min-width:15rem}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.4375rem}.bubble .replies-footer-text{font-weight:500;font-size:15px;margin-left:9px;display:flex;align-items:center;color:#3390ec;color:var(--primary-color)}.bubble .replies-footer-avatars{display:flex;flex-direction:row-reverse}.bubble .replies-footer-avatars avatar-element{width:34px;height:34px;border:2px solid #fff;border:2px solid var(--surface-color);cursor:pointer;z-index:0}.bubble .replies-footer-avatars avatar-element:not(:first-child){margin-right:-14px}.bubble .replies-footer .tgico-next{position:absolute;right:4px}.bubble .replies-footer.is-unread .replies-footer-text:after{content:\" \";background-color:#3390ec;background-color:var(--primary-color);width:.5rem;height:.5rem;margin-left:.75rem;border-radius:50%}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubbles-date-group:last-of-type .bubble:last-of-type{margin-bottom:.25rem}.bubble-content-wrapper{transform:scale(1) translateX(0);transform-origin:center;opacity:1}body.animation-level-2 .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4, .0, .2, 1),opacity .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)}.bubbles-inner.zoom-fading .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0);opacity:0}@media only screen and (min-width: 601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width: 600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble-content-wrapper>.user-avatar{position:absolute;margin-left:-45px;bottom:0;cursor:pointer}.bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transform:scale3d(1, 1, 1);transform-origin:bottom;transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.animation-level-0 .bubbles.is-selecting .bubble-content-wrapper>.user-avatar{transition:none}.bubbles.is-selecting:not(.backwards) .bubble-content-wrapper>.user-avatar{transform:scale3d(0.76, 0.76, 1);transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{color:#fff;background-color:hsla(85.5319, 36.9171%, 40.402%, .4);background-color:var(--message-highlightning-color);font-size:.9375rem;padding:.28125rem .625rem;line-height:1.25rem;border-radius:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center;text-align:center;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg a:hover,.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover{text-decoration:underline;cursor:pointer}.bubble.service .service-msg .peer-title{cursor:pointer}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 10px)}@media only screen and (max-width: 600px){.bubble.is-in.just-media .reply,.bubble.is-in.just-media .name{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .contact-number,.bubble.is-in .audio-time{color:#707579 !important;color:var(--secondary-text-color) !important}.bubble.is-out{flex-direction:row-reverse;--message-background-color: var(--message-out-background-color);--light-message-background-color: var(--light-message-out-background-color);--dark-message-background-color: var(--dark-message-out-background-color);--link-color: var(--message-out-link-color)}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width: 1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(calc((var(--chat-input-size) + 0.5rem) * -1))}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4, .0, .2, 1),opacity .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(0.8, 0.8, 1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .reply,.bubble.is-out.just-media .name{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out:not(.just-media) .reply-title,.bubble.is-out:not(.just-media) .reply i{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{padding-right:5px;margin-left:-4px}.bubble.is-out .time .inner{color:#4fae4e;color:var(--message-out-status-color);bottom:4px}.bubble.is-out .time:after,.bubble.is-out .time .inner:after{font-size:19px;margin-left:1px;line-height:16px;color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time:after,.bubble.is-out.is-read .time .inner:after{content:\"\"}.bubble.is-out.is-sent .time:after,.bubble.is-out.is-sent .time .inner:after{content:\"\"}.bubble.is-out.is-sending .time:after,.bubble.is-out.is-sending .time .inner:after{content:\"\"}.bubble.is-out .document-ico:after{border-top-color:#fff;border-top-color:var(--message-background-color);border-right-color:#fff;border-right-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e !important;fill:var(--message-out-primary-color) !important}.bubble.is-out .audio-time,.bubble.is-out .audio-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-toggle,.bubble.is-out .audio-download,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out .contact-number,.bubble.is-out .document-size,.bubble.is-out .bubble-call-subtitle{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color: var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color: var(--message-background-color)}.bubble.is-out .bubble-beside-button{right:auto;left:calc((2.375rem + .5rem) * -1);left:var(--message-beside-button-margin)}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-wrapper{background-color:#fff;background-color:var(--message-background-color)}.reply-markup{width:100%}.reply-markup-row{margin-top:.3125rem;overflow:hidden;min-height:2.5rem;display:flex}.reply-markup-row:last-child{border-bottom-left-radius:12px;border-bottom-right-radius:12px}.reply-markup-button{padding:.5625rem 0;border-radius:6px;z-index:2;font-size:.875rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;color:#fff !important;outline:none;border:none;width:100%;cursor:pointer;position:relative;overflow:hidden;background:hsla(85.5319, 36.9171%, 40.402%, .4);background:var(--message-highlightning-color)}.reply-markup-button.anchor-url{text-decoration:none !important}.reply-markup-button:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;opacity:0;z-index:-1;background-color:#fff}body.animation-level-2 .reply-markup-button:after{transition:opacity .35s ease}html.no-touch .reply-markup-button:hover:after,html.no-touch .reply-markup-button:active:after{opacity:0.08;opacity:var(--hover-alpha)}.reply-markup-button+.reply-markup-button{margin-left:.3125rem}.reply-markup-button.tgico:before,.reply-markup-button .forward-icon{position:absolute;right:.125rem;top:.125rem;display:block}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-switch-inline:before{content:\"\"}.pinned-message-border{position:relative;height:2rem;width:.125rem;flex:0 0 auto}.pinned-message-border-wrapper-1{position:relative;top:50%;transform:translateY(-50%);height:2rem;width:.125rem;border-radius:1px;background:#3390ec;background:var(--primary-color)}.pinned-message-border-mask{--mask-height: .375rem;--height: 2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:before,.pinned-message-border-mask:after{position:absolute;left:0;right:0;content:\" \";display:block;z-index:1;height:var(--mask-height);opacity:0}body.animation-level-2 .pinned-message-border-mask:before,body.animation-level-2 .pinned-message-border-mask:after{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{top:0;background:linear-gradient(#fff, transparent);background:linear-gradient(var(--surface-color), transparent)}.pinned-message-border-mask:after{bottom:0;background:linear-gradient(transparent, #fff);background:linear-gradient(transparent, var(--surface-color))}.pinned-message-border-mask.mask-top:before,.pinned-message-border-mask.mask-bottom:after{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{position:absolute;content:\" \";left:0;top:0;right:0;bottom:0;display:block;background:#3390ec;background:var(--primary-color);opacity:.4}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{position:absolute;left:0;top:0;width:2px;background:currentColor;border-radius:1px}body:not(.animation-level-0) .pinned-message-border-wrapper,body:not(.animation-level-0) .pinned-message-border-mark{will-change:transform;transition:transform .25s ease-in-out}.pinned-message-content{--height: 32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{cursor:pointer;display:flex;align-items:center;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pinned-message-content,.reply-content{flex-grow:1;flex-shrink:1;overflow:hidden;pointer-events:none;position:relative;margin-left:.5rem}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-title,.pinned-message-subtitle,.reply-title,.reply-subtitle{font-size:14px;line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-message-media,.reply-media{height:2rem !important;width:2rem !important;overflow:hidden;position:absolute;left:0;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.reply-media>img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.pinned-message i,.reply i{font-style:normal;color:#707579;color:var(--secondary-text-color)}.pinned-message img.emoji,.reply img.emoji{height:1rem;width:1rem;vertical-align:top}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{height:2rem;border-radius:1px;min-width:2px;background:#3390ec;background:var(--primary-color)}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0 !important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500}.pinned-container{--container-height: 3.25rem;display:flex;justify-content:space-between;align-items:center;flex:0 0 auto;overflow:visible;cursor:pointer}.pinned-container.is-floating{position:absolute !important;top:var(--topbar-height);right:0;left:0;margin:0;width:auto;height:var(--container-height);max-height:var(--container-height);background-color:#fff !important;background-color:var(--surface-color) !important}.pinned-container.is-floating .pinned-container-wrapper{order:0;padding:0 1rem;height:100%;border-radius:0;z-index:0;max-width:100%}@media only screen and (max-width: 600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width: 1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{content:\" \";border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);position:absolute;top:0;right:0;bottom:0;left:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;position:relative;pointer-events:none}.pinned-container .btn-icon{font-size:1.5rem;display:flex;justify-content:center;flex:0 0 auto}.pinned-container-wrapper{display:flex;flex:1 1 auto;overflow:hidden;align-items:center;padding:.25rem;border-radius:.25rem;order:1}.pinned-container-wrapper-utils{flex:0 0 auto;display:flex;align-items:center;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible !important}.pinned-message-media-container{width:2rem;height:2rem;position:absolute;margin-left:-0.25rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title,.pinned-message-subtitle{transform:translateX(0)}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-title,.pinned-message.is-media .pinned-message-subtitle{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height: var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-title,.pinned-message-content .pinned-message-subtitle{position:relative;height:calc(var(--height) / 2);min-height:calc(var(--height) / 2);overflow:visible}body.animation-level-2 .pinned-message-content .pinned-message-title,body.animation-level-2 .pinned-message-content .pinned-message-subtitle{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-top:-0.125rem;margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:.875rem;line-height:16px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){transform:scale(0.68);opacity:0}.pinned-message .animated-super-row{--translateY: 16px}.pinned-message .pinned-message-media{--translateY: 32px}.pinned-message.hide~.tgico-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message.is-many .pinned-message-close{display:none}.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist{display:none}.pinned-message.is-many.is-floating .pinned-message-close{display:none}.pinned-message:not(.is-many) .pinned-message-pinlist{display:none}.pinned-message-pinlist{order:2}.chat.type-discussion .pinned-message .pinned-container-close{display:none !important}.pinned-audio{--progress-height: .25rem}.pinned-audio.is-floating{--container-height: var(--pinned-audio-height)}.pinned-audio:not(.is-floating){padding-right:1.75rem;max-width:210px;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible !important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0 !important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-title,.pinned-audio-subtitle{font-size:.875rem;line-height:1.3125;line-height:var(--line-height);width:100%;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius: 0;--height: var(--progress-height);--translateY: .125rem;position:absolute;right:0;bottom:0;left:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width: 1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:hover,html.no-touch .pinned-audio-progress:active{--translateY: 0}.pinned-audio-progress .progress-line__filled:after{display:none !important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{position:absolute;height:.5rem;right:0;bottom:0;left:0;overflow:hidden}.pinned-audio-volume{align-items:center;position:relative;width:2.5rem;height:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{position:absolute;top:100%;left:0;right:0;bottom:-1rem;content:\" \"}.pinned-audio-volume .player-volume__icon{fill:#707579;fill:var(--secondary-text-color);width:inherit;height:inherit;cursor:pointer}.pinned-audio-volume.active .player-volume__icon{fill:#3390ec;fill:var(--primary-color)}.pinned-audio-volume .progress-line-container{position:absolute;top:100%;width:5rem;padding:.75rem 1rem;margin-top:2.25rem;transform:rotate(270deg);border-radius:10px;background-color:#fff;background-color:var(--surface-color);box-shadow:0px 1px 5px 0px rgba(0,0,0,.15);opacity:0;visibility:hidden;transition:opacity .2s ease-in-out,visibility 0s .2s}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none !important}.pinned-audio-volume:hover .progress-line-container,.pinned-audio-volume:active .progress-line-container{opacity:1;visibility:visible;transition:opacity .2s ease-in-out,visibility 0s 0s}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;transform:translateZ(0);opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1),transform .2s cubic-bezier(.4, .0, .2, 1),width .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);position:fixed;top:0;right:0;bottom:0;left:0;height:44px;width:218px;overflow:hidden;z-index:1;display:flex;justify-content:flex-start}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{position:absolute;left:0;top:0;display:flex;align-items:center;justify-content:flex-start;width:638px;height:100%;transform:translateX(0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:100%}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{display:flex;align-items:center;justify-content:space-between;padding:7px;flex:0 0 auto;max-width:100%}.markup-tooltip-tools:first-child{width:218px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{width:1px;height:25px;background-color:#dfe1e5;background-color:var(--border-color)}.markup-tooltip .btn-icon{border-radius:8px !important;width:30px;height:30px;padding:0}.markup-tooltip .btn-icon.active{color:#fff !important;background-color:#3390ec !important;background-color:var(--primary-color) !important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-218px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{display:flex;align-items:center;opacity:0;transition:opacity .2s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--layer-transition);pointer-events:none}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;text-overflow:ellipsis;margin:0 .5rem}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{position:relative;max-height:13.75rem;min-height:80px;min-height:var(--esg-sticker-size);padding:.4375rem}.stickers-helper-stickers{max-width:100%;border-radius:var(--border-radius)}html.no-touch .stickers-helper .super-sticker:not(.active):hover,html.no-touch .stickers-helper .super-sticker:not(.active):active{background:none}.emoji-helper{height:50px;padding:.25rem 0 !important}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:before,.emoji-helper .super-emojis:after{display:inline-block;content:\" \";width:.1875rem}html.no-touch .emoji-helper .super-emoji:not(.active):hover,html.no-touch .emoji-helper .super-emoji:not(.active):active{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec !important;background-color:var(--primary-color) !important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem, 100%)}.inline-helper .scrollable{position:relative;max-height:232px}.inline-helper-separator{height:1px;width:100%;margin-left:4rem;background-color:#dfe1e5;background-color:var(--border-color)}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:unset}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;padding:.5rem .5rem .5rem 4rem;line-height:1.3125;line-height:var(--line-height)}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{position:absolute;left:.5rem;width:3rem !important;height:3rem !important;overflow:hidden}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{color:#fff;text-transform:uppercase;font-size:1.75rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;display:flex;align-items:center;justify-content:center}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-video,.inline-helper .media-poster{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.inline-helper .gif{position:absolute;top:0;right:0;bottom:0;left:0;width:auto !important;height:auto !important}.inline-helper-results.is-gallery{max-width:100%;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill, minmax(80px, 1fr));grid-template-columns:repeat(auto-fill, minmax(var(--esg-sticker-size), 1fr));grid-gap:1px}.inline-helper-results.is-gallery .inline-helper-result{width:auto !important;height:auto !important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.inline-helper-result-description{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;text-overflow:ellipsis;overflow:hidden;white-space:pre-wrap}.chat-search{position:absolute !important;top:0;right:0;left:0;z-index:2}.chat-search-footer{height:46px;padding:0 8px;flex:0 0 auto;width:100%;background-color:#fff;background-color:var(--surface-color);display:flex;justify-content:space-between;align-items:center;box-shadow:0px -1px 5px -1px rgba(0,0,0,.21);overflow:hidden}.chat-search-footer .chat-search-count{margin-left:8px;color:#707579;color:var(--secondary-text-color)}.chat-search-footer+.chat-input{display:none}.chat-search-count:empty{display:none}.chat-search-count:not(:empty)+.btn-icon{display:none}.chat-search-controls{display:flex}.chat-search-results{width:100%;height:100%;max-height:100%;overflow:hidden;position:absolute;top:0;left:0;visibility:hidden;opacity:0;background-color:#fff;background-color:var(--surface-color);transition:.2s ease}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{--padding: 0px;position:absolute !important;z-index:3;top:var(--padding);right:var(--padding);bottom:var(--padding);left:var(--padding);display:flex;flex-direction:column;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:auto !important}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{-webkit-animation:fade-in-opacity .2s linear forwards;animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{-webkit-animation:fade-in-backwards-opacity .2s linear forwards;animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding: -4px;background-color:#fff;background-color:var(--surface-color);position:relative;border-radius:12px;width:100%;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;color:#a2acb4;transition:color .2s ease-in-out;pointer-events:all;flex:1 1 auto}.drop-outline-wrapper{position:absolute;top:var(--wrapper-padding);right:var(--wrapper-padding);bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;transition:stroke .2s ease-in-out;stroke-dashoffset:0}.drop.is-dragover .drop-outline-path{-webkit-animation:drop-outline-move .5s linear infinite;animation:drop-outline-move .5s linear infinite;stroke:#3390ec;stroke:var(--primary-color)}.drop-icon{font-size:6rem}.drop-header{font-weight:500;font-size:1.25rem}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height: 670px){.drop-icon{font-size:0}.drop-header{margin-top:0px}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@-webkit-keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}@keyframes drop-outline-move{0%{stroke-dashoffset:0}100%{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{width:auto;height:auto;display:block;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center}.crop-image{display:block;position:relative;pointer-events:none}.crop-component{position:relative;z-index:999;background-color:#fff;margin:0 auto;overflow:hidden}.crop-component>img{max-width:100%}.crop-overlay{position:absolute;z-index:999;overflow:hidden;box-sizing:content-box;border-radius:50%}html.no-touch .crop-overlay:hover,.crop-overlay:active{cursor:move}.crop-overlay-image{position:absolute;display:block}.crop-overlay-color{position:absolute;top:0;left:0;width:100%;height:100%;background-color:rgba(255,255,255,.7);border-radius:8px}.sidebar-header{background-color:#fff;background-color:var(--surface-color);display:flex;align-items:center;justify-content:space-between;padding:0 1rem;min-height:3.5rem;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width: 600px){.sidebar-header{padding:0 .5rem}}.sidebar-header__title{flex:1;font-weight:500;padding-left:1.5rem;font-size:1.25rem;color:#000;color:var(--primary-text-color)}.sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}.sidebar-header-right{flex:0 0 auto}.sidebar-close-button{overflow:inherit !important;width:2.5rem;height:2.5rem}.sidebar-content{width:100%;max-height:100%;height:100%;overflow:hidden;display:flex;position:relative;flex:1 1 auto}.profile-avatars-container{width:100%;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.no-touch .profile-avatars-container:hover .profile-avatars-arrow,html.no-touch .profile-avatars-container:active .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0 !important}.profile-avatars-avatars{width:100%;height:100%;display:flex;flex-wrap:nowrap;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;position:absolute}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0, 0)}.profile-avatars-avatars:before{content:\" \";top:0;right:0;bottom:0;left:0}.profile-avatars-avatar{width:inherit;height:inherit;min-width:100%;min-height:100%;display:flex;background-color:#000;position:relative}.profile-avatars-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none}.profile-avatars-gradient{position:absolute;left:0;right:0;bottom:0;height:80px;background:linear-gradient(360deg, rgba(0, 0, 0, 0.3) 8.98%, rgba(0, 0, 0, 0) 100%)}.profile-avatars-info{position:absolute;bottom:0;display:flex;flex-direction:column;align-items:flex-start;left:1.5rem;bottom:.5625rem;pointer-events:none}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0;text-align:left}.profile-avatars-info .peer-typing-container{--color: #fff}.profile-avatars-info .profile-name{margin-bottom:-1px}.profile-avatars-info .profile-subtitle{opacity:.7}.profile-avatars-info .online{color:inherit !important}.profile-avatars-tabs{display:flex;position:absolute;top:.5rem;left:.375rem;right:.375rem;height:.125rem;pointer-events:none}.profile-avatars-tab{flex:1 1 auto;border-radius:4px;margin:0 .125rem;background-color:#fff;opacity:.2;transition:opacity .2s ease-in-out;height:inherit}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{position:absolute;top:0;left:0;bottom:0;width:calc(100% / 3);opacity:0}.profile-avatars-arrow:before{position:absolute;top:50%;transform:translateY(-50%);font-size:2.1875rem;color:#fff;left:.625rem}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active{opacity:1 !important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{flex:0 0 auto;display:flex;flex-direction:column;position:relative;width:100%}.profile-content-wrapper{flex:1 1 auto;display:flex;flex-direction:column;padding-bottom:13px}@media only screen and (min-width: 601px){.profile-content-wrapper{padding-top:15px}}.profile-content .sidebar-left-section{position:relative;background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{text-align:center;font-size:1.25rem;line-height:1.3125;line-height:var(--line-height);font-weight:500;overflow:hidden;max-width:21.25rem;margin:0 auto;color:#000;color:var(--primary-text-color);display:flex;align-items:flex-end}.profile-name span.emoji{vertical-align:inherit;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content}.profile-name .peer-title{word-break:break-word;text-overflow:ellipsis;overflow:hidden}.profile-name .verified-icon{margin-bottom:3px}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-subtitle{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-bottom:.875rem;margin-top:1px}@media only screen and (max-width: 600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{margin:.5rem auto 10px;display:block}@media only screen and (max-width: 600px){.profile-avatar{margin:0 auto 10px;--size: 100px;--multiplier: .54}}.profile-name,.profile-subtitle,.profile-avatar{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size: 3.5rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{content:\" \";position:absolute;height:1px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;left:0;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size: var(--scrollable-size, 3.5rem);--padding-horizontal: 0px;width:100%;height:var(--size);display:flex;justify-content:space-around;flex-direction:row;position:relative;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#707579;color:var(--secondary-text-color);border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.menu-horizontal-div:not(.no-stripe):before,.menu-horizontal-div:not(.no-stripe):after{content:\" \";width:var(--padding-horizontal);flex:0 0 auto}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px}.menu-horizontal-div-item{height:100%;padding:0 1rem;cursor:pointer;text-align:center;flex:1 1 auto;font-size:1rem;font-weight:500;position:relative;transition:none !important;display:flex;align-items:center;justify-content:center;line-height:1.3125;line-height:var(--line-height);border-radius:0}html.no-touch .menu-horizontal-div-item:hover,html.no-touch .menu-horizontal-div-item:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}html.no-touch .menu-horizontal-div-item.active:hover,html.no-touch .menu-horizontal-div-item.active:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{position:relative;display:inline-flex;align-items:center;overflow:visible}.menu-horizontal-div i{position:absolute;bottom:calc(-.6875rem - 6px);left:0;opacity:0;background-color:#3390ec;background-color:var(--primary-color);height:.1875rem;width:100%;border-radius:.1875rem .1875rem 0 0;pointer-events:none;box-sizing:content-box;transform-origin:left;z-index:1}.menu-horizontal-div i.animate{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{min-width:100%;width:100%;display:grid;grid-template-columns:100%;grid-template-rows:100%}.tabs-container .tabs-tab{display:none;flex-direction:column;grid-row-start:1;grid-column-start:1;background-color:#f4f4f5;background-color:var(--background-color);overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none !important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .25s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4, .0, .2, 1),filter .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4, .0, .2, 1),filter .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex-direction:column;flex:1 1 auto;min-width:18rem;max-width:calc(1680px / 4)}@media only screen and (max-width: 600px){#column-left{width:100%;max-width:100%}body:not(.is-left-column-shown) #column-left{transform:translate3d(-25vw, 0, 0);filter:brightness(80%)}}@media only screen and (min-width: 601px){#column-left{overflow:visible}#column-left:after{position:absolute;content:\" \";display:block;height:100vh;width:1px;background-color:#dfe1e5;background-color:var(--border-color);right:-1px;top:0;z-index:2}}@media only screen and (min-width: 601px)and (max-width: 925px){#column-left{display:flex;position:fixed;left:0;top:0;width:26.5rem;transform:translate3d(-5rem, 0, 0);transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition);max-width:unset}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width: 926px){#column-left{display:flex}}@media only screen and (max-width: 1275px){#column-left{flex:2}}@media only screen and (min-width: 1681px){html.is-safari #column-left{max-width:calc(1680px / 4 - 1.25px)}}#column-left .item-main{--menu-size: 3.1875rem}#column-left .menu-horizontal-scrollable{--scrollable-size: var(--menu-size);z-index:1;background-color:#fff;background-color:var(--surface-color);position:relative;top:unset}@media only screen and (max-width: 600px){#column-left .menu-horizontal-scrollable{box-shadow:0px 1px 5px -1px rgba(0,0,0,.16)}}#column-left .menu-horizontal-scrollable .scrollable{position:relative}#column-left .menu-horizontal-scrollable .badge{margin-left:5px}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--menu-size));position:relative}#column-left .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .menu-horizontal-div{position:relative !important;justify-content:flex-start;z-index:0;padding:0 0 5px;--padding-horizontal: .6875rem}@media only screen and (max-width: 600px){#column-left .menu-horizontal-div{--padding-horizontal: .1875rem}}#column-left .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .menu-horizontal-div__stripe{display:none}#column-left .item-main .input-search .selector-user{height:30px;position:absolute !important;left:6px;top:6px;z-index:1;margin-left:0;line-height:1.875rem}#column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block !important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}#column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}#column-left .item-main .search-helper{display:flex;margin-left:28px}@media only screen and (max-width: 600px){#column-left .item-main .search-helper{margin-left:20px}}#column-left .item-main .search-helper .selector-user{margin-top:7px;font-size:14px}html.no-touch #column-left .item-main .search-helper .selector-user:hover,html.no-touch #column-left .item-main .search-helper .selector-user:active{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none !important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto;position:relative !important}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto !important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%, -50%)}#column-left #chatlist-container{max-height:100%;position:relative;background-color:#fff;background-color:var(--surface-color)}#column-left #chatlist-container.has-filters .connection-status-bottom{--offset-top: -3px;height:calc(100% + var(--offset-top) * -1)}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{position:relative;width:2.5rem;height:2.5rem;flex:0 0 auto;display:flex;align-items:center;justify-content:center}#column-left .sidebar-header__btn-container>.btn-icon{visibility:hidden;opacity:0;position:absolute;top:0;right:0;bottom:0;left:0;transition:.2s opacity,.15s background-color;z-index:2;margin:0}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon,body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width: 600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-0.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{width:300px;max-height:calc(100 * 1vh - 3.75rem);max-height:calc(100 * var(--vh) - 3.75rem)}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end;margin-left:.625rem}@media only screen and (max-width: 600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}#column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:1rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;padding-left:4px;margin-top:-1px;padding-bottom:1px}#column-left .search-group-people .chatlist-chat{height:98px;border-radius:10px;max-width:78px;width:78px;align-items:center;display:flex;flex-direction:column;padding:12px 0 0 !important;margin:0 5px 0 0;flex:0 0 auto}@media only screen and (max-width: 600px){#column-left .search-group-people .chatlist-chat{width:77px;max-width:77px}}#column-left .search-group-people .dialog-title-details,#column-left .search-group-people .dialog-subtitle{display:none}#column-left .search-group-people .user-caption{max-width:65px;padding:2px 0px 9px;font-size:12px}@media only screen and (max-width: 600px){#column-left .search-group-people .user-caption{max-width:56px}}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width: 600px){#column-left .search-group-people .search-group-scrollable{margin-left:-7px;margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{overflow:visible;justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{visibility:visible !important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close{-webkit-animation:grow-icon .4s forwards ease-in-out !important;animation:grow-icon .4s forwards ease-in-out !important}@media only screen and (max-width: 600px){#column-left .item-main .sidebar-content .btn-corner{--size: 54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{width:100%;padding:0 .5rem .5rem;overflow:hidden;flex:0 0 auto}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4, .0, .2, 1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}#column-left .connection-status-button{color:#2e3939;align-self:center;cursor:default;padding-left:4.5rem;text-align:left;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{cursor:pointer;text-decoration:underline;color:inherit}#column-left .connection-status-button .preloader-container{right:auto;left:1rem;width:1.5rem;height:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top: 0px;position:absolute;left:0;top:0;bottom:0;right:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);transform:translateY(var(--offset-top));height:100%}#column-left .input-wrapper{width:420px;margin:0 auto;flex:0 0 auto;padding:0 .75rem;max-width:100%;margin:.75rem 0}@media only screen and (max-width: 600px){#column-left .input-wrapper{width:100%;padding:0 .25rem}}#search-container{display:flex;top:-3px !important}#search-container .scrollable-y{position:relative;flex:1 1 auto}.new-channel-container .sidebar-content,.new-group-container .sidebar-content,.edit-profile-container .sidebar-content{flex-direction:column}.new-channel-container .chatlist-container,.new-group-container .chatlist-container,.edit-profile-container .chatlist-container{flex:1 1 auto}.new-channel-container .caption,.new-group-container .caption,.edit-profile-container .caption{font-size:.875rem;margin-top:14px;margin-left:23px;color:#707579;color:var(--secondary-text-color);padding-right:24px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}@media only screen and (max-width: 600px){.settings-container .profile-button{border-radius:0}}.settings-container .profile-buttons{margin-top:1.1875rem;width:100%;padding:0 .4375rem}@media only screen and (max-width: 600px){.settings-container .profile-buttons{margin-top:.6875rem;padding:0}}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{text-align:center;color:#707579;color:var(--secondary-text-color);font-size:14px;line-height:1.3125;line-height:var(--line-height);max-width:20rem;margin:0 auto}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.chat-folders-container .row .btn-primary{height:30px;padding:0 12px;font-size:15px;width:auto;transition:width .2s;margin:0;position:absolute;right:1rem;top:50%;transform:translateY(-50%);border-radius:15px}body.animation-level-0 .chat-folders-container .row .btn-primary{transition:none}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width: 600px){.edit-folder-container .input-wrapper{width:100%;padding:0 16px}}.edit-folder-container .sidebar-left-section{padding-bottom:0rem}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-list .chatlist-chat{padding:9px 12px;height:50px}.folder-list .user-caption{padding:3px 28px 6px 27px}.folder-list p span{font-weight:normal}.folder-categories .checkbox-field{position:absolute;right:1.125rem !important}.folder-category-button{height:50px}.popup-forward .selector .chatlist-chat,.included-chatlist-container .selector .chatlist-chat{padding:7px .75rem !important;height:3.75rem}.popup-forward .selector .chatlist .user-caption,.included-chatlist-container .selector .chatlist .user-caption{padding:0px 0px 0 14px;margin-top:-2px}.popup-forward .selector .chatlist .user-last-message,.included-chatlist-container .selector .chatlist .user-last-message{font-size:15px;margin-top:2px}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}.included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}.search-group-recent .search-group__name{display:flex;justify-content:space-between;align-items:center}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width: 600px){.search-group-recent .chatlist-chat{height:62px;padding-top:7px;padding-bottom:7px}.search-group-recent .user-caption{margin-top:-2px}.search-group-recent .user-title{font-weight:500 !important}.search-group-recent .dialog-avatar{--size: 46px;--multiplier: 1.173913}}@media only screen and (max-width: 600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width: 601px){.search-group-recent.search-group.search-group-contacts{padding:0px 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0 !important;box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}@media only screen and (max-width: 600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width: 601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}.sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}@media only screen and (max-width: 600px){.sidebar-left-section-content>.checkbox-ripple,.sidebar-left-section-content>.btn-primary{border-radius:0}}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width: 600px){.sidebar-left-section-name{padding:.5rem 1rem;font-size:.875rem}}.sidebar-left-section-caption{margin-top:1rem;font-size:1rem;color:#707579;color:var(--secondary-text-color);line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width: 600px){.sidebar-left-section-caption{margin:.5rem;font-size:.875rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none !important;opacity:.25}.sidebar-left-section .media-sticker-wrapper{width:86px;height:86px;margin:1px auto 29px;flex:0 0 auto;position:relative}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,.add-members-container,.settings-container,#search-private-container,#stickers-container,#poll-results-container,#search-gifs-container{background-color:#fff !important;background-color:var(--surface-color) !important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff !important;background-color:var(--surface-color) !important}.two-step-verification .sidebar-left-section{box-shadow:none !important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{text-align:center;max-width:342px;margin-left:auto;margin-right:auto;margin-bottom:1.125rem}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem !important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{width:168px;height:168px;margin:.625rem auto 1.1875rem}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{margin:1.125rem auto 1.8125rem;width:157px;height:157px}.two-step-verification-hint .media-sticker-wrapper{width:160px;height:160px;margin:.5rem auto 2.25rem}.two-step-verification-email .media-sticker-wrapper{width:160px;height:160px;margin:.5625rem auto 2.1875rem}.two-step-verification-set .media-sticker-wrapper{width:160px;height:160px;margin:1rem auto 1.3125rem}.two-step-verification-set .media-sticker-wrapper .rlottie,.two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width: 601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row{margin-top:0;padding-top:1rem;padding-bottom:.9375rem}.active-sessions-container .row-title-row{align-items:flex-end}.active-sessions-container .row-title:first-child{font-weight:500}.active-sessions-container .row-title-right{font-size:.75rem;color:#707579;color:var(--secondary-text-color);line-height:1.5}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500}.blocked-users-container .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}.blocked-users-container .user-caption{padding-left:.75rem}.blocked-users-container .dialog-subtitle{margin-top:-0.375rem;font-size:.875rem}.blocked-users-container ul{margin-top:.3125rem}@media only screen and (min-width: 601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height: 2px;--color: var(--primary-color);--border-radius: 4px;--thumb-size: 12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{content:\" \";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:3px solid #3390ec;border:3px solid var(--primary-color);opacity:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(0.91)}.background-container .grid-item-media{transition:transform .2s ease-in-out;transform:scale(1)}.background-container .grid .media-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.background-container .grid .preloader-container{z-index:1}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{top:40%;transform:translateY(-50%);text-align:center;line-height:1.3125;line-height:var(--line-height);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:21rem !important;margin:0 auto;padding:0 1rem;position:relative}.empty-placeholder .media-sticker-wrapper{width:128px;height:128px;margin:0 auto 1.9375rem;position:relative}.empty-placeholder-header{font-size:1.25rem;font-weight:500}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}.empty-placeholder .btn-control:before{margin-right:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}#column-right{position:relative;overflow:unset}@media only screen and (min-width: 601px)and (max-width: 1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width: 600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw, 0, 0)}}@media only screen and (min-width: 601px){#column-right{width:calc(var(--right-column-width));transition:transform .25s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-out);position:absolute;right:0;z-index:3;transform:translate3d(var(--right-column-width), 0, 0)}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in);transform:translate3d(0, 0, 0)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width: 1276px){#column-right{width:calc(var(--right-column-width) + 1px);transform:translate3d(calc(var(--right-column-width) + 1px), 0, 0);border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width: 601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{position:relative;flex:1 1 auto}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{width:100%;max-width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0px;perspective-origin:left top}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .search-super{top:100%;min-height:calc((1vh * 100) - 56px);min-height:calc((var(--vh, 1vh) * 100) - 56px)}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{display:flex;align-items:center}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width: 600px){.shared-media-container .btn-corner{width:54px;height:54px;bottom:14px;right:14px;position:fixed !important;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{width:100%;max-width:100%;position:absolute;min-height:100%;display:flex;flex-direction:column;background-color:#fff;background-color:var(--surface-color)}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);padding:24px 0px 0px 24px;font-weight:500;color:#707579;color:var(--secondary-text-color)}@media only screen and (max-width: 600px){.search-super .search-super-month-name{padding:18px 0px 0px 16px}}.search-super.sliding{max-height:none !important}.search-super-tabs{width:auto;flex:1 1 auto;padding:.25rem 0;--padding-horizontal: .25rem}.search-super-tabs-scrollable{box-shadow:none !important;position:sticky !important;top:0px;z-index:2;background-color:#fff;background-color:var(--surface-color)}.search-super-tabs-scrollable:before{position:absolute;width:100%;height:1px;left:0;top:0;background-color:inherit;display:block;content:\" \";z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{position:relative;display:flex}.search-super-tabs-container{min-height:calc(100% - 49px);grid-template-rows:100%;flex:1 1 auto}.search-super-tabs-container>div{position:relative;min-height:150px;background-color:#fff !important;background-color:var(--surface-color) !important}.search-super-tabs-container>div>div:first-child{transform:translateY(0);min-height:calc(100vh - 111px)}.search-super-tabs-container .preloader{padding:0;position:absolute !important;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .document-name,.search-super .audio-title,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{flex:0 0 auto;margin-left:8px;margin-top:3px;font-size:12px;color:#707579;color:var(--secondary-text-color)}.search-super-content-media .search-super-month-name{border:none;padding:9px 0px 7px 24px}.search-super-content-media .video-time{position:absolute;left:5px;top:4px;height:18px;border-radius:4px;background-color:rgba(0, 0, 0, .35);background-color:var(--message-time-background);padding:0px 6px 0px 5px;z-index:1;font-size:12px;color:#fff;line-height:18px}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0px 0px 3px 0px rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute;z-index:2;margin:0}.search-super .document .checkbox-field,.search-super .audio .checkbox-field{top:50%;left:0;margin-left:2rem;margin-top:1rem;transform:translateY(-50%)}.search-super-content-media .search-super-month-items{width:100%;padding-top:1px;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:1px}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width: 600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{padding-left:60px;height:calc(48px + 1.5rem)}.search-super-content-files .document-ico,.search-super-content-files .document-download{width:48px;height:48px;border-radius:5px !important}.search-super-content-files .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis}.search-super-content-links .search-super-item{display:flex;flex-direction:column;padding-left:4.4375rem;position:relative;overflow:hidden;min-height:4.375rem;cursor:pointer;justify-content:flex-start}.search-super-content-links .row-media{height:3rem;width:3rem;border-radius:.375rem;overflow:hidden;position:absolute;left:.6875rem}.search-super-content-links .row-media.empty{display:flex;align-items:center;justify-content:center;font-size:2rem;color:#fff;text-transform:uppercase;background-color:#3390ec;background-color:var(--primary-color)}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:unset}.search-super-content-links .anchor-url:last-child:before{position:absolute;top:0;right:0;bottom:0;left:0;content:\" \";cursor:pointer;z-index:1}.search-super-content-links .media-photo{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;border-radius:inherit}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;white-space:pre-wrap;text-overflow:ellipsis;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{padding:0 !important;margin:2rem 0 0 -1.75rem !important}@media only screen and (min-width: 601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width: 600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 20px}@media only screen and (max-width: 600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0px 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:unset;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-top:.5rem;padding-bottom:.5rem}.search-super-content-members .chatlist .chatlist-chat{padding:.75rem}.search-super-content-members .chatlist .user-caption{padding-left:.75rem}.search-super-content-members .chatlist .dialog-subtitle{font-size:.875rem;margin-top:-0.375rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent !important}.search-super-selection-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem;opacity:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width: 600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{flex-grow:1;font-weight:500;color:#000;color:var(--primary-text-color);white-space:nowrap;text-transform:capitalize;margin-left:1.5rem}#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before{display:none}#search-container .search-group.is-short li:nth-child(n+4){display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{display:flex;flex-direction:column;height:140px;cursor:pointer}#stickers-container .sticker-set-name{font-weight:500}#stickers-container .sticker-set-count{font-size:14px;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-header{display:flex;padding-left:16px;padding-bottom:12px;justify-content:space-between}#stickers-container .sticker-set-button{height:30px;padding-left:12px;padding-right:13px;margin-right:16px;font-size:15px;border-radius:16px;font-weight:400;width:auto;transition:width .2s}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{width:68px;height:68px;position:relative}#stickers-container .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}#stickers-container .sticker-set-sticker img{max-width:100%;max-height:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);padding:0 16px 8px 16px;margin:0;font-weight:500;justify-content:space-between;display:flex;font-size:15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-width: 601px){#poll-results-container .poll-results-answer{padding:0 24px 8px 24px}}#poll-results-container .poll-results-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){#poll-results-container .poll-results-more{padding-left:8px}}#poll-results-container .poll-results-more .tgico-down{float:left;padding-right:32px;padding-left:16.5px;font-size:24px;color:#707579;color:var(--secondary-text-color)}#poll-results-container .poll-results h3{padding:0 16px;margin-top:15px;font-size:20px;margin-bottom:16px}@media only screen and (min-width: 601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}#poll-results-container .poll-results .user-caption{padding:3px 28px 6px}#poll-results-container .poll-results .user-title{font-weight:normal}#poll-results-container .poll-results .chatlist-chat{height:50px;padding:9px}@media only screen and (min-width: 601px){#poll-results-container .poll-results .chatlist-chat{padding:9px 12px}}#search-gifs-container .gifs-masonry{margin-top:-2.5px}.edit-peer-container .input-wrapper{padding:0 .75rem;margin-bottom:.5625rem}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem;padding-bottom:1rem}.edit-contact-container .avatar-placeholder{filter:none !important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem !important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem}.media-viewer{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.88);display:flex;align-items:center;justify-content:center}@media only screen and (max-width: 600px){.media-viewer{background:#000}}.media-viewer-author{height:100%;cursor:pointer;display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width: 600px){.media-viewer-userpic{display:none}}.media-viewer-name{line-height:1.3125;line-height:var(--line-height);font-weight:500;margin:.0625rem 0}@media only screen and (min-width: 601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{line-height:1.3125;line-height:var(--line-height);font-size:.875rem}.media-viewer-buttons{position:absolute;top:0;right:0;display:flex;flex-flow:row nowrap;padding:.5rem .75rem}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:hover,html.no-touch .media-viewer-buttons .btn-icon:active{color:#fff}@media only screen and (max-width: 600px){.media-viewer-buttons{display:none}}.media-viewer-content{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;position:relative;max-width:100%;max-height:100%;overflow:hidden;flex:1 1 auto;display:flex;align-items:center}.media-viewer-media{visibility:hidden}.media-viewer-caption{position:absolute;text-align:center;color:#fff;word-break:break-word;overflow:hidden;text-overflow:ellipsis;z-index:4;bottom:0;left:0;right:0;padding:.5rem .5rem 0;opacity:0;line-height:1.3125;line-height:var(--line-height);white-space:pre-wrap;background-color:transparent}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4, .0, .2, 1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9 !important}.media-viewer-caption .scrollable{padding:.5rem .875rem;max-height:6rem;max-width:50rem;height:6rem;position:relative;margin:0 auto}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width: 600px){.media-viewer-caption{width:100%;transform:translateZ(0);text-align:unset;bottom:1.0625rem}.media-viewer-caption .scrollable{padding:0 .5rem;height:auto}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0, -69px, 0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:hover,html.no-touch .media-viewer-caption:active{background-color:#000;opacity:1 !important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1 !important}.media-viewer-switcher{position:absolute;left:0;top:3.75rem;width:7rem;height:calc(100% - 7.5rem);cursor:pointer;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width: 600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-prev-button,.media-viewer-next-button{cursor:pointer;position:absolute;color:#fff;font-size:2rem;left:1rem;top:50%;transform:translateY(-50%) rotate(90deg);opacity:0;transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width: 601px){.media-viewer-prev-button,.media-viewer-next-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width: 601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{position:fixed !important;display:flex;justify-content:center;align-items:center;min-height:auto !important;left:0;top:0;transform-origin:top left;overflow:hidden;transform:translateZ(0) scale3d(1, 1, 1);border-radius:0}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}@media only screen and (max-width: 600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{width:100%;height:100%;position:absolute;left:0;top:0}.media-viewer-mover>svg{width:100%;height:100%}.media-viewer-mover img,.media-viewer-mover video{width:100%;height:100%;max-width:100%;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-o-object-fit:cover;object-fit:cover;opacity:1;transition:var(--open-duration) opacity;position:absolute}.media-viewer-mover svg img,.media-viewer-mover svg video{position:unset}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration) / 8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none !important}.media-viewer-mover.center{left:50% !important;top:50% !important;transform:translate3d(-50%, -50%, 0) !important;max-width:100vw;max-height:calc((1vh * 100) - 15rem);max-height:calc((var(--vh, 1vh) * 100) - 15rem)}@media only screen and (max-width: 600px){.media-viewer-mover.center{width:100% !important;height:100% !important;max-width:100vw !important;max-height:calc((1vh * 100) - 120px);max-height:calc((var(--vh, 1vh) * 100) - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{width:auto;-o-object-fit:contain;object-fit:contain}.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{position:absolute;top:0;left:0;right:0;height:3.5rem;display:flex;align-items:center;justify-content:space-between;z-index:5;padding:0 1.25rem}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active{opacity:1}.media-viewer-topbar-left{display:flex;align-items:center}@media only screen and (max-width: 600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{width:100%;height:100%;transform:scale3d(1, 1, 1);position:absolute;border-radius:0;display:flex;align-items:center;justify-content:center}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{--open-duration: .2s;--move-duration: .35s;top:0;left:0;width:100%;height:100%;position:fixed !important;display:block;z-index:4;visibility:hidden;transition:visibility 0s var(--open-duration)}body.animation-level-0 .media-viewer-whole{--open-duration: 0s;--move-duration: 0s}.media-viewer-whole.active{visibility:visible;transition-delay:0s}.media-viewer-whole.active .overlays,.media-viewer-whole.active .media-viewer-appear{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .overlays,body.animation-level-2 .media-viewer-whole.active .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width: 600px){.media-viewer-whole .btn-menu-toggle{color:rgba(255,255,255,.4);opacity:1}.media-viewer-whole .btn-menu-toggle.menu-open{color:#fff;background-color:rgba(112,117,121,.2) !important}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.media-viewer-movers{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{width:17.125rem;height:3.375rem;background-color:rgba(0,0,0,.4);border-radius:12px;padding:.5rem;opacity:1;display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.25rem;left:50%;transform:translateX(-50%);z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{pointer-events:none;opacity:.4}.zoom-container .progress-line{--color: #fff;--height: 2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.zoom-container:not(.is-visible),.media-viewer-whole:not(.active) .zoom-container{opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0 !important;pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0 !important}.overlays{top:0;left:0;width:100%;height:100%;position:fixed !important;background-color:rgba(0,0,0,.2);z-index:4;opacity:0;visibility:hidden;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.emoji-dropdown{display:flex;flex-direction:column;width:100%;height:min(282px, calc(1vh * 100 - 135px));height:min(282px, calc(var(--vh) * 100 - 135px));background:#fff;background:var(--surface-color);overflow:hidden;flex:1 1 auto;max-height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media only screen and (min-height: 570px)and (min-width: 601px){.emoji-dropdown{position:absolute !important;left:.8125rem;bottom:5.125rem;width:26.25rem !important;height:26.25rem;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:0 100%}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{width:100%;max-width:100%;overflow:hidden;height:100%}.emoji-dropdown .emoji-tabs{justify-content:center;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.emoji-dropdown .emoji-tabs-search{position:absolute;left:0;margin-left:4px !important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0;margin-right:4px !important}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .tabs-container .category-title{top:0;font-size:14px;font-weight:500;color:#707579;color:var(--secondary-text-color);z-index:2;padding:12px 6px 6px 6px;width:100%}.emoji-dropdown .tabs-container .sticky_sentinel--top{top:0;height:1px}.emoji-dropdown .tabs-container .tabs-tab{min-height:100%;flex-direction:column;height:100%}.emoji-dropdown .tabs-container .emoticons-content{flex:1;padding:0;position:relative;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .tabs-container .scrollable{padding:0 10px}@media only screen and (max-width: 600px){.emoji-dropdown .emoji-padding.active .menu-horizontal-div .menu-horizontal-div-item{flex:unset;padding:0}.emoji-dropdown .emoji-padding.active .category-items{grid-template-columns:repeat(auto-fill, 40px)}.emoji-dropdown .emoji-padding.active .category-items>span{width:40px;height:40px;justify-self:center}.emoji-dropdown .emoji-padding.active .category-title{padding:12px 6px 6px 10px}.emoji-dropdown .emoji-padding.active .scrollable{padding:0}.emoji-dropdown .emoji-padding.active .emoji-category .category-items{grid-column-gap:unset}}.emoji-dropdown .emoji-padding .menu-horizontal-div,.emoji-dropdown .stickers-padding .menu-horizontal-div{z-index:4;background-color:#fff;background-color:var(--surface-color)}.emoji-dropdown .emoji-padding .menu-horizontal-div .menu-horizontal-div-item,.emoji-dropdown .stickers-padding .menu-horizontal-div .menu-horizontal-div-item{margin:0}.emoji-dropdown .emoji-category{position:relative;margin:0 -0.125rem}.emoji-dropdown .sticker-category{position:relative}.emoji-dropdown .sticker-category .category-title{cursor:pointer}.emoji-dropdown .sticker-category.stickers-recent .category-title{pointer-events:none}.emoji-dropdown .sticker-category .category-items{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}.emoji-dropdown #content-stickers .scrollable{padding:0px 5px 0}.emoji-dropdown .menu-horizontal-div{width:100%;height:48px}.emoji-dropdown .menu-horizontal-div .menu-horizontal-div-item{font-size:1.5rem;margin:0 12px;width:48px;height:48px;line-height:48px;display:flex;align-items:center;flex:0 0 auto}.emoji-dropdown .stickers-padding.active .scrollable{padding:0}.emoji-dropdown .stickers-padding.active .menu-horizontal-div .menu-horizontal-div-item{height:48px;width:48px;padding:0;margin-right:1px;margin-left:1px}.emoji-dropdown .stickers-padding .menu-wrapper{padding:0;height:48px;max-width:100%;position:relative}.emoji-dropdown .stickers-padding .menu-horizontal-div-item{flex:0 0 auto}.emoji-dropdown .stickers-padding .menu-horizontal-div-item.active:not(.tgico-recent){background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas,.emoji-dropdown .stickers-padding .menu-horizontal-div-item>img{padding:8px;max-width:100%;max-height:100%}.emoji-dropdown .stickers-padding .menu-horizontal-div-item>canvas{width:100%;height:100%}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{width:0;height:0;opacity:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{width:0;height:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{width:0;height:0;display:none}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{min-height:5rem;max-height:12.5rem;border-radius:10px;background-color:rgba(0, 0, 0, .2);background-color:var(--scrollbar-color);opacity:1}.scrollable-x::-webkit-scrollbar,.no-scrollbar::-webkit-scrollbar{display:none}.scrollable{width:100%;height:100%;overflow-y:hidden;overflow-x:hidden;max-height:100%;position:absolute;top:0px;left:0px;bottom:0px;right:0px;-webkit-overflow-scrolling:touch}.scrollable.scrollable-x{overflow-x:auto;scrollbar-width:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-ms-overflow-style:none;transform:translateZ(0)}.scrollable-padding{min-width:100%;height:100%}@-webkit-keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}@keyframes scaleIn{0%{transform:scale(0.2)}to{transform:scale(1)}}.selector{width:100%;height:100%;display:flex;flex-direction:column}.selector .selector-search-section{padding:0 !important;margin-bottom:0 !important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;position:relative;max-height:132px;overflow:hidden}.selector-search-container .scrollable{position:relative;max-height:inherit}.selector-search{padding:0 1rem;display:flex;flex-flow:wrap;position:relative}.selector-search-input{border:none;outline:none;flex:1 1 auto}.selector-search .selector-search-input{padding:7px 0px 19px 0px}.selector-user{color:#000;color:var(--primary-text-color);background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);font-size:1rem;padding:0 17px 0px 0px;margin-left:-0.25rem;margin-right:.75rem;height:2rem;line-height:2rem;margin-bottom:7px;border-radius:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;flex:0 0 auto;transition:.2s opacity,.2s transform,.2s background-color;max-width:11.25rem;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:hover,html.no-touch .selector-user:active{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:hover .selector-user-avatar:after,html.no-touch .selector-user:active .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{-webkit-animation:scaleIn .15s ease forwards;animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{-webkit-animation:scaleIn .1s ease forwards;animation:scaleIn .1s ease forwards;animation-direction:reverse}.selector-user-avatar{float:left;margin-right:8px;overflow:hidden;position:relative}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.selector-user-avatar:after{position:absolute;content:\"\";left:0;top:0;background-color:#df3f40;background-color:var(--danger-color);height:100%;width:100%;z-index:2;font-size:23px;line-height:32px !important;opacity:0;transition:.2s opacity,.2s transform;transform:scaleX(-1) rotate(0deg)}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{height:100%;flex:1 1 auto}.selector .chatlist-chat{padding-top:.75rem;padding-bottom:.75rem}@media only screen and (max-width: 600px){.selector .chatlist-chat{height:66px;padding-top:9px;padding-bottom:9px}}.selector .chatlist .user-caption{padding-left:.75rem;padding-right:0}.selector .chatlist p{height:24px !important}.selector .chatlist span.user-last-message{font-size:14px}.selector>hr{margin:0;padding:0}.selector .checkbox{margin-top:11px;padding-left:11px}.selector .checkbox-field{margin:0;padding:0;transform:translateY(-50%);top:50%;z-index:1}.selector .checkbox-field:first-child{margin-right:1.6875rem;margin-left:.6875rem}.selector .checkbox-field-round{pointer-events:none;position:absolute;right:1.125rem;--size: 1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:unset}.selector .checkbox-field-round .checkbox-box-check{--offset: 6px}.gifs-masonry{display:flex;flex-wrap:wrap}.gifs-masonry>.gif{flex:1 0 auto;max-width:100%;height:100px;margin:2.5px;cursor:pointer;position:relative}.gifs-masonry>.gif video,.gifs-masonry>.gif img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.gifs-masonry>.gif img{position:absolute;left:0;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{-webkit-animation:rotate 1s linear infinite;animation:rotate 1s linear infinite;height:100%;transform-origin:center center;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{position:absolute;top:0;bottom:0;left:0;right:0;margin:auto;width:54px;height:54px;display:flex;cursor:pointer;overflow:hidden;opacity:0;transform:scale(0)}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color: #fff}.preloader-container .you-spin-me-round{width:100%;height:100%}.preloader-container .preloader-circular{-webkit-animation:none;animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;width:100%;height:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new,body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{-webkit-animation:rotate 1s linear infinite !important;animation:rotate 1s linear infinite !important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;color:var(--color);width:56%;height:56%;opacity:1}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-download:hover,html.no-touch .preloader-container .preloader-download:active{background:none}.preloader-container:not(.manual) .preloader-download,.preloader-container.manual .preloader-close{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{width:1.5rem;height:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer !important}.preloader-container.preloader-streamable circle{stroke-width:2.5 !important}.preloader-container.preloader-streamable:after{content:\"\";position:absolute;width:.8125rem;height:.8125rem;border-radius:.125rem;background-color:var(--color);left:50%;top:50%;transform:translate(-50%, -50%)}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@-webkit-keyframes rotate{100%{transform:rotate(360deg)}}@keyframes rotate{100%{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@-webkit-keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}100%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@-webkit-keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.rp-overflow .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.btn-corner.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple{width:100%;height:100%;overflow:hidden;border-radius:inherit}.rp-overflow .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.btn-corner.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration: .7s;position:absolute;top:0;left:0;bottom:0;right:0}html.is-safari .c-ripple:not(:empty){-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%);border-radius:inherit}.c-ripple__circle{background-color:rgba(0, 0, 0, .08);background-color:var(--ripple-color);display:block;position:absolute;transform:scale(0);border-radius:50%;-webkit-animation:ripple-effect .7s forwards;animation:ripple-effect .7s forwards;transition:.35s opacity,.35s background-color;pointer-events:none}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration: .2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width: 925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration: .2s}.chatlist-container ul li>.rp .c-ripple__circle{-webkit-animation-name:ripple-effect-handhelds;animation-name:ripple-effect-handhelds;-webkit-animation-duration:.2s;animation-duration:.2s;transition-duration:.1s}}@-webkit-keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@-webkit-keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(0.27)}to{transform:scale(2)}}avatar-element{--size: 54px;--multiplier: 1;--color-top: var(--avatar-color-top);--color-bottom: var(--avatar-color-bottom);color:#fff;width:var(--size);height:var(--size);line-height:var(--size) !important;border-radius:50%;background:linear-gradient(var(--color-top), var(--color-bottom));text-align:center;font-size:calc(1.25rem / var(--multiplier));-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase;font-weight:700}avatar-element[data-color=red]{--color-top: var(--peer-avatar-red-top);--color-bottom: var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top: var(--peer-avatar-orange-top);--color-bottom: var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top: var(--peer-avatar-violet-top);--color-bottom: var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top: var(--peer-avatar-green-top);--color-bottom: var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top: var(--peer-avatar-cyan-top);--color-bottom: var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top: var(--peer-avatar-pink-top);--color-bottom: var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top: var(--peer-avatar-blue-top);--color-bottom: var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px / var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px / var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(21px / var(--multiplier)) !important}avatar-element.tgico-reply_filled:before{font-size:calc(28px / var(--multiplier)) !important}avatar-element.tgico-deletedaccount:before{font-size:calc(54px / var(--multiplier))}avatar-element:before{line-height:inherit !important}avatar-element.media-container{position:relative}avatar-element img{width:var(--size) !important;height:var(--size) !important;border-radius:inherit !important;display:block}avatar-element img.fade-in{-webkit-animation:fade-in-opacity .2s ease forwards;animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{width:calc(1.125rem / var(--multiplier)) !important;height:calc(1.125rem / var(--multiplier)) !important;vertical-align:middle !important}avatar-element path{fill:#fff}avatar-element.is-online{position:relative}avatar-element.is-online:after{position:absolute;content:\" \";display:block;border-radius:50%;border:2px solid #fff;border:2px solid var(--surface-color);background-color:#0ac630;background-color:var(--avatar-online-color);width:14px;height:14px;left:2.4375rem;top:2.4375rem}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size: 120px;--multiplier: .45}avatar-element.avatar-100{--size: 100px;--multiplier: .54}avatar-element.avatar-48{--size: 48px;--multiplier: 1.125}avatar-element.avatar-46{--size: 46px;--multiplier: 1.173913}avatar-element.avatar-44{--size: 44px;--multiplier: 1.227272}avatar-element.avatar-42{--size: 42px;--multiplier: 1.285714}avatar-element.avatar-40{--size: 40px;--multiplier: 1.35}avatar-element.avatar-35{--size: 35px;--multiplier: 1.542857}avatar-element.avatar-34{--size: 34px;--multiplier: 1.588235}avatar-element.avatar-32{--size: 32px;--multiplier: 1.6875}avatar-element.avatar-30{--size: 30px;--multiplier: 1.8}avatar-element.avatar-18{--size: 18px;--multiplier: 3}avatar-element.avatar-16{--size: 16px;--multiplier: 3.375}.avatar-relative .avatar-photo{position:absolute;top:0;left:0}.document{--background-color: var(--primary-color);padding-left:4.25rem;height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0 .25rem}@media only screen and (max-width: 600px){.document:not(.document-with-thumb) .document-ico{padding:1.5rem 0px 0px 0px;font-size:14px}.document:not(.document-with-thumb) .document-ico:after{--size: .875rem}}.document-ico:after{--size: 1.125rem;content:\"\";display:block;position:absolute;top:0;right:0;width:var(--size);height:var(--size);border-bottom-left-radius:.25rem;border-style:solid;border-width:calc(var(--size) / 2);border-left-color:rgba(0,0,0,.25);border-bottom-color:rgba(0,0,0,.25);border-top-color:#fff;border-right-color:#fff}.document-ico,.document-download{font-size:1.125rem;background-size:contain}.document-ico,.document-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document-download{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem}.document.ext-zip{--background-color: #FB8C00}.document.ext-pdf{--background-color: #DF3F40}.document.ext-apk{--background-color: #43A047}.document.document-with-thumb{--background-color: #fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.15)}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3) !important}.document-thumb{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.document-name{white-space:nowrap;font-weight:500;font-size:1rem}.document-size{white-space:nowrap;color:#707579;color:var(--secondary-text-color);font-size:.875rem;text-overflow:ellipsis;overflow:hidden}.document-name,.document-size{line-height:1.3125;line-height:var(--line-height)}.document .preloader-container{width:2.5rem;height:2.5rem}@media only screen and (max-width: 600px){.document .preloader-container{width:1.625rem;height:1.625rem}}.document .preloader-circular{background-color:transparent !important}.document .preloader-path-new{stroke-width:2.5}.document,.audio{display:flex;flex-direction:column;justify-content:center;cursor:pointer;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.document-ico,.document-download,.audio-ico,.audio-download{position:absolute;left:0;width:3.375rem;height:3.375rem;color:#fff}.document-download,.audio-download{z-index:1;align-items:center;font-size:1.5rem;cursor:pointer;display:flex;justify-content:center;transition:opacity .2s ease-in-out;opacity:1}.document-download.downloaded,.audio-download.downloaded{opacity:0}.document-description,.audio-description{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.document:not(.corner-download) .preloader-container:not(.preloader-streamable),.audio:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1) !important}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent !important}.audio .preloader-container:not(.preloader-streamable){width:100%;height:100%}.audio{position:relative;padding-left:67px;overflow:visible !important;height:3.375rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;height:3rem;padding-left:calc(3rem + .5625rem)}.audio-toggle,.audio-download{overflow:hidden;border-radius:50%;background-color:#3390ec;background-color:var(--primary-color);align-items:center}.audio.corner-download .audio-download{width:1.375rem;height:1.375rem;margin:2rem 2rem 0;background:none;display:flex !important;top:0}.audio.corner-download .preloader-container{border-radius:inherit;background-color:#3390ec;background-color:var(--primary-color)}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{position:absolute;top:0;right:0;bottom:0;left:0;transform:rotate(-119deg);overflow:hidden;max-width:100%;max-height:100%;border-radius:inherit}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{position:absolute;background-color:#fff;top:50%;left:50%;transform:translate(-50%, -50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out}@media only screen and (min-width: 601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width: 600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%, 54.93283% 57.0175%, 53.00511% 57.01738%, 50.83554% 57.01727%, 48.62036% 57.01718%, 46.55585% 57.01709%, 44.83822% 57.01702%, 43.66373% 57.01698%, 43.22863% 57.01696%, 42.86372% 57.01904%, 42.56988% 57.01621%, 42.3402% 56.99486%, 42.16778% 56.94152%, 42.0457% 56.84267%, 41.96705% 56.68478%, 41.92493% 56.45432%, 41.91246% 56.13777%, 41.91258% 55.76282%, 41.9129% 55.37058%, 41.91335% 54.96757%, 41.91387% 54.56032%, 41.91439% 54.15537%, 41.91485% 53.75926%, 41.91517% 53.3785%, 41.91529% 53.01965%, 41.94275% 52.72355%, 42.02117% 52.51653%, 42.14465% 52.38328%, 42.30727% 52.30854%, 42.50308% 52.27699%, 42.72619% 52.27341%, 42.97065% 52.28248%, 43.23056% 52.2889%, 43.94949% 52.28896%, 45.45083% 52.28912%, 47.47445% 52.28932%, 49.76027% 52.28957%, 52.04818% 52.28981%, 54.07805% 52.29003%, 55.5898% 52.29019%, 56.32332% 52.29024%, 56.58221% 52.28816%, 56.83726% 52.28948%, 57.07897% 52.30593%, 57.29794% 52.34898%, 57.48468% 52.43029%, 57.62978% 52.56146%, 57.72375% 52.7541%, 57.75718% 53.01981%, 57.75713% 53.37763%, 57.75699% 53.81831%, 57.75679% 54.31106%, 57.75657% 54.82507%, 57.75635% 55.32958%, 57.75615% 55.79377%, 57.75601% 56.18684%, 57.75596% 56.47801%, 57.7549% 56.50122%, 57.74034% 56.5624%, 57.6955% 56.64887%, 57.60334% 56.748%, 57.44691% 56.84712%, 57.20925% 56.93358%, 56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%, 54.93283% 42.44637%, 53.00511% 42.44649%, 50.83554% 42.4466%, 48.62036% 42.4467%, 46.55585% 42.44679%, 44.83822% 42.44685%, 43.66373% 42.4469%, 43.22863% 42.44691%, 42.86372% 42.44483%, 42.56988% 42.44767%, 42.3402% 42.46902%, 42.16778% 42.52235%, 42.0457% 42.6212%, 41.96705% 42.77909%, 41.92493% 43.00956%, 41.91246% 43.32611%, 41.91258% 43.70105%, 41.9129% 44.0933%, 41.91335% 44.49631%, 41.91387% 44.90355%, 41.91439% 45.3085%, 41.91485% 45.70462%, 41.91517% 46.08537%, 41.91529% 46.44422%, 41.94275% 46.74032%, 42.02117% 46.94735%, 42.14465% 47.0806%, 42.30727% 47.15534%, 42.50308% 47.18688%, 42.72619% 47.19047%, 42.97065% 47.1814%, 43.23056% 47.17497%, 43.94949% 47.17491%, 45.45083% 47.17476%, 47.47445% 47.17455%, 49.76027% 47.1743%, 52.04818% 47.17406%, 54.07805% 47.17384%, 55.5898% 47.17369%, 56.32332% 47.17363%, 56.58221% 47.17571%, 56.83726% 47.17439%, 57.07897% 47.15795%, 57.29794% 47.1149%, 57.48468% 47.03359%, 57.62978% 46.90242%, 57.72375% 46.70977%, 57.75718% 46.44406%, 57.75713% 46.08625%, 57.75699% 45.64557%, 57.75679% 45.15282%, 57.75657% 44.6388%, 57.75635% 44.1343%, 57.75615% 43.6701%, 57.75601% 43.27703%, 57.75596% 42.98586%, 57.7549% 42.96265%, 57.74034% 42.90148%, 57.6955% 42.815%, 57.60334% 42.71587%, 57.44691% 42.61675%, 57.20925% 42.53029%, 56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width: 601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width: 600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%, 43.77874% 55.46331%, 43.7795% 55.09177%, 43.77934% 54.74844%, 43.77855% 54.44389%, 43.77741% 54.18863%, 43.77625% 53.99325%, 43.77533% 53.86828%, 43.77495% 53.82429%, 43.77518% 53.55329%, 43.7754% 53.2823%, 43.77563% 53.01131%, 43.77585% 52.74031%, 43.77608% 52.46932%, 43.7763% 52.19832%, 43.77653% 51.92733%, 43.77675% 51.65633%, 43.77653% 51.38533%, 43.7763% 51.11434%, 43.77608% 50.84334%, 43.77585% 50.57235%, 43.77563% 50.30136%, 43.7754% 50.03036%, 43.77518% 49.75936%, 43.77495% 49.48837%, 44.48391% 49.4885%, 45.19287% 49.48865%, 45.90183% 49.48878%, 46.61079% 49.48892%, 47.31975% 49.48906%, 48.0287% 49.4892%, 48.73766% 49.48934%, 49.44662% 49.48948%, 50.72252% 49.48934%, 51.99842% 49.4892%, 53.27432% 49.48906%, 54.55022% 49.48892%, 55.82611% 49.48878%, 57.10201% 49.48865%, 58.3779% 49.4885%, 59.6538% 49.48837%, 59.57598% 49.89151%, 59.31883% 50.28598%, 58.84686% 50.70884%, 58.12456% 51.19714%, 57.11643% 51.78793%, 55.78697% 52.51828%, 54.10066% 53.42522%, 52.02202% 54.54581%, 49.96525% 55.66916%, 48.3319% 56.57212%, 47.06745% 57.27347%, 46.11739% 57.79191%, 45.42719% 58.14619%, 44.94235% 58.35507%, 44.60834% 58.43725%, 44.37066% 58.41149%, 44.15383% 58.27711%, 43.99617% 58.0603%, 43.88847% 57.77578%, 43.82151% 57.43825%, 43.78608% 57.06245%, 43.77304% 56.66309%, 43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%, 43.77874% 44.21955%, 43.7795% 44.59109%, 43.77934% 44.93442%, 43.77855% 45.23898%, 43.77741% 45.49423%, 43.77625% 45.68961%, 43.77533% 45.81458%, 43.77495% 45.85858%, 43.77518% 46.12957%, 43.7754% 46.40056%, 43.77563% 46.67156%, 43.77585% 46.94255%, 43.77608% 47.21355%, 43.7763% 47.48454%, 43.77653% 47.75554%, 43.77675% 48.02654%, 43.77653% 48.29753%, 43.7763% 48.56852%, 43.77608% 48.83952%, 43.77585% 49.11051%, 43.77563% 49.38151%, 43.7754% 49.65251%, 43.77518% 49.9235%, 43.77495% 50.1945%, 44.48391% 50.19436%, 45.19287% 50.19422%, 45.90183% 50.19408%, 46.61079% 50.19394%, 47.31975% 50.1938%, 48.0287% 50.19366%, 48.73766% 50.19353%, 49.44662% 50.19338%, 50.72252% 50.19353%, 51.99842% 50.19366%, 53.27432% 50.1938%, 54.55022% 50.19394%, 55.82611% 50.19408%, 57.10201% 50.19422%, 58.3779% 50.19436%, 59.6538% 50.1945%, 59.57598% 49.79136%, 59.31883% 49.39688%, 58.84686% 48.97402%, 58.12456% 48.48572%, 57.11643% 47.89493%, 55.78697% 47.16458%, 54.10066% 46.25764%, 52.02202% 45.13705%, 49.96525% 44.01371%, 48.3319% 43.11074%, 47.06745% 42.4094%, 46.11739% 41.89096%, 45.42719% 41.53667%, 44.94235% 41.3278%, 44.60834% 41.24561%, 44.37066% 41.27137%, 44.15383% 41.40575%, 43.99617% 41.62256%, 43.88847% 41.90709%, 43.82151% 42.24461%, 43.78608% 42.62041%, 43.77304% 43.01978%, 43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:23px;margin-top:1px}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color);opacity:.3}html.no-touch .audio-waveform rect:hover,html.no-touch .audio-waveform rect:active{opacity:1}.audio-waveform rect.active,.audio.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform rect{opacity:1}.audio .audio-details{margin-top:3px;margin-bottom:0}.audio .audio-title{margin-bottom:-2px}.audio-ico,.audio-download{width:3rem;height:3rem}.audio .part{height:112px !important;width:112px !important}@media only screen and (max-width: 600px){.audio .part{width:100px !important;height:100px !important}}.audio-title{font-size:1rem;color:#000;color:var(--primary-text-color)}.audio-description:not(:empty):before{content:\" • \"}.audio-time,.audio-subtitle{font-size:.875rem;color:#707579;color:var(--secondary-text-color);display:flex}@media only screen and (max-width: 600px){.audio-time,.audio-subtitle{font-size:.75rem}}.audio-title,.audio-time,.audio-subtitle{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-title,.audio-subtitle{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{line-height:1;margin-left:-1px;margin-top:7px;align-items:center}@media only screen and (max-width: 600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{content:\" \";width:.5rem;height:.5rem;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;margin-left:.375rem}.audio .progress-line{--height: 2px;--border-radius: 4px;--thumb-size: .75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{z-index:1;background-color:transparent;opacity:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff !important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;-o-object-fit:cover;object-fit:cover;width:inherit;height:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{position:absolute;left:0;display:flex;width:100%;justify-content:center;top:8px;align-items:center;transform:translate3d(0, calc(-100% - 10px), 0);transition:transform .2s ease}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translate3d(0, 0, 0)}.quiz-hint .container{background:rgba(0,0,0,.7);text-align:center;width:auto;padding:10px 18px 12px 50px;min-height:48px;border-radius:12px;line-height:1.5;color:#fff;font-size:15px;max-width:400px;overflow:hidden;text-align:left;position:relative;display:flex;align-items:center;flex-wrap:wrap}@media only screen and (max-width: 600px){.quiz-hint .container{padding:10px 18px 12px 54px;margin:0 10px;font-size:14px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";position:absolute;left:15px;font-size:1.5rem;top:12px}.quiz-hint .container a{color:#fff;border-bottom:1px solid #fff}.peer-typing{margin-right:4px}.peer-typing-container{--color: var(--primary-color);color:var(--color)}.peer-typing-flex{display:flex;align-items:center}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;vertical-align:middle;transform:translateY(-1px)}.peer-typing-text-dot{width:6px;height:6px;border-radius:50%;background-color:var(--color);margin:0 .5px;display:inline-block;vertical-align:middle;-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-name:dotMiddle;animation-name:dotMiddle}.peer-typing-text-dot:first-child{-webkit-animation-name:dotFirst;animation-name:dotFirst}.peer-typing-text-dot:last-child{-webkit-animation-name:dotLast;animation-name:dotLast}.peer-typing-upload{width:13px;height:5px;overflow:hidden;position:relative;border-radius:2px;margin-right:.375rem}.peer-typing-upload:before,.peer-typing-upload:after{display:block;content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background-color:var(--color);border-radius:inherit}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{-webkit-animation:upload 1s ease-in-out infinite;animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{content:\" \";display:block;width:6px;height:6px;border-radius:50%;background-color:var(--color);-webkit-animation:recordBlink 1.25s infinite;animation:recordBlink 1.25s infinite}.peer-typing-choosing-sticker{margin-right:.375rem;flex:0 0 auto;display:flex;align-items:center;height:16px}.peer-typing-choosing-sticker-eye{width:8px;height:14px;border-radius:50%;display:inline-block;vertical-align:middle;border:1px solid var(--color);margin:0 .0625rem;position:relative;-webkit-animation:eye 1.8s ease-in-out infinite;animation:eye 1.8s ease-in-out infinite}.peer-typing-choosing-sticker-eye:before{content:\" \";display:block;width:.25rem;height:.25rem;background-color:var(--color);border-radius:50%;position:absolute;top:50%;-webkit-animation:eye-move 1.8s ease-in-out infinite;animation:eye-move 1.8s ease-in-out infinite;transform:translate(-1px, -50%)}@-webkit-keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@keyframes dotFirst{0%{transform:scale(0.6666666667);opacity:.8}50%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(1);opacity:1}100%{transform:scale(0.6666666667);opacity:.8}}@-webkit-keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@keyframes dotMiddle{0%{transform:scale(0.8333333333);opacity:.9}12.5%{transform:scale(0.6666666667);opacity:.8}62.5%{transform:scale(0.6666666667);opacity:.8}87.5%{transform:scale(1);opacity:1}100%{transform:scale(0.8333333333);opacity:.9}}@-webkit-keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@keyframes dotLast{0%{transform:scale(1);opacity:1}25%{transform:scale(0.6666666667);opacity:.8}75%{transform:scale(0.6666666667);opacity:.8}100%{transform:scale(1);opacity:1}}@-webkit-keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@keyframes upload{0%{transform:translateX(-13px)}100%{transform:translate(13px)}}@-webkit-keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-0.75px)}12.5%{transform:scale(1) translateX(0px)}25%{transform:scale(1.1) translateX(0.375px)}50%{transform:scale(1.1) translateX(0.75px)}62.5%{transform:scale(1) translateX(0px)}75%{transform:scale(1.1) translateX(-0.375px)}100%{transform:scale(1.1) translateX(-0.75px)}}@-webkit-keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}@keyframes eye-move{0%{transform:translate(-1px, -50%)}25%{transform:translate(3px, -50%)}50%{transform:translate(3px, -50%)}75%{transform:translate(-1px, -50%)}100%{transform:translate(-1px, -50%)}}poll-element{margin-top:-1px;display:block;width:330px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#000;color:var(--primary-text-color)}@media only screen and (max-width: 600px){poll-element{width:240px;max-width:100%}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500}@media only screen and (max-width: 600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{font-size:14px;color:#707579;color:var(--secondary-text-color);margin-top:2px;margin-bottom:5px;display:flex;align-items:center;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{position:absolute;font-size:1.5rem;top:-4px;right:2px;color:#3390ec;color:var(--primary-color);cursor:pointer;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{transform:scale(0);pointer-events:none}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;width:18px;height:18px}poll-element .poll-answer{display:flex;position:relative;padding-bottom:20px;padding-left:28px;margin-top:1px}poll-element .poll-answer-text{margin-top:6px;margin-left:12px}poll-element .poll-answer-percents{position:absolute;left:0;top:0;opacity:0;font-weight:500;margin-top:7px;font-size:14px;margin-left:-9px;text-align:right;width:40px}poll-element .poll-answer-selected{position:absolute;bottom:1px;left:15px;color:#fff;background:#3390ec;background:var(--primary-color);border-radius:50%;height:16px;width:16px;font-weight:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";font-weight:bold}html.no-touch poll-element .poll-answer:hover .animation-ring,html.no-touch poll-element .poll-answer:active .animation-ring{visibility:visible;transform:scale(1)}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;-webkit-animation:pollAnswerRotate .65s linear infinite;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-0.5rem}poll-element .poll-line{height:35px;position:absolute;left:10px;bottom:2px;stroke-dashoffset:0;stroke-dasharray:0,485.9}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{text-align:center;margin:-0.375rem -0.5rem -0.375rem -0.625rem;height:2.875rem}poll-element .poll-footer-button{cursor:pointer;width:100%;height:100%;color:#3390ec;color:var(--primary-color);font-weight:500;border-top-left-radius:0 !important;border-top-right-radius:0 !important;font-size:1rem;overflow:hidden}poll-element .poll-footer,poll-element .poll-footer-button{display:flex;align-items:center;justify-content:center}poll-element .poll-quiz-timer{width:32px;height:32px;stroke:#a3adb6;transform:rotate(270deg);top:-7px;fill:none;position:absolute;right:-2px;stroke-linecap:round}poll-element .poll-time{font-size:12px;font-weight:500;position:absolute;right:27px;color:#a3adb6}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{display:flex;justify-content:center;align-items:center;width:34px;height:34px;position:absolute;left:-1px;top:-1px;transform:scale(1)}poll-element .circle-hover .poll-answer-selected{display:flex !important;opacity:0;left:50%;top:50%;transform:translate(-50%, -50%);width:20px;height:20px;font-size:20px;line-height:16px;-webkit-animation:none;animation:none}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{display:block;border-radius:50%;height:34px;width:34px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);transform:scale(0.1);visibility:hidden}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;width:26px;top:unset;left:unset}poll-element .progress-ring__circle{transform-origin:center;transform:rotate(-90deg);stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent}poll-element.is-voted .circle-hover,poll-element.is-voted .animation-ring{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity .1s ease forwards}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:.34s opacity}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:.1s transform}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}@-webkit-keyframes pollAnswerRotate{to{transform:rotate(270deg)}}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-animation-fill-mode:forwards !important;animation-fill-mode:forwards !important}.transition>.transition-item:not(.active):not(.from):not(.to){display:none !important}.transition.zoom-fade>.from{transform-origin:center;transform:scale(1);opacity:1}.transition.zoom-fade>.to{transform-origin:center;opacity:0}.transition.zoom-fade.animating>.from{-webkit-animation:fade-out-opacity .15s ease;animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{-webkit-animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease;animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(0.95)}.transition.zoom-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease;animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease;animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine: cubic-bezier(.39, .575, .565, 1);--easeInSine: cubic-bezier(.47, 0, .745, .715);position:relative}.transition.slide-fade>.from{transform-origin:left center;transform:translateX(0);opacity:1}.transition.slide-fade>.to{transform-origin:left center;transform:translateX(1.5rem);opacity:0}.transition.slide-fade.animating>.from{-webkit-animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s;animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{-webkit-animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s;animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{transform:translateX(0);opacity:1}.transition.slide-fade.backwards>.to{transform:translateX(-1.5rem);opacity:0}.transition.slide-fade.backwards.animating>.from{-webkit-animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s;animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{-webkit-animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s;animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@-webkit-keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}100%{transform:scale(1)}}@-webkit-keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}100%{transform:scale(1.1)}}@-webkit-keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(0.95)}100%{transform:scale(1)}}@-webkit-keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}100%{transform:translateX(0)}}@-webkit-keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}100%{transform:translateX(-1.5rem)}}@-webkit-keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}100%{transform:translateX(1.5rem)}}@-webkit-keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}100%{transform:translateX(0)}}.row{min-height:3.5rem;position:relative;padding:.6875rem 1rem;display:flex;flex-direction:column;justify-content:center}.row a{position:relative;z-index:1}.row-title-row{display:flex;justify-content:space-between;align-items:center;order:0}.row-title-row .row-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto}.row-title{color:#000;color:var(--primary-text-color);line-height:1.3125;line-height:var(--line-height);order:0;word-break:break-word;text-overflow:ellipsis;overflow:hidden}.row-title-right{flex:0 0 auto !important;margin-left:1rem}.row-midtitle{font-size:.875rem;order:1}.row-with-padding{padding-left:4.5rem}.row-with-padding .row-title.tgico:before{position:absolute;left:1rem;font-size:1.5rem;color:#707579;color:var(--secondary-text-color);pointer-events:none;margin-top:-0.125rem}.row-with-padding .row-subtitle:not(:empty)+.row-title.tgico:before{margin-top:.25rem}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width: 601px){.row-clickable{border-radius:10px}}.row .radio-field-main,.row .checkbox-field{padding-left:3.375rem;margin-left:-3.375rem}.row .checkbox-field{margin-right:0;height:auto}.row .checkbox-field .checkbox-caption{padding-left:0}.row .checkbox-field-toggle{margin:0;margin-right:.125rem;padding:0}.row-subtitle{color:#707579 !important;color:var(--secondary-text-color) !important;font-size:.875rem !important;line-height:1.3125;line-height:var(--line-height);margin-top:.125rem;margin-bottom:.0625rem;order:1}.row-subtitle:empty{display:none}.row-media{width:48px !important;height:48px !important;position:absolute !important;margin:0 !important;left:.5rem}.row.menu-open{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.color-picker{width:380px;max-width:100%;margin:1.1875rem auto .25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.color-picker-box{width:100%;height:198px}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible !important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:-webkit-grab;cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{background:#fff;background:var(--surface-color);position:absolute !important;right:0;bottom:calc(100% + .625rem);width:26.25rem !important;max-width:100%;max-height:26.25rem;box-shadow:0px 5px 10px 5px rgba(16,35,47,.14);z-index:3;border-radius:10px;transition:transform .2s cubic-bezier(.4, 0, .2, 1),opacity .2s cubic-bezier(.4, 0, .2, 1);transition:transform var(--esg-transition),opacity var(--esg-transition);transform:scale(0);opacity:0;transform-origin:bottom right;padding:.625rem !important;display:block !important}@media only screen and (max-height: 569px),only screen and (max-width: 600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{width:100%;border-radius:.375rem;border:2px solid #3390ec;border:2px solid var(--primary-color);text-align:center;color:#3390ec;color:var(--primary-color);background-color:transparent;height:3rem;font-weight:500;font-size:.9375rem}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:hover,html.no-touch .reply-keyboard-button:active{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.peoplenearby-container div.text.nearby-description{margin-top:15px;text-align:center;color:#000;color:var(--primary-text-color)}.peoplenearby-container div.text.nearby-error{color:#aaaaaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{min-height:140px;width:100%;display:flex;align-items:center;justify-content:center}.peoplenearby-container .locating-animation-container .tgico.tgico-location{padding:50px;background:#2a9ef1;background:var(--avatar-color-bottom);width:140px;height:140px;display:flex;align-items:center;justify-content:center;border-radius:50%}.peoplenearby-container .locating-animation-container .tgico.tgico-location::before{font-size:58px;color:#fff}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{-webkit-animation:3s waves-animation infinite;animation:3s waves-animation infinite;width:50px;height:50px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:36px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{-webkit-animation:5s waves-animation infinite;animation:5s waves-animation infinite;width:66px;height:71px;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);clip-path:polygon(72% 0, 100% 0, 100% 100%, 72% 100%);margin-left:51px;margin-top:1px;-webkit-animation-delay:2s;animation-delay:2s}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px !important;transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px !important;transform:rotateY(180deg)}@-webkit-keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}@keyframes waves-animation{from{opacity:100%}50%{opacity:0%}to{opacity:100%}}.spoiler{--anim: .4s ease;position:relative;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}[style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color);font-family:inherit !important}.message.will-change .spoiler-text{filter:blur(6px)}.message.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.message.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim),filter var(--anim)}.message.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.message.is-spoiler-visible:not(.backwards) .spoiler-text{filter:blur(0);opacity:1}.message.is-spoiler-visible.backwards .spoiler-text{filter:blur(3px)}.message:not(.is-spoiler-visible) .spoiler{cursor:pointer}.emoji-animation{position:absolute;pointer-events:none}.emoji-animation.is-in .rlottie{transform:scaleX(-1)}.emoji-animation-container{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden;z-index:3}.popup{position:fixed !important;top:0;right:0;bottom:0;left:0;max-width:none;z-index:3;background-color:rgba(0,0,0,.3);margin:0;padding:1.875rem;box-shadow:none;opacity:0;visibility:hidden;transition-property:opacity,visibility;transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-timing-function:cubic-bezier(.4, 0, .2, 1);transition-timing-function:var(--popup-transition-function);overflow:auto;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup.no-overlay{padding:0;background-color:transparent;overflow:visible}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;visibility:visible;transition-delay:0s,0s;z-index:4}.popup.active .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup.hiding .popup-container{transform:translate3d(var(--translateX), 0, 0)}.popup-container{--translateX: 0;position:relative;border-radius:10px;background-color:#fff;background-color:var(--surface-color);padding:1rem;transform:translate3d(var(--translateX), 3rem, 0);-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .15s cubic-bezier(.4, 0, .2, 1);transition:transform var(--popup-transition-time) var(--popup-transition-function);display:flex;flex-direction:column;overflow:hidden;margin:auto}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500}.popup-centerer{margin:auto}.popup-close{z-index:3;justify-self:center;flex:0 0 auto}.popup-header{display:flex;margin-bottom:2rem;align-items:center;flex:0 0 auto}.popup-body{flex:1 1 auto;display:flex;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{display:flex;flex-direction:column;justify-content:flex-end;align-items:flex-end}.popup-buttons-row{flex-direction:row-reverse;justify-content:flex-start}.popup-buttons-row .btn+.btn{margin-top:0 !important;margin-right:1.125rem}.popup-buttons .btn{font-weight:500;padding:.5rem;text-transform:uppercase;border-radius:8px;position:relative;overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.popup-buttons .btn+.btn{margin-top:.5rem;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{position:absolute;bottom:20px;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}.popup-avatar h6{font-size:1.25rem;text-align:left;margin:0;margin-left:2rem}.popup-avatar .crop{max-width:100%;max-height:100%;padding:24px 54px 46px 46px;border-radius:8px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{width:420px;max-width:420px;padding:12px 20px 32.5px;max-height:100%}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;align-items:center;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{width:auto;height:36px;font-size:14px;font-weight:normal;padding:0 1.375rem;margin-top:-3px;border-radius:10px;text-transform:uppercase}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-title{flex:1;padding-left:1.5rem;margin:0;margin-top:-3px;font-size:1.25rem;font-weight:500}.popup-new-media .popup-photo{max-width:380px;overflow:hidden;width:100%;border-radius:10px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{width:100%;margin-top:25px;flex:0 0 auto}.popup-new-media .input-field-input{font-size:1rem;border-radius:10px}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{z-index:4;top:calc(100% + .25rem)}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{-o-object-fit:cover;object-fit:cover;width:100%;height:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{position:relative;border-radius:inherit;overflow:hidden}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{max-width:100%;overflow:hidden;cursor:default;padding-left:3.75rem;height:4.5rem}.popup-new-media.popup-send-photo .document-name{font-weight:normal;width:100%;max-width:100%;overflow:hidden;text-overflow:ellipsis;line-height:1.5}.popup-new-media.popup-send-photo .document-ico{height:48px;width:48px;font-size:16px;font-weight:normal;line-height:11px;letter-spacing:0}.popup-create-contact .name-fields{display:flex;flex-direction:column;position:relative;padding-left:116px;margin-top:1rem}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{display:flex;margin-bottom:.625rem;align-items:center}.popup-peer .popup-container{padding:1rem 1.5rem .8125rem;max-width:min(400px, 100%)}.popup-peer .popup-container.have-checkbox .popup-buttons{margin-top:.5625rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;margin-bottom:.125rem}.popup-peer .popup-title:not(:first-child){padding-left:.6875rem}.popup-peer .popup-description{margin-top:0;margin-bottom:0;min-width:15rem;max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content;text-overflow:ellipsis;overflow:hidden;word-break:break-word;line-height:1.3125;line-height:var(--line-height)}.popup-peer .popup-buttons{margin-top:1.625rem;margin-right:-0.5rem}.popup-peer .popup-buttons .btn{font-weight:500}.popup-peer .popup-buttons .btn+.btn{margin-top:.625rem}.popup-peer .checkbox-field{display:flex;align-items:center;height:3.5rem;padding:0 1.1875rem;margin:0 -1.0625rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-stickers h6{padding:0 2rem 0 1.5rem;margin:0;font-size:1.25rem;font-weight:500;line-height:1.3125;line-height:var(--line-height)}.popup-stickers .sticker-set-footer{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);text-align:center;color:#3390ec;color:var(--primary-color)}.popup-stickers .sticker-set-footer .btn-primary{text-transform:uppercase;width:auto;padding:0 1.0625rem;height:44px;line-height:44px}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .popup-container{max-width:420px;max-height:420px;width:420px;padding:0}.popup-stickers .popup-close{font-size:1.5rem;margin-left:1rem}.popup-stickers .popup-header{margin-bottom:12px;flex:0 0 auto;margin-top:10px}.popup-stickers .sticker-set{margin-bottom:8px}.popup-stickers .sticker-set-stickers{padding:0 5px;display:grid;grid-template-columns:repeat(5, 1fr)}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-stickers{grid-template-columns:repeat(4, 1fr)}}.popup-stickers .sticker-set-stickers.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-sticker{width:80px;width:var(--esg-sticker-size);height:80px;height:var(--esg-sticker-size);margin-bottom:2px;justify-self:center;cursor:pointer;position:relative}@media only screen and (max-width: 600px){.popup-stickers .sticker-set-sticker{margin-bottom:8px}}.popup-stickers .sticker-set-sticker:hover{border-radius:12px;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height: 470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-left:6px;margin-top:4px;margin-bottom:1.375rem}.popup-date-picker .popup-title{font-weight:500;font-size:20px}.popup-date-picker .popup-buttons{order:2;margin-right:-2px}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{display:flex;justify-content:space-between;align-items:center}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-prev:disabled,.popup-date-picker .date-picker-next:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-top:7px;margin-bottom:1.5rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7, 1fr);width:100%;justify-content:center}.popup-date-picker .date-picker-month .btn-icon{justify-self:center;width:38px;height:38px;font-size:12px;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;align-items:center}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7 !important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{color:#fff;color:var(--badge-text-color);border-radius:50%;background-color:#3390ec !important;background-color:var(--primary-color) !important}.popup-schedule .popup-header{justify-content:space-between;margin-top:5px;margin-bottom:17px;margin-left:0}@media only screen and (max-width: 600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;width:420px;padding:4px 16px 16px 16px}@media only screen and (max-width: 600px){.popup-schedule .popup-container{min-width:312px;width:312px;padding:4px 14px 14px 14px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-right:-20px;margin-left:2px;width:unset}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-weight:500;font-size:20px;margin-left:-5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{justify-self:auto;font-weight:500;font-size:14px;width:36px;height:36px;margin-top:-4px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8 !important}.popup-schedule .date-picker-month-day{font-weight:bold;color:#000 !important;color:var(--primary-text-color) !important;font-size:14px !important}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width: 600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width: 600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:normal}@media only screen and (max-width: 600px){.popup-schedule .btn-primary{height:50px;widtH:280px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px, 100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main::before{left:.25rem}.popup-create-poll .radio-field .radio-field-main::after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none;opacity:0 !important}.popup-create-poll .input-field .btn-icon{position:absolute;right:.4375rem;top:.4375rem;z-index:1;opacity:1;transition:opacity .2s ease}@media only screen and (max-width: 600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{margin-top:.875rem;font-size:.875rem;line-height:1.2}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{top:54px;right:20px}.popup-forward .popup-container{width:420px;max-width:420px;padding:7px 0 0 0;max-height:min(40.625rem, 100%);height:40.625rem}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:3px;padding:0 1rem}@media only screen and (max-width: 600px){.popup-forward .popup-header{padding-left:.9375rem}}.popup-forward .popup-title{flex-grow:1}.popup-forward .selector,.popup-forward .chatlist-container{height:auto;overflow:hidden;display:flex;width:100%;flex-direction:row;flex:1 1 auto}.popup-forward .selector-search-input{font-size:1.25rem;padding:.5rem 1.5rem;width:100%;line-height:1.3125;line-height:var(--line-height)}@media only screen and (max-width: 600px){.popup-forward .selector-search-input{padding-left:1.0625rem}}.popup-forward .selector .chatlist{margin-top:0 !important}.popup-forward .selector .chatlist-chat{height:3.875rem !important;padding-top:.5rem !important;padding-bottom:.5rem !important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{padding-top:0 !important;margin-bottom:0 !important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;text-align:center;pointer-events:none}.popup-instance-deactivated .header{font-size:2rem;color:#fff}.popup-instance-deactivated .subtitle{color:#fff;opacity:.6;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:bold;margin:.75rem 0 .25rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{width:100px;height:100px;position:relative;margin:0 auto}.popup-report-messages-confirm .popup-body{margin:1em -0.5rem .375rem -0.5rem;overflow:unset}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-right-radius:0;border-bottom-left-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin: 1.25rem;width:100%;height:100%;padding:0 .5rem}.group-call:after{content:\" \";position:absolute;right:0;bottom:0;left:0;height:7.5rem;background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, #212121 100%);background:linear-gradient(180deg, rgba(33, 33, 33, 0) 0%, rgba(33, 33, 33, 0.65) 48.54%, var(--gc-background-color) 100%)}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{flex:0 0 auto;color:inherit}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500}.group-call-header-title,.group-call-header-subtitle{line-height:1.3125;line-height:var(--line-height);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-header-subtitle{font-size:.875rem;color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-buttons{display:flex;align-items:center;justify-content:space-between;position:absolute;bottom:1.75rem;align-self:center;z-index:1}.group-call-button{color:#fff;color:var(--gc-primary-text-color);background-color:rgba(1, 200, 80, .2);background-color:var(--gc-button-unmuted-color)}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60, 135, 247, .2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223, 68, 184, .2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255, 89, 90, .3) !important;background-color:var(--gc-button-leave-color) !important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg, #00A3B4 12.94%, #00CB47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg, #4EABF8 14.73%, #3478F6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg, #DF44B8 14.73%, #3851EB 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{align-items:center;padding-right:.5rem}.group-call-participant-status-icon{vertical-align:middle;margin-right:6px;line-height:1;display:inline-block;font-size:1.125rem;width:1.125rem;height:1.125rem}.group-call-participant-status-container{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-muted-icon-container{flex:0 0 auto}.group-call-participant-video-container{position:relative;height:15rem;width:100%;display:flex;align-items:center;border-radius:10px;background-color:#000;overflow:hidden;margin:.25rem;width:33%;flex:1 1 auto;cursor:pointer}.group-call-participant-video-container:after{content:\" \";position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0) 55.62%, rgba(0, 0, 0, 0.5) 86.46%)}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;width:1.25rem;height:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-info,.group-call-participant-video-header{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-info,body.animation-level-2 .group-call-participant-video-header{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-info,.group-call-participant-video-header{display:flex;align-items:center;justify-content:space-between;padding:0 .5rem 0 .75rem;position:absolute;right:0;bottom:.25rem;left:0;z-index:1}.group-call-participant-video-header{top:0;bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem}.group-call-participant-video-header .group-call-pin-icon{width:1.5rem;height:1.5rem;font-size:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.group-call-participant-video-info .group-call-participant-status-container{opacity:.6;margin-top:-1px}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;margin-left:.75rem}.group-call-participant .is-speaking{color:#5CC85E;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;overflow:hidden;flex:1 1 auto}.group-call-participants-scrollable{position:relative;border-radius:inherit;height:auto;padding-bottom:6rem}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-0.25rem -0.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2){height:auto;flex:1 0 auto}.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before,.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-info,.group-call-participants-video-container.show-controls .group-call-participant-video-header{opacity:1}.group-call-participants .chatlist{background:none;padding:0;max-width:600px;margin:0 auto}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaaaaa;color:var(--gc-secondary-text-color)}.group-call-participants .dialog-subtitle{margin-top:-0.25rem}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{min-height:100%;margin-bottom:.25rem}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25% !important}.group-call-cfs{display:none}.group-call:not(.is-big-layout) .popup-body .group-call-header{display:none}.group-call:not(.is-big-layout) .group-call-big-video-container{display:none}.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width: 17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active{background-color:rgba(112,117,121,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(calc(26.25rem / -2));transform:translateX(calc(var(--gc-right-column-width) / -2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX: calc(var(--gc-right-column-width) / -2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{position:absolute;top:0;right:calc(26.25rem * -1);right:calc(var(--gc-right-column-width) * -1);bottom:0;width:26.25rem;width:var(--gc-right-column-width);background-color:#212121;background-color:var(--gc-background-color);padding:inherit}.group-call.is-big-layout .group-call-buttons{padding:.75rem;bottom:2.5rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{position:absolute;content:\" \";top:0;right:0;bottom:0;left:0;-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),background-color .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-call .popup-header{width:100%}.popup-call .popup-title{flex:1 1 auto}.call{width:100%;height:100%;color:#fff;align-items:center}.call.is-full-screen{border-radius:0}.call-avatar{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;opacity:.7}.call-avatar .avatar-photo{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.call-title{font-weight:500;font-size:1.25rem}.call-subtitle{font-size:1rem}.call-buttons{display:flex;align-items:center;position:absolute;bottom:1.75rem;align-self:center;z-index:1;pointer-events:none}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale: 1}.call-buttons .call-button-container.hide-me{--scale: 0 !important;transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4, .0, .2, 1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4, .0, .2, 1),transform .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(calc(3.375rem * -.5 + 2rem * -.5));transform:translateX(calc(var(--call-button-size) * -.5 + var(--call-button-margin) * -.5))}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(3.375rem * 2 + 2rem * 2));transform:translateX(calc(var(--call-button-size) * 2 + var(--call-button-margin) * 2))}.call-button{background-color:rgba(255,255,255,.1)}.call-button-red{background-color:#df3f40 !important;background-color:var(--danger-color) !important}.call-button-green{background-color:#5CC85E !important;background-color:var(--gc-green-text-color) !important}.call-button.active{background-color:#fff !important}.call-button.active:before{color:#9e9e9e}.call-video{width:100%;height:100%;-o-object-fit:contain;object-fit:contain;position:absolute;border-radius:inherit}.call-video-container{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;background-color:#000;z-index:-1}.call-video-container.small{bottom:8rem;right:1rem;left:auto;top:auto;z-index:1;border-radius:10px}.call-video-blur{position:absolute;width:100%;height:100%;opacity:.7;border-radius:inherit}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc((3.375rem + 2rem + 1.125rem) * -1));transform:translateY(calc((var(--call-button-size) + var(--call-button-margin) + 1.125rem) * -1))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-sponsored .scrollable-y{position:relative;max-height:25rem;margin:0 -1.5rem;width:calc(100% + 3rem);padding:.5rem 1.5rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;border-top:1px solid transparent;border-bottom:1px solid transparent}.popup-sponsored .scrollable-y:not(.scrolled-top){border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color)}.popup-sponsored .scrollable-y:not(.scrolled-bottom){border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}#auth-pages{max-width:100%;overflow:hidden;background:#fff;background:var(--surface-color)}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width: 600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width: 600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width: 600px){#auth-pages .input-wrapper{margin-top:41px;width:100%;padding:0 16px}}#auth-pages .auth-image,#auth-pages .subtitle,#auth-pages .input-wrapper{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;position:relative;max-width:720px;margin:0 auto}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height: 810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{max-width:720px;min-width:auto;margin:0 auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{height:810px;padding:0;flex:1 1 auto;display:flex;flex-direction:column;width:100%}@media screen and (max-height: 810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width: 600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-top:.5rem;margin-bottom:.5rem}.page-sign .auth-image,.page-signUp .auth-image{width:7.5rem;height:7.5rem;margin-bottom:1.5rem}@media only screen and (min-width: 601px){.page-sign .auth-image,.page-signUp .auth-image{width:10rem;height:10rem;margin-bottom:1.5rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{max-width:100%;max-height:100%;fill:#3390ec;fill:var(--primary-color)}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:normal}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:unset !important}.page-signQR .auth-image{width:240px !important;height:240px !important;display:flex;justify-content:center;align-items:center}.page-signQR .auth-image .preloader{transform:none;left:unset;top:unset}.page-signQR .auth-image .qr-canvas{width:100%;height:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem !important}.page-signQR h4{flex:0 0 auto}.page-signQR .qr-description{max-width:480px;margin:1rem auto;line-height:1.3125;text-align:left}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-top:10px;margin-bottom:14px}@media only screen and (max-width: 600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width: 600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4, .0, .2, 1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{display:flex;align-items:center;justify-content:center}.page-authCode .phone-wrapper h4[contenteditable]{padding:0 1rem;border:none;outline:none;padding:0 1rem;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color)}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40 !important;border-color:var(--danger-color) !important}.page-authCode .subtitle{margin-top:0}.page-chats{display:flex;max-width:calc(1680px + 2px) !important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{width:100%;overflow:hidden;position:relative;min-height:100%;height:100%;max-height:100%}@media only screen and (max-width: 600px){.page-chats .main-column{width:100%;display:flex !important;z-index:1}}@media only screen and (min-width: 601px){.page-chats #column-center{display:flex !important;background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex !important}.page-chats .main-column{height:100%;position:relative;min-height:100%;max-height:100%}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;width:100%;max-height:100%;height:100%;overflow:hidden;position:absolute;left:0;top:0;z-index:3}@media only screen and (min-width: 1681px){.page-chats{border-top-width:0;border-right-width:1px;border-bottom-width:0;border-left-width:1px;border-style:solid;border-color:#dfe1e5;border-color:var(--border-color)}}.page-chats .avatar-edit{width:120px;height:120px;margin:1rem auto 2rem;flex:0 0 auto}body.animation-level-2 .page-chats .main-column{transition:.25s ease-in-out;transition:var(--tabs-transition)}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:400;font-display:swap;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:500;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-family:\"Roboto\";font-style:normal;font-weight:700;font-display:swap;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}html,body{height:100%;width:100%;margin:0;padding:0}@media only screen and (max-width: 600px){html,body{overflow:hidden;height:calc(1vh * 100);height:calc(var(--vh, 1vh) * 100)}}html.is-ios{position:fixed;-webkit-user-select:none;-webkit-touch-callout:none}@supports(padding: max(0px)){html{padding:0 min(16px, env(safe-area-inset-right)) 0 min(16px, env(safe-area-inset-left))}}html{font-size:16px;-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{-webkit-animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-in .3s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-in var(--transition-standard-in) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{-webkit-animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;animation:grayscale-out .25s cubic-bezier(.4, .0, .2, 1) forwards;-webkit-animation:grayscale-out var(--transition-standard-out) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@-webkit-keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@keyframes grayscale-in{0%{filter:grayscale(0)}100%{filter:grayscale(1)}}@-webkit-keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}@keyframes grayscale-out{0%{filter:grayscale(1)}100%{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,input,optgroup,select,textarea,html{font-family:\"Roboto\",-apple-system,apple color emoji,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif}input,textarea,button,select,a,div{-webkit-tap-highlight-color:rgba(0,0,0,0)}.whole{min-height:100%;width:100%;margin:0 auto;max-width:1680px;height:100%}@media only screen and (min-width: 601px){.only-handhelds{display:none !important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500}h4{font-size:2rem;margin:22px 0 14px;line-height:110%}@media only screen and (max-width: 600px){h4{font-size:20px;margin:2px 0 8px}}input,[contenteditable=true]{caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color);background-color:transparent}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{visibility:hidden;position:absolute;right:0}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40 !important;color:var(--danger-color) !important}.danger .c-ripple__circle{background-color:rgba(223, 63, 64, 0.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec !important;color:var(--primary-color) !important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51, 144, 236, 0.08);background-color:var(--light-primary-color)}.blue:before,.primary:before,.danger:before{color:inherit !important}.bg-warning{background:#fed85a !important}.contextmenu{position:fixed !important;right:auto !important;bottom:auto !important;width:auto !important;z-index:4 !important}.preloader{width:50px;height:50px;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@-webkit-keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@-webkit-keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@-webkit-keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@-webkit-keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@keyframes fade-out-backwards-opacity{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{position:fixed;left:50%;top:50%;transform:translate(-50%, -50%);padding:.5rem 1rem;background-color:rgba(0,0,0,.66);color:#fff;font-size:1rem;border-radius:10px;-webkit-animation:fade-in-opacity-fade-out-opacity 3s linear forwards;animation:fade-in-opacity-fade-out-opacity 3s linear forwards;z-index:5;max-width:22.5rem}.toast b{color:inherit}hr{width:100%;border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem}.user-title,b{color:#000;color:var(--primary-text-color);font-weight:bolder}.user-last-message b{font-weight:400}.avatar-edit{position:relative;border-radius:50%;cursor:pointer;overflow:hidden}.avatar-edit-canvas{max-width:100%;max-height:100%;width:100%;height:100%;background:linear-gradient(#72d5fd, #2a9ef1);background:linear-gradient(var(--avatar-color-top), var(--avatar-color-bottom))}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{position:absolute;font-size:48px;line-height:48px;top:50%;left:50%;transform:translateY(-50%) translateX(-50%);z-index:2;color:#fff}.avatar-edit .avatar-placeholder{position:absolute;left:0;top:0;width:100%;height:100%;filter:brightness(0.7)}.missing-icon{width:1.5rem;height:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{max-height:23.5rem;position:absolute;width:100%;top:calc(100% + .5rem);left:0;overflow:hidden;background-color:#fff;background-color:var(--surface-color);z-index:3;border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;transition:opacity .2s ease-out,transform .2s ease-out;transform:scale(0.95);transform-origin:top center;opacity:0}.select-wrapper.active{transform:scale(1);opacity:1}.select-wrapper ul{margin:.5rem 0}.select-wrapper li{align-items:center;padding:0 1rem;justify-content:space-between;height:3.5rem;cursor:pointer;text-align:left;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px}html.no-touch .select-wrapper li:hover,html.no-touch .select-wrapper li:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{height:26px;width:26px;font-size:26px;line-height:1}.select-wrapper .scrollable{position:relative}.phone-code{color:#9e9e9e;text-align:right}.auth-image{width:166px;height:166px;margin:0 auto 18px;position:relative}@media only screen and (max-width: 600px){.auth-image{width:120px;height:120px}}.phone-edit{display:inline-block;width:24px;height:24px;margin-left:.4rem;opacity:.5;transition:.2s opacity;cursor:pointer;font-size:1.5rem}@media only screen and (max-width: 600px){.phone-edit{margin-top:-14px}}html.no-touch .phone-edit:hover,html.no-touch .phone-edit:active{opacity:1}span.emoji{display:inline !important;vertical-align:unset !important;font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol;line-height:1 !important}@media not screen and (-webkit-min-device-pixel-ratio: 2),not screen and (min-device-pixel-ratio: 2),not screen and (min-resolution: 192dpi),not screen and (min-resolution: 2dppx){html:not(.is-safari) span.emoji{margin-right:5px !important}html:not(.is-safari) avatar-element span.emoji{margin-right:0 !important}}img.emoji{width:18px;height:18px;display:inline-block;max-width:100%;max-height:100%;vertical-align:middle}[contenteditable=true]{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;outline:none;cursor:text;white-space:pre-wrap}[contenteditable][data-placeholder]:empty:before{content:attr(data-placeholder);color:#a2acb4;display:block;pointer-events:none}.sticky_sentinel{position:absolute;left:0;right:0;visibility:hidden;pointer-events:none}.super-stickers{width:100%;display:grid;grid-template-columns:repeat(auto-fill, 80px);grid-template-columns:repeat(auto-fill, var(--esg-sticker-size));grid-column-gap:1px;justify-content:space-between}html.no-touch .super-sticker:hover,html.no-touch .super-sticker:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{padding-top:13px;padding-bottom:13px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative}@media only screen and (min-width: 601px){.show-more{padding-left:8px}}.show-more .tgico-down{float:left;padding-right:32px;padding-left:16px;font-size:24px;color:#707579;color:var(--secondary-text-color)}.content-empty{color:#707579;color:var(--secondary-text-color)}@-webkit-keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@keyframes grow-icon{0%{transform:scale(0.5);opacity:.8}50%{transform:scale(1.1);opacity:1}100%{transform:scale(1)}}@-webkit-keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}@keyframes hide-icon{from{transform:scale(1);opacity:.4}to{transform:scale(0.5);opacity:0}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{width:100%;display:grid;grid-template-columns:repeat(3, 1fr);grid-auto-rows:1fr;grid-gap:.25rem}.grid-item{height:0;padding-bottom:100%;position:relative;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.grid-item-media{position:absolute;left:0;top:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.animated-super-row{--translateY: 100%;position:absolute;left:0;top:0;right:0;bottom:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0, calc(var(--translateY) * -1), 0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0, var(--translateY), 0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{position:absolute;left:0;top:0;bottom:0;right:0}middle-ellipsis-element{width:100%;overflow:hidden;display:block}.album-item-media{width:100%;height:100%}html.no-touch .hover-effect:hover,html.no-touch .hover-effect:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.progress-ring{position:absolute;top:0;left:0;pointer-events:none}.progress-ring__circle{transition:stroke-dashoffset;stroke-linecap:round}.rlottie,.rlottie-vector{left:0;top:0;bottom:0;right:0;position:absolute;max-width:100%;max-height:100%;width:100%;height:100%}.rlottie-icon{position:relative;pointer-events:none}body.animation-level-2 .rlottie.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.media-photo,.media-video,.media-sticker,.media-round,.media-poster{position:absolute;top:0;right:0;bottom:0;left:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-video.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-poster.fade-in{-webkit-animation:fade-in-opacity .2s ease-in-out forwards;animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-video.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-poster.fade-out{-webkit-animation:fade-out-opacity .2s ease-in-out forwards;animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{margin:auto;-o-object-fit:contain;object-fit:contain;width:100%;height:100%;max-width:100%;max-height:100%}.media-round{max-width:280px;max-width:var(--round-video-size);max-height:280px;max-height:var(--round-video-size);z-index:1}.media-round canvas{width:100%;height:100%;border-radius:50%;position:relative}.media-round .video-time{padding:0 .375rem;background-color:hsla(85.5319, 36.9171%, 40.402%, .4) !important;background-color:var(--message-highlightning-color) !important}.media-round .video-time:before,.media-round .video-time:after{margin-left:.25rem}.media-round.is-unread .video-time:before{order:1;width:.5rem;height:.5rem;background-color:#fff;border-radius:50%;content:\" \"}.media-round.is-paused .video-time:after{content:\"\";display:flex;align-items:center;font-size:1.125rem;order:2}.gradient-delimiter{width:100%;height:.75rem;background-color:#f4f4f5;background-color:var(--background-color-true);position:relative}.gradient-delimiter:before{content:\" \";position:absolute;left:0;top:0;right:0;bottom:0;background:linear-gradient(180deg, rgba(0, 0, 0, 0.06) 0%, rgba(0, 0, 0, 0) 20%, rgba(0, 0, 0, 0) 94%, rgba(0, 0, 0, 0.06) 100%)}.sidebar-header.with-border{min-height:3.5625rem;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding:.5rem 0 !important;margin-bottom:.75rem;box-shadow:0px 1px 3px 0px rgba(0, 0, 0, .06);box-shadow:0px 1px 3px 0px var(--section-box-shadow-color)}.sidebar-left-section.no-shadow{box-shadow:none !important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{margin:-0.1875rem 0 1rem;font-size:.875rem;padding:0 1.5rem}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}hr{display:none !important}.tgico-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled:before{font-size:20px !important;padding:0 2px}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.verified-check{fill:#fff}.verified-background{fill:#33a8e5}.navigable-list .active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{display:grid;grid-column-gap:2.44px;grid-template-columns:repeat(auto-fill, 2.625rem);justify-content:space-between;font-size:2.125rem;line-height:2.125rem}.super-emojis .super-emoji{display:inline-block;margin:0 .0625rem;padding:.25rem;line-height:inherit;border-radius:8px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:2.625rem;height:2.625rem}html:not(.emoji-supported) .super-emojis .super-emoji{position:relative}.super-emojis .super-emoji .emoji-placeholder{position:absolute;left:7px;top:7px;width:1.75rem;height:1.75rem;border-radius:50%;background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color);pointer-events:none}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{width:100%;height:100%;vertical-align:unset;margin:0}html.no-touch .super-emojis .super-emoji:hover,html.no-touch .super-emojis .super-emoji:active{background-color:rgba(112, 117, 121, 0.08);background-color:var(--light-secondary-text-color)}.tgico-char:before{font-family:\"Roboto\" !important;font-weight:500;width:1.5rem;text-align:center}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status-icon{position:absolute;line-height:1 !important}.verified-icon{flex:0 0 auto;width:1.25rem;height:1.25rem;margin-left:.125rem}.movable-element{--size: .5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{left:0;right:0;height:var(--size);cursor:row-resize}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{top:0;bottom:0;width:var(--size);cursor:col-resize}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw,.movable-element-resize-handler-side-se{width:var(--size);height:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-nw{cursor:nwse-resize}.movable-element-resize-handler-side-ne{top:0;right:0}.movable-element-resize-handler-side-se{right:0;bottom:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{top:0;left:0}","@font-face{font-family:\"tgico\";src:url(\"assets/fonts/tgico.ttf?onwvlx\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?onwvlx\") format(\"woff\"),url(\"assets/fonts/tgico.svg?onwvlx#tgico\") format(\"svg\");font-weight:normal;font-style:normal;font-display:block}[class^=tgico-],.tgico:before,.tgico:after,[class*=\" tgico-\"]:before,[class*=\" tgico-\"]:after{font-family:\"tgico\";speak:never;font-style:normal;font-weight:normal;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.057ba0ad34ac8f214638.bundle.js b/public/main.e6c3f7635c825540f276.bundle.js similarity index 88% rename from public/main.057ba0ad34ac8f214638.bundle.js rename to public/main.e6c3f7635c825540f276.bundle.js index f5a0b19d1..caa639315 100644 --- a/public/main.057ba0ad34ac8f214638.bundle.js +++ b/public/main.e6c3f7635c825540f276.bundle.js @@ -1,2 +1,2 @@ -!function(e){function t(t){for(var n,a,i=t[0],r=t[1],c=0,s=[];c1)&&!o.a.MSStream,u=!!("safari"in o.a)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=u&&s,f=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(e,t,n){"use strict";n.r(t),n.d(t,"IS_TOUCH_SUPPORTED",(function(){return o}));const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},function(e,t,n){"use strict";const o="undefined"!=typeof window?window:self;t.a=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var o=n(1),a=n(0),i=n(6),r=n(4);const c=a.IS_SAFARI&&a.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],a=Object(i.a)(o.target,"scrollable-y");if(a){const i=o[e],r=t-i,c=a.scrollTop,s=a.scrollHeight,u=a.clientHeight,d=c?Math.round(c+a.clientHeight+r):c+r;(s===u||d>=s||d<=0)&&n.preventDefault()}else n.preventDefault()};let a=0;document.addEventListener("focusin",i=>{!i.target.classList.contains("is-sticky-input-bugged")||i.timeStamp-a<50||(Object(r.a)(i.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]}))},{passive:!0}),document.addEventListener("focusout",e=>{document.removeEventListener("touchmove",o,n),a=e.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(r.a)(document.activeElement)},{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},function(e,t,n){"use strict";function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout(()=>{e.style.transform=""},0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e,t){return e.closest("."+t)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";const o={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.4",versionFull:"1.0.4 (77)",build:77,langPackVersion:"0.3.9",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};o.isMainDomain&&(o.id=2496,o.hash="8da85b0d5bfe62527e5b244c209159c3"),t.a=o},function(e,t,n){"use strict";function o(){return!(!document.activeElement||!document.activeElement.blur)&&(document.activeElement.blur(),!0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";let o;function a(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map(e=>document.fonts.load(e))),new Promise(e=>setTimeout(e,1e3))]):Promise.resolve())}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);t.a=o},function(e,t,n){"use strict";n.r(t);var o=n(7),a=n(8),i=n(5),r=n(3),c=n(9),s=n(10),u=n(0),d=(n(12),n(13),n(14),function(e,t,n,o){return new(n||(n=Promise))((function(a,i){function r(e){try{s(o.next(e))}catch(e){i(e)}}function c(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((o=o.apply(e,t||[])).next())}))});document.addEventListener("DOMContentLoaded",()=>d(void 0,void 0,void 0,(function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)});const e=window.visualViewport||window;let t,d=!1;const l=()=>{const n=.01*(d&&!v.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.IS_TOUCH_SUPPORTED&&t1&&Object(a.a)(),t=n,document.documentElement.style.setProperty("--vh",n+"px"))},f=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=f;const[m,h,b,v,g,p,P]=yield Promise.all([n.e(24).then(n.bind(null,27)),Promise.resolve().then(n.bind(null,1)),Promise.resolve().then(n.bind(null,0)),n.e(22).then(n.bind(null,15)),Promise.all([n.e(0),n.e(28)]).then(n.bind(null,17)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,16)),n.e(27).then(n.bind(null,28))]);if(window.addEventListener("resize",l),l(),r.a){const t=()=>{d=1===n&&r.a&&!v.default.isOverlayActive,l(),e!==window&&(d?(window.removeEventListener("resize",l),e.addEventListener("resize",l)):(e.removeEventListener("resize",l),window.addEventListener("resize",l)))};let n;v.default.addEventListener("im_tab_change",e=>{const o=void 0!==n;n=e,(o||1===n)&&t()}),v.default.addEventListener("overlay_toggle",()=>{t()})}b.IS_FIREFOX&&!s.a&&document.addEventListener("dragstart",e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return Object(i.a)(e),!1}),document.addEventListener("dragstart",e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1}),b.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),b.IS_APPLE?(b.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),b.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):b.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const y=performance.now(),E=p.default.getCacheLangPack(),[S,w]=yield Promise.all([g.default.getState(),E]);function I(e,t){e.style.opacity="0",t.then(()=>{window.requestAnimationFrame(()=>{e.style.opacity=""})})}p.default.setTimeFormat(S.settings.timeFormat),v.default.setThemeListener(),w.appVersion!==o.a.langPackVersion&&p.default.getLangPack(w.lang_code),console.log("got state, time:",performance.now()-y);const O=S.authState;if("authStateSignedIn"!==O._){console.log("Will mount auth page:",O._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,o;if(e){t=e.querySelector(".scrollable"),h.IS_TOUCH_SUPPORTED&&!u.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.all([n.e(0),n.e(1)]).then(n.bind(null,24)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))]).then(([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()})}catch(e){}switch(O._){case"authStateSignIn":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(15)]).then(n.bind(null,20))).default.mount();break;case"authStateSignQr":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(18)]).then(n.bind(null,22))).default.mount();break;case"authStateAuthCode":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(12)]).then(n.bind(null,23))).default.mount(O.sentCode);break;case"authStatePassword":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(13)]).then(n.bind(null,21))).default.mount();break;case"authStateSignUp":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(16)]).then(n.bind(null,25))).default.mount(O.authCode)}if(t){o&&(yield o);I(t,"fonts"in document?Promise.race([new Promise(e=>setTimeout(e,1e3)),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(30)]).then(n.bind(null,19))).default.mount();const L=(yield n.e(19).then(n.bind(null,18))).ripple;Array.from(document.getElementsByClassName("rp")).forEach(e=>L(e))})))},function(e,t,n){},function(e,t,n){},function(e,t,n){}]); -//# sourceMappingURL=main.057ba0ad34ac8f214638.bundle.js.map \ No newline at end of file +!function(e){function t(t){for(var n,a,i=t[0],r=t[1],c=0,s=[];c1)&&!o.a.MSStream,u=!!("safari"in o.a)||!(!a||!(/\b(iPad|iPhone|iPod)\b/.test(a)||a.match("Safari")&&!a.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,l=u&&s,f=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},function(e,t,n){"use strict";n.r(t),n.d(t,"IS_TOUCH_SUPPORTED",(function(){return o}));const o="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},function(e,t,n){"use strict";const o="undefined"!=typeof window?window:self;t.a=o},function(e,t,n){"use strict";n.d(t,"a",(function(){return c})),n.d(t,"b",(function(){return s}));var o=n(1),a=n(0),i=n(6),r=n(4);const c=a.IS_SAFARI&&a.IS_MOBILE&&o.IS_TOUCH_SUPPORTED;if(c){let e="clientY",t=0;const n={capture:!0,passive:!1},o=n=>{const o=n.touches[0],a=Object(i.a)(o.target,"scrollable-y");if(a){const i=o[e],r=t-i,c=a.scrollTop,s=a.scrollHeight,u=a.clientHeight,d=c?Math.round(c+a.clientHeight+r):c+r;(s===u||d>=s||d<=0)&&n.preventDefault()}else n.preventDefault()};let a=0;document.addEventListener("focusin",i=>{!i.target.classList.contains("is-sticky-input-bugged")||i.timeStamp-a<50||(Object(r.a)(i.target),document.addEventListener("touchmove",o,n),document.addEventListener("touchstart",n=>{if(n.touches.length>1)return;const o=n.touches[0];t=o[e]}))},{passive:!0}),document.addEventListener("focusout",e=>{document.removeEventListener("touchmove",o,n),a=e.timeStamp},{passive:!0}),document.addEventListener("visibilitychange",()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&Object(r.a)(document.activeElement)},{passive:!0})}function s(e){c&&e.classList.add("is-sticky-input-bugged")}},function(e,t,n){"use strict";function o(e){e.style.transform="translateY(-99999px)",e.focus(),setTimeout(()=>{e.style.transform=""},0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e){if(e=e||window.event){e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";function o(e,t){return e.closest("."+t)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";const o={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.4",versionFull:"1.0.4 (81)",build:81,langPackVersion:"0.3.9",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};o.isMainDomain&&(o.id=2496,o.hash="8da85b0d5bfe62527e5b244c209159c3"),t.a=o},function(e,t,n){"use strict";function o(){return!(!document.activeElement||!document.activeElement.blur)&&(document.activeElement.blur(),!0)}n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";let o;function a(){return o||(o="fonts"in document?Promise.race([Promise.all(["400 1rem Roboto","500 1rem Roboto","500 1rem tgico"].map(e=>document.fonts.load(e))),new Promise(e=>setTimeout(e,1e3))]):Promise.resolve())}n.d(t,"a",(function(){return a}))},function(e,t,n){"use strict";const o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i);t.a=o},function(e,t,n){"use strict";n.r(t);var o=n(7),a=n(8),i=n(5),r=n(3),c=n(9),s=n(10),u=n(0),d=(n(12),n(13),n(14),function(e,t,n,o){return new(n||(n=Promise))((function(a,i){function r(e){try{s(o.next(e))}catch(e){i(e)}}function c(e){try{s(o.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?a(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,c)}s((o=o.apply(e,t||[])).next())}))});document.addEventListener("DOMContentLoaded",()=>d(void 0,void 0,void 0,(function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)});const e=window.visualViewport||window;let t,d=!1;const l=()=>{const n=.01*(d&&!v.default.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(b.IS_TOUCH_SUPPORTED&&t1&&Object(a.a)(),t=n,document.documentElement.style.setProperty("--vh",n+"px"))},f=new Proxy(Worker,{construct:(e,t)=>new e(t[0]+location.search)});Worker=f;const[m,b,h,v,g,p,P]=yield Promise.all([n.e(24).then(n.bind(null,27)),Promise.resolve().then(n.bind(null,1)),Promise.resolve().then(n.bind(null,0)),n.e(22).then(n.bind(null,15)),Promise.all([n.e(0),n.e(28)]).then(n.bind(null,17)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,16)),n.e(27).then(n.bind(null,28))]);if(window.addEventListener("resize",l),l(),r.a){const t=()=>{d=1===n&&r.a&&!v.default.isOverlayActive,l(),e!==window&&(d?(window.removeEventListener("resize",l),e.addEventListener("resize",l)):(e.removeEventListener("resize",l),window.addEventListener("resize",l)))};let n;v.default.addEventListener("im_tab_change",e=>{const o=void 0!==n;n=e,(o||1===n)&&t()}),v.default.addEventListener("overlay_toggle",()=>{t()})}h.IS_FIREFOX&&!s.a&&document.addEventListener("dragstart",e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return Object(i.a)(e),!1}),document.addEventListener("dragstart",e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1}),h.IS_FIREFOX&&document.documentElement.classList.add("is-firefox"),h.IS_APPLE?(h.IS_SAFARI&&document.documentElement.classList.add("is-safari"),document.documentElement.classList.add("emoji-supported"),h.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):h.IS_ANDROID&&document.documentElement.classList.add("is-android"),b.IS_TOUCH_SUPPORTED?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const y=performance.now(),E=p.default.getCacheLangPack(),[S,w]=yield Promise.all([g.default.getState(),E]);function I(e,t){e.style.opacity="0",t.then(()=>{window.requestAnimationFrame(()=>{e.style.opacity=""})})}p.default.setTimeFormat(S.settings.timeFormat),v.default.setThemeListener(),w.appVersion!==o.a.langPackVersion&&p.default.getLangPack(w.lang_code),console.log("got state, time:",performance.now()-y);const O=S.authState;if("authStateSignedIn"!==O._){console.log("Will mount auth page:",O._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,o;if(e){t=e.querySelector(".scrollable"),b.IS_TOUCH_SUPPORTED&&!u.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.all([n.e(0),n.e(1)]).then(n.bind(null,24)),Promise.all([n.e(0),n.e(1)]).then(n.bind(null,26))]).then(([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()})}catch(e){}switch(O._){case"authStateSignIn":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(15)]).then(n.bind(null,20))).default.mount();break;case"authStateSignQr":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(18)]).then(n.bind(null,22))).default.mount();break;case"authStateAuthCode":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(12)]).then(n.bind(null,23))).default.mount(O.sentCode);break;case"authStatePassword":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(13)]).then(n.bind(null,21))).default.mount();break;case"authStateSignUp":o=(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(3),n.e(16)]).then(n.bind(null,25))).default.mount(O.authCode)}if(t){o&&(yield o);I(t,"fonts"in document?Promise.race([new Promise(e=>setTimeout(e,1e3)),document.fonts.ready]):Promise.resolve())}}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),Object(c.a)()),(yield Promise.all([n.e(0),n.e(1),n.e(2),n.e(30)]).then(n.bind(null,19))).default.mount();const L=(yield n.e(19).then(n.bind(null,18))).ripple;Array.from(document.getElementsByClassName("rp")).forEach(e=>L(e))})))},function(e,t,n){},function(e,t,n){},function(e,t,n){}]); +//# sourceMappingURL=main.e6c3f7635c825540f276.bundle.js.map \ No newline at end of file diff --git a/public/main.057ba0ad34ac8f214638.bundle.js.map b/public/main.e6c3f7635c825540f276.bundle.js.map similarity index 98% rename from public/main.057ba0ad34ac8f214638.bundle.js.map rename to public/main.e6c3f7635c825540f276.bundle.js.map index 02e97f31e..a879ca896 100644 --- a/public/main.057ba0ad34ac8f214638.bundle.js.map +++ b/public/main.e6c3f7635c825540f276.bundle.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/environment/userAgent.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","10","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","IS_TOUCH_SUPPORTED","window","DocumentTouch","ctx","self","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","preventDefault","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","activeElement","blur","fixSafariStickyInputFocusing","input","add","fixSafariStickyInput","style","transform","focus","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","el","className","closest","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","blurActiveElement","loadFonts","race","map","font","fonts","load","IS_EMOJI_SUPPORTED","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","then","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName","forEach"],"mappings":"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","file":"main.057ba0ad34ac8f214638.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t10: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"11\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"374e7aee7f00ae75e442\",\"1\":\"492b807a01f9ca3e3cf5\",\"2\":\"db718300c1179401e843\",\"3\":\"e4137dca352aff127912\",\"4\":\"24fcf63624b53b25e38a\",\"5\":\"65a3414c4ad3195165a3\",\"6\":\"e3732f1eca587373fceb\",\"7\":\"d43d90e04a37000c4a72\",\"8\":\"08583f871c38d9c5a426\",\"9\":\"6c1df42c7f7435991f85\",\"11\":\"beae65199e734a6850d7\",\"12\":\"88ffeed61735d3f9b2f9\",\"13\":\"20324e79c22f5893ae52\",\"14\":\"6aa9cb644edbb8b0e00a\",\"15\":\"e99c07b61f679564532a\",\"16\":\"1fd991b3cf3f32baf9f1\",\"17\":\"5fb0ac85d824e4640fa2\",\"18\":\"25e70e3100f53609fdd3\",\"19\":\"5ca6388c23a93b466714\",\"20\":\"323657c2992748ecc90f\",\"21\":\"144731bc9e86ebbe5f4c\",\"22\":\"cb583e71915f8cb17b01\",\"23\":\"29950b10ac60f39c30c8\",\"24\":\"a6d4df44484e0cad8aaa\",\"25\":\"92c7213c63e77acba97b\",\"26\":\"29f2e686ad8e61e8d92e\",\"27\":\"4dfec84fdb513eebf355\",\"28\":\"eae42fed46df70aa5787\",\"29\":\"fb2854d59faeefc88b14\",\"30\":\"7626947e5c24cc51a196\",\"31\":\"a8fac6fac9101367fb68\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n setTimeout(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.9',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport { cancelEvent } from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n const [_, touchSupport, userAgent, rootScope, appStateManager, I18n, __/* , ___ */] = await Promise.all([\n import('./lib/polyfill'),\n import('./environment/touchSupport'),\n import('./environment/userAgent'),\n import('./lib/rootScope'),\n import('./lib/appManagers/appStateManager'),\n import('./lib/langPack'),\n import('./helpers/peerIdPolyfill'),\n // import('./helpers/cacheFunctionPolyfill')\n ]);\n\n //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!touchSupport.IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/environment/userAgent.ts","webpack:///./src/environment/touchSupport.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.ts","webpack:///./src/helpers/dom/findUpClassName.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/dom/blurActiveElement.ts","webpack:///./src/helpers/dom/loadFonts.ts","webpack:///./src/environment/emojiSupport.ts","webpack:///./src/index.ts"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","installedModules","10","jsonpScriptSrc","__webpack_require__","p","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","error","Error","script","loadScript","src","retries","onScriptComplete","document","createElement","charset","timeout","nc","setAttribute","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","cacheBust","Date","now","retryScript","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","this","oldJsonpFunction","slice","s","USER_AGENT","navigator","userAgent","IS_APPLE","search","IS_ANDROID","toLowerCase","indexOf","IS_CHROMIUM","test","vendor","IS_APPLE_MOBILE","platform","maxTouchPoints","MSStream","IS_SAFARI","match","IS_FIREFOX","IS_MOBILE_SAFARI","IS_MOBILE","IS_TOUCH_SUPPORTED","window","DocumentTouch","ctx","self","IS_STICKY_INPUT_BUGGED","startY","capture","passive","onTouchMove","touch","touches","scrollable","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","Math","round","preventDefault","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","activeElement","blur","fixSafariStickyInputFocusing","input","add","fixSafariStickyInput","style","transform","focus","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","el","className","closest","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","location","hostname","suffix","blurActiveElement","loadFonts","race","map","font","fonts","load","IS_EMOJI_SUPPORTED","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","rootScope","default","isOverlayActive","height","innerHeight","touchSupport","documentElement","setProperty","workerProxy","Proxy","Worker","construct","args","_","appStateManager","I18n","__","toggleResizeMode","tabId","wasTabId","tagName","perf","performance","langPromise","getCacheLangPack","state","getState","fadeInWhenFontsReady","elem","opacity","then","requestAnimationFrame","setTimeFormat","settings","timeFormat","setThemeListener","appVersion","getLangPack","lang_code","log","authState","getElementById","pagePromise","querySelector","placeholder","prepend","append","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","ready","ripple","Array","from","getElementsByClassName","forEach"],"mappings":"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","file":"main.e6c3f7635c825540f276.bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t10: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"11\":\"npm.qr-code-styling\"}[chunkId]||chunkId) + \".\" + {\"0\":\"8d087bcb865339158351\",\"1\":\"99b84ec019c74ae469a1\",\"2\":\"53fa88cb7bccd9cf2f74\",\"3\":\"e4137dca352aff127912\",\"4\":\"24fcf63624b53b25e38a\",\"5\":\"4c631eb421e5df7ab421\",\"6\":\"02b679f962719848ba99\",\"7\":\"d43d90e04a37000c4a72\",\"8\":\"f871e2581e2cce7ecaef\",\"9\":\"6c1df42c7f7435991f85\",\"11\":\"beae65199e734a6850d7\",\"12\":\"28d471f14ee77650d243\",\"13\":\"6f53ed67b434abfeb8b3\",\"14\":\"e0b3ee5569e2564c790f\",\"15\":\"b14001265d6da1e62429\",\"16\":\"1587e222e41a6d3aa087\",\"17\":\"5fb0ac85d824e4640fa2\",\"18\":\"33a13d3129fb705afcd7\",\"19\":\"577567d0b0e7b3f9570b\",\"20\":\"323657c2992748ecc90f\",\"21\":\"144731bc9e86ebbe5f4c\",\"22\":\"cb583e71915f8cb17b01\",\"23\":\"29950b10ac60f39c30c8\",\"24\":\"a6d4df44484e0cad8aaa\",\"25\":\"ba804e71a7bf44cd8cd0\",\"26\":\"29f2e686ad8e61e8d92e\",\"27\":\"4dfec84fdb513eebf355\",\"28\":\"eae42fed46df70aa5787\",\"29\":\"fb2854d59faeefc88b14\",\"30\":\"7626947e5c24cc51a196\",\"31\":\"a8fac6fac9101367fb68\"}[chunkId] + \".chunk.js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tfunction loadScript(src, retries) {\n \t\t\t\t var script = document.createElement('script');\n \t\t\t\t var retryAttempt = 999999 - retries + 1;\n \t\t\t\t var retryAttemptString = '&retry-attempt=' + retryAttempt;\n \t\t\t\t var onScriptComplete;\n\n \t\t\t\t script.charset = 'utf-8';\n \t\t\t\t script.timeout = 120;\n \t\t\t\t if (__webpack_require__.nc) {\n \t\t\t\t script.setAttribute('nonce', __webpack_require__.nc);\n \t\t\t\t }\n \t\t\t\t script.src = src;\n\n \t\t\t\t onScriptComplete = function(event) {\n \t\t\t\t // avoid mem leaks in IE.\n \t\t\t\t script.onerror = script.onload = null;\n \t\t\t\t clearTimeout(timeout);\n \t\t\t\t var chunk = installedChunks[chunkId];\n \t\t\t\t if (chunk !== 0) {\n \t\t\t\t if (chunk) {\n \t\t\t\t if (retries === 0) {\n \t\t\t\t var errorType =\n \t\t\t\t event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t var realSrc = event && event.target && event.target.src;\n \t\t\t\t error.message =\n \t\t\t\t 'Loading chunk ' +\n \t\t\t\t chunkId +\n \t\t\t\t ' failed after 999999 retries.\\n(' +\n \t\t\t\t errorType +\n \t\t\t\t ': ' +\n \t\t\t\t realSrc +\n \t\t\t\t ')';\n \t\t\t\t error.name = 'ChunkLoadError';\n \t\t\t\t error.type = errorType;\n \t\t\t\t error.request = realSrc;\n \t\t\t\t chunk[1](error);\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t } else {\n \t\t\t\t setTimeout(function() {\n \t\t\t\t var cacheBust = (function() {\n \t\t\t\t return Date.now();\n \t\t\t\t })();\n \t\t\t\t +retryAttemptString;\n \t\t\t\t var retryScript = loadScript(\n \t\t\t\t jsonpScriptSrc(chunkId) + '?' + cacheBust,\n \t\t\t\t retries - 1\n \t\t\t\t );\n \t\t\t\t document.head.appendChild(retryScript);\n \t\t\t\t }, 0);\n \t\t\t\t }\n \t\t\t\t } else {\n \t\t\t\t installedChunks[chunkId] = undefined;\n \t\t\t\t }\n \t\t\t\t }\n \t\t\t\t };\n \t\t\t\t var timeout = setTimeout(function() {\n \t\t\t\t onScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t }, 120000);\n \t\t\t\t script.onerror = script.onload = onScriptComplete;\n \t\t\t\t return script;\n \t\t\t\t}\n\n \t\t\t\tvar script = loadScript(jsonpScriptSrc(chunkId), 999999);\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = this[\"webpackJsonp\"] = this[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 11);\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// @ts-ignore\r\nexport const IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\r\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_TOUCH_SUPPORTED } from \"../../environment/touchSupport\";\nimport { IS_MOBILE, IS_SAFARI } from \"../../environment/userAgent\";\nimport findUpClassName from \"./findUpClassName\";\nimport fixSafariStickyInput from \"./fixSafariStickyInput\";\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n let key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n //console.log('touchmove y', touch[key], startY);\n \n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n //const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n //console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n //console.log('touchmove no scrollable', e, touch);\n }\n\n //if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n \n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n \n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n \n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement && \n document.activeElement.classList.contains('is-sticky-input-bugged') && \n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function fixSafariStickyInput(input: HTMLElement) {\r\n input.style.transform = 'translateY(-99999px)';\r\n /* input.style.position = 'fixed';\r\n input.style.top = '-99999px';\r\n input.style.left = '0'; */\r\n input.focus();\r\n \r\n setTimeout(() => {\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n /* input.style.position = '';\r\n input.style.top = ''; */\r\n input.style.transform = '';\r\n //fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\r\n \r\n /* setTimeout(() => {\r\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\r\n }, 50); */\r\n }, 0);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function cancelEvent(event: Event) {\r\n event = event || window.event;\r\n if(event) {\r\n // @ts-ignore\r\n event = event.originalEvent || event;\r\n\r\n try {\r\n if(event.stopPropagation) event.stopPropagation();\r\n if(event.preventDefault) event.preventDefault();\r\n event.returnValue = false;\r\n event.cancelBubble = true;\r\n } catch(err) {}\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//export function findUpClassName(el: any, className: string): T;\r\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\r\n return (el as any).closest('.' + className);\r\n /* if(el.classList.contains(className)) return el; // 03.02.2020\r\n\r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.classList.contains(className)) \r\n return el;\r\n }\r\n return null; */\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.9',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function blurActiveElement() {\r\n if(document.activeElement && (document.activeElement as HTMLInputElement).blur) {\r\n (document.activeElement as HTMLInputElement).blur();\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nlet promise: Promise;\r\nexport default function loadFonts(): Promise {\r\n if(promise) return promise;\r\n return promise = 'fonts' in document ? \r\n Promise.race([\r\n // @ts-ignore\r\n Promise.all(['400 1rem Roboto', '500 1rem Roboto', '500 1rem tgico'].map(font => document.fonts.load(font))),\r\n new Promise((resolve) => setTimeout(resolve, 1e3))\r\n ]) : \r\n Promise.resolve();\r\n}\r\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\r\n\r\nexport default IS_EMOJI_SUPPORTED;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport { cancelEvent } from './helpers/dom/cancelEvent';\nimport { IS_STICKY_INPUT_BUGGED } from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport { IS_MOBILE_SAFARI } from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport './scss/tgico.scss';\n/* import { computeCheck } from './lib/crypto/srp';\nimport { salt1, salt2, g, p, srp_id, secure_random, srp_B, password } from './mock/srp'; */\n\n//console.log('pineapples are in my head');\n\n/* console.time('get storage1');\nimport * as a from './lib/config';\nimport * as b from './lib/mtproto/mtproto_config';\nimport * as c from './helpers/userAgent';\nimport * as d from './lib/mtproto/mtprotoworker';\nimport * as e from './lib/polyfill';\nimport * as f from './lib/storage';\na && b && c && d && e && f;\nconsole.timeEnd('get storage1'); */\n\n/* Promise.all([\n import('./components/pageIm'),\n import('./components/pageSignIn'),\n import('./components/misc'),\n import('./lib/storage')\n]).then(imports => {\n let [pageIm, pageSignIn, misc, AppStorage] = imports; */\n\n document.addEventListener('DOMContentLoaded', async() => {\n //let socket = new Socket(2);\n\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n \n if(this.hasAttribute(name)) {\n if(force) return true;\n \n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n \n this.setAttribute(name, \"\");\n return true;\n };\n }\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n // @ts-ignore\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n // @ts-ignore\n const vh = (setViewportVH && !rootScope.default.isOverlayActive ? w.height || w.innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(touchSupport.IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n //const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n //console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n //console.log(target, args);\n const url = args[0] + location.search;\n\n return new target(url);\n }\n };\n \n const workerProxy = new Proxy(Worker, workerHandler);\n Worker = workerProxy;\n\n const [_, touchSupport, userAgent, rootScope, appStateManager, I18n, __/* , ___ */] = await Promise.all([\n import('./lib/polyfill'),\n import('./environment/touchSupport'),\n import('./environment/userAgent'),\n import('./lib/rootScope'),\n import('./lib/appManagers/appStateManager'),\n import('./lib/langPack'),\n import('./helpers/peerIdPolyfill'),\n // import('./helpers/cacheFunctionPolyfill')\n ]);\n\n //console.timeEnd('get storage');\n\n window.addEventListener('resize', setVH);\n setVH();\n\n //console.log(new Uint8Array([255, 200, 145]).hex);\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !rootScope.default.isOverlayActive;\n setVH();\n \n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n \n let tabId: number;\n rootScope.default.addEventListener('im_tab_change', (id) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n \n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n });\n \n rootScope.default.addEventListener('overlay_toggle', () => {\n toggleResizeMode();\n });\n }\n\n if(userAgent.IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === \"IMG\") {\n e.preventDefault();\n return false;\n }\n });\n\n if(userAgent.IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\n }\n\n if(userAgent.IS_APPLE) {\n if(userAgent.IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n \n document.documentElement.classList.add('emoji-supported');\n\n if(userAgent.IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(userAgent.IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!touchSupport.IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n /* if(config.isServiceWorkerSupported) {\n await navigator.serviceWorker.ready;\n navigator.serviceWorker.controller ? true : await new Promise((resolve, reject) => {\n navigator.serviceWorker.addEventListener('controllerchange', resolve);\n });\n } */\n \n //console.time('get storage');\n\n const perf = performance.now();\n\n //import('./vendor/dateFormat');\n\n const langPromise = I18n.default.getCacheLangPack();\n\n const [state, langPack] = await Promise.all([\n appStateManager.default.getState(), \n langPromise\n ]);\n //I18n.getCacheLangPack();\n //console.log('got auth:', auth);\n //console.timeEnd('get storage');\n\n I18n.default.setTimeFormat(state.settings.timeFormat);\n\n rootScope.default.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.default.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n const authState = state.authState;\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!touchSupport.IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n \n }\n\n let pagePromise: Promise;\n //langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn': \n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr': \n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n }\n //});\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ? \n Promise.race([\n new Promise((resolve) => setTimeout(resolve, 1e3)), \n // @ts-ignore\n document.fonts.ready\n ]) : \n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* computeCheck(password, {\n current_algo: {\n salt1, \n salt2,\n p,\n g\n },\n srp_id,\n srp_B,\n secure_random,\n }).then(res => {\n console.log(res);\n }); */\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\t\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignQR')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pagePassword')).default.mount();\n }, 500); */\n /* setTimeout(async() => {\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\t\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n //getNearestDc();\n }\n\n const ripple = (await import('./components/ripple')).ripple;\n (Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n//});\n\n\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js b/public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js similarity index 99% rename from public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js rename to public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js index 22d9ff02c..33a90d4f1 100644 --- a/public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js +++ b/public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js @@ -1,4 +1,4 @@ !function(e){var t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={i:n,l:!1,exports:{}};return e[n].call(s.exports,s,s.exports,a),s.l=!0,s.exports}a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,t){if(1&t&&(e=a(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(a.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var s in e)a.d(n,s,function(t){return e[t]}.bind(null,s));return n},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},a.p="",a(a.s=1)}([function(e,t,a){ /*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */ -!function(e){"use strict";var t=(e,t,a,n)=>{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,h,u,f,_,v,b,P,w,S,k,C;const I=e.state;a=e.next_in,k=e.input,n=a+(e.avail_in-5),s=e.next_out,C=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=I.dmax,o=I.wsize,m=I.whave,d=I.wnext,y=I.window,c=I.hold,l=I.bits,g=I.lencode,h=I.distcode,u=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)C[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=k[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=h[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",I.mode=30;break e}if(c>>>=v,l-=v,v=s-i,P>v){if(v=P-v,v>m&&I.sane){e.msg="invalid distance too far back",I.mode=30;break e}if(w=0,S=y,0===d){if(w+=o-v,v2;)C[s++]=S[w++],C[s++]=S[w++],C[s++]=S[w++],b-=3;b&&(C[s++]=S[w++],b>1&&(C[s++]=S[w++]))}else{w=s-P;do{C[s++]=C[w++],C[s++]=C[w++],C[s++]=C[w++],b-=3}while(b>2);b&&(C[s++]=C[w++],b>1&&(C[s++]=C[w++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,h,u,f,_,v=0,b=0,P=0,w=0,S=0,k=0,C=0,I=0,A=0,M=0,R=null,E=0;const V=new Uint16Array(16),T=new Uint16Array(16);let D,U,B,x=null,F=0;for(v=0;v<=15;v++)V[v]=0;for(b=0;b=1&&0===V[w];w--);if(S>w&&(S=w),0===w)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(P=1;P0&&(0===e||1!==w))return-1;for(T[1]=0,v=1;v<15;v++)T[v+1]=T[v]+V[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){D=v-C,d[b]<_?(U=0,B=d[b]):d[b]>_?(U=x[F+d[b]],B=R[E+d[b]]):(U=96,B=0),l=1<>C)+g]=D<<24|U<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--V[v]){if(v===w)break;v=t[a+d[b]]}if(v>S&&(M&u)!==h){for(0===C&&(C=S),f+=P,k=v-C,I=1<852||2===e&&A>592)return 1;h=M&u,s[h]=S<<24|k<<16|f-m|0}}return 0!==M&&(s[f+M]=v-C<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:h,Z_NEED_DICT:u,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:P}=d,w=12,S=30,k=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function C(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const I=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,I(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},R=(e,t)=>{if(!e)return f;const a=new C;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let E,V,T=!0;const D=e=>{if(T){E=new Int32Array(512),V=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,E,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,V,0,e.work,{bits:5}),T=!1}e.lencode=E,e.lenbits=9,e.distcode=V,e.distbits=5},U=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,C,I,A,M,R,E,V,T,B,x,F,L,N,O,q,G,K,z=0;const j=new Uint8Array(4);let H,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===w&&(i.mode=13),d=e.next_out,p=e.output,I=e.avail_out,o=e.next_in,r=e.input,C=e.avail_in,A=i.hold,M=i.bits,R=C,E=I,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==P){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===C)break e;C--,A+=r[o++]<>>8&255,j[2]=A>>>16&255,j[3]=A>>>24&255,i.check=n(i.check,j,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>8),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(V=i.length,V>C&&(V=C),V&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+V),G)),512&i.flags&&(i.check=n(i.check,r,V,o)),C-=V,o+=V,i.length-=V),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===C)break e;V=0;do{G=r[o+V++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&V>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=w;break;case 10:for(;M<32;){if(0===C)break e;C--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===C)break e;C--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(D(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===C)break e;C--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(V=i.length,V){if(V>C&&(V=C),V>I&&(V=I),0===V)break e;p.set(r.subarray(o,o+V),d),C-=V,o+=V,I-=V,d+=V,i.length-=V;break}i.mode=w;break;case 17:for(;M<14;){if(0===C)break e;C--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,H={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],V=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,V=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,V=11+(127&A),A>>>=7,M-=7}if(i.have+V>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;V--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,H={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,H={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,H),i.distbits=H.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(C>=6&&I>=258){e.next_out=d,e.avail_out=I,e.next_in=o,e.avail_in=C,i.hold=A,i.bits=M,s(e,E),d=e.next_out,p=e.output,I=e.avail_out,o=e.next_in,r=e.input,C=e.avail_in,A=i.hold,M=i.bits,i.mode===w&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=w;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===I)break e;if(V=E-I,i.offset>V){if(V=i.offset-V,V>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}V>i.wnext?(V-=i.wnext,T=i.wsize-V):T=i.wnext-V,V>i.length&&(V=i.length),B=i.window}else B=p,T=d-i.offset,V=i.length;V>I&&(V=I),I-=V,i.length-=V;do{p[d++]=B[T++]}while(--V);0===i.length&&(i.mode=21);break;case 26:if(0===I)break e;p[d++]=i.length,I--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===C)break e;C--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=U(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},H={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:$,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==$)throw new Error(H[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==$)))throw new Error(H[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||H[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===$?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=j(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==$||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===$&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}function m(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function d(e){const t=p(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.r(t),a.d(t,"isWebpSupported",(function(){return Oa})),Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return n(this)},set:function(e){this.set(s(e))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...e){return o(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(e){let t=this.findIndex(e);return-1!==t?this.splice(t,1)[0]:void 0},String.prototype.toHHMMSS=function(e=!1){const t=parseInt(this+"",10),a=Math.floor(t/3600);let n=Math.floor((t-3600*a)/60),s=t-3600*a-60*n;return a&&(e=!0),n<10&&(n=e?"0"+n:n),s<10&&(s="0"+s),(a?a+":":"")+n+":"+s},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then(e=>t(()=>e),e=>t(()=>Promise.reject(e)))},Promise.prototype.safeFinally=function(e){return this.catch(()=>{}).finally(e)};const y={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};y.http=location.search.indexOf("http=1")>0,y.http&&(y.transport="https");var c=y;const l=c.debug,g="undefined"!=typeof window?window:self;var h=l;const u="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!u,_=f||u,v=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},b=(...e)=>{self.postMessage(...e)},P=()=>{},w=u?v.bind(null,!1):f?b:P,S=u?v.bind(null,!0):f?b:P;class k{constructor(){this.prefix="",this.cache={},this.useStorage=!0,c.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class C{constructor(){this.taskId=0,this.tasks={},C.STORAGES.push(this),_||(this.storage=new k)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(_){const n=this.taskId++;this.tasks[n]=a;w({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}C.STORAGES=[];const I=new C;g.appStorage=I;var A,M=I,R=0,E=0,V="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(R=0;1<1<>=1))-1)+1;var T,D,U=oe(1,1,1),B=(oe(0,1,1),new Array(0)),x=B,F=B,L=B,N=B,O=B,q=B,G=B,K=B,z=B,j=B,H=B,W=B,J=B;function Z(e){var t,a,n;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,n=e[t];n;n>>=1,a++);return a+=R*t}function Q(e,t){var a=oe(0,(e.length>t?e.length:t)*R,0);return fe(a,e),a}function X(e,t){var a=ue(e);return Ee(a,t),De(a,1)}function $(e,t){var a=Q(e,e.length+t.length);return function(e,t){var a;x.length!=2*e.length&&(x=new Array(2*e.length));for(_e(x,0),a=0;at.length?e.length+1:t.length+1);return Me(a,t),De(a,1)}function te(e,t){var a=Q(e,e.length>t.length?e.length+1:t.length+1);return Re(a,t),De(a,1)}function ae(e,t,a,n,s){var i=0,r=Math.max(e.length,t.length);for(z.length!=r&&(z=new Array(r),j=new Array(r),H=new Array(r),W=new Array(r),J=new Array(r));!(1&e[0]||1&t[0]);)Pe(e),Pe(t),i++;for(fe(z,e),fe(a,t),_e(j,1),_e(H,0),_e(W,0),_e(J,1);;){for(;!(1&z[0]);)Pe(z),1&j[0]||1&H[0]?(Re(j,t),Pe(j),Me(H,e),Pe(H)):(Pe(j),Pe(H));for(;!(1&a[0]);)Pe(a),1&W[0]||1&J[0]?(Re(W,t),Pe(W),Me(J,e),Pe(J)):(Pe(W),Pe(J));if(ie(a,z)?(Me(a,z),Me(W,j),Me(J,H)):(Me(z,a),Me(j,W),Me(H,J)),de(z,0)){for(;ne(W);)Re(W,t),Me(J,e);return Se(J,-1),fe(n,W),fe(s,J),void we(a,i)}}}function ne(e){return e[e.length-1]>>R-1&1}function se(e,t,a){var n,s=e.length,i=t.length;for(T=s+a=0;n++)if(e[n]>0)return 1;for(n=s-1+a;n0)return 0;for(n=T-1;n>=a;n--){if(e[n-a]>t[n])return 1;if(e[n-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(we(t,d=R-d),we(n,d),s=n.length;0===n[s-1]&&s>i;s--);for(_e(a,0);!se(t,n,s-i);)Ae(n,t,s-i),a[s-i]++;for(r=s-1;r>=i;r--){for(n[r]==t[i-1]?a[r-i]=E:a[r-i]=Math.floor((n[r]*A+n[r-1])/t[i-1]);m=(o=(i>1?t[i-2]:0)*a[r-i])>>R,o&=E,m=(p=m+a[r-i]*t[i-1])>>R,p&=E,m==n[r]?p==n[r-1]?o>(r>1?n[r-2]:0):p>n[r-1]:m>n[r];)a[r-i]--;Ce(n,t,-a[r-i],r-i),ne(n)&&(Ie(n,t,r-i),a[r-i]--)}be(t,d),be(n,d)}function pe(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*A+e[a])%t;return n}function oe(e,t,a){var n;n=a>(n=Math.ceil(t/R)+1)?a:n;var s=new Array(n);return _e(s,e),s}function me(e,t,a){var n,s,i,r,p,o=e.length;if(-1===t){for(i=new Array(0);;){for(r=new Array(i.length+1),s=0;s=36&&(n-=26),!(n>=t||n<0));s++)Se(i,t),ve(i,n);for(o=i.length;o>0&&!i[o-1];o--);for(o=a>o+1?a:o+1,r=new Array(o),p=ot.length){for(;a0;a--)s+=e[a]+",";s+=e[0]}else for(;!ce(q);)n=ke(q,t),s=V.substring(n,n+1)+s;return 0===s.length&&(s="0"),s}function ge(e,t=!0){q.length!==e.length?q=ue(e):fe(q,e);const a=[];for(;!ce(q);)B=ke(q,256),a.push(B);return t&&a.reverse(),a}function he(e,t){return ie(e,t)?1:ye(e,t)?0:-1}function ue(e){return fe(D=Array(e.length),e),D}function fe(e,t){var a,n=e.length>=R}function ve(e,t){var a,n,s,i;for(e[0]+=t,n=e.length,s=0,a=0;a>R))*A),e[a]=s&E,!(s=(s>>R)-i))return}function be(e,t){var a,n=Math.floor(t/R);if(n){for(a=0;a>t);e[a]>>=t}function Pe(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&A>>1}function we(e,t){var a,n=Math.floor(t/R);if(n){for(a=e.length;a>=n;a--)e[a]=e[a-n];for(;a>=0;a--)e[a]=0;t%=R}if(t){for(a=e.length-1;a>0;a--)e[a]=E&(e[a]<>R-t);e[a]=E&e[a]<>R))*A),e[a]=s&E,s=(s>>R)-i}function ke(e,t){var a,n,s=0;for(a=e.length-1;a>=0;a--)n=s*A+e[a],e[a]=Math.floor(n/t),s=n%t;return s}function Ce(e,t,a,n){var s,i,r,p;for(r=e.length>=R;for(s=r;i&&s>=R}function Ie(e,t,a){var n,s,i,r;for(i=e.length>=R;for(n=i;s&&n>=R}function Ae(e,t,a){var n,s,i,r;for(i=e.length>=R;for(n=i;s&&n>=R}function Me(e,t){var a,n,s;for(s=e.length>=R;for(a=s;n&&a>=R}function Re(e,t){var a,n,s;for(s=e.length>=R;for(a=s;n&&a>=R}function Ee(e,t){N.length!==e.length?N=ue(e):fe(N,e),O.length!==e.length&&(O=ue(e)),re(N,t,O,e)}function Ve(e,t,a){var n;for(F.length!=2*e.length&&(F=new Array(2*e.length)),_e(F,0),n=0;n0&&!e[i-1];i--);for(r=i>t.length?2*i:2*t.length,F.length!=r&&(F=new Array(r)),_e(F,0),a=0;a>=R,n=a+1;n>=R;F[a+i]=s}Ee(F,t),fe(e,F)}function De(e,t){var a,n;for(a=e.length;a>0&&!e[a-1];a--);return fe(n=new Array(a+t),e),n}function Ue(e,t,a){var n,s,i,r;if(G.length!=a.length&&(G=ue(a)),0!=(1&a[0])){for(_e(G,0),i=a.length;i>0&&!a[i-1];i--);for(r=A-function(e,t){for(var a=1,n=0;;){if(1===e)return a;if(0===e)return 0;if(n-=a*Math.floor(t/e),1===(t%=e))return n;if(0===t)return 0;a-=n*Math.floor(e/t),e%=t}}(pe(a,A),A),G[i]=1,Ve(e,G,a),L.length!=e.length?L=ue(e):fe(L,e),n=t.length-1;n>0&!t[n];n--);if(0!=t[n]){for(s=1<>=1);for(;;){if(!(s>>=1)){if(--n<0)return void Be(e,U,a,r);s=1<0&&0==a[d-1];d--);for(;y>0&&0==t[y-1];y--);for(m=K.length-1,s=0;s>R,o=e[s],i=1;i>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++;for(;i>=R,i++;for(;i>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++;for(;i>=R,i++;for(;i>=R,i++;K[i-1]=r&E}ie(a,K)||Me(K,a),fe(e,K)}function xe(e){return"object"==typeof e&&null!==e}function Fe(e){return e>>>0}function Le(e,t){e=Fe(e),t=Fe(t);const a=me(e.toString(16),16,32);we(a,32),Re(a,me(t.toString(16),16,32));return le(a,10)}function Ne(e,t=16,a,n=!1,s=!1){const i=e.byteLength||e.length,r=n?t-i:t-i%t;if(r>0&&r"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:739712882,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:142306870,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactons",type:"flags.1?Vector"}],type:"MessageReactions"},{id:-1826077446,predicate:"messageUserReaction",params:[{name:"user_id",type:"long"},{name:"reaction",type:"string"}],type:"MessageUserReaction"},{id:-1553558980,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"}]},layer:137},qe=new Uint8Array(256),Ge=new Uint8Array(256),Ke=new Uint32Array(256),ze=new Uint32Array(256),je=new Uint32Array(256),He=new Uint32Array(256),We=new Uint32Array(256),Je=new Uint32Array(256),Ze=new Uint32Array(256),Qe=new Uint32Array(256);function Xe(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!qe[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,qe[p]=a,Ge[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,Ke[p]=n=n<<24^n>>>8,ze[p]=n=n<<24^n>>>8,je[p]=n=n<<24^n>>>8,He[p]=n=n<<24^n>>>8,We[a]=s=s<<24^s>>>8,Je[a]=s=s<<24^s>>>8,Ze[a]=s=s<<24^s>>>8,Qe[a]=s=s<<24^s>>>8,o=r[o]||1}();var Ye=function(){function e(e){var t=Xe(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=qe[a>>>24]<<24^qe[a>>16&255]<<16^qe[a>>8&255]<<8^qe[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:We[qe[a>>>24]]^Je[qe[a>>16&255]]^Ze[qe[a>>8&255]]^Qe[qe[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=Xe(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^ze[p>>16&255]^je[o>>8&255]^He[255&m]^this.encKey[y],a=Ke[p>>>24]^ze[o>>16&255]^je[m>>8&255]^He[255&r]^this.encKey[y+1],n=Ke[o>>>24]^ze[m>>16&255]^je[r>>8&255]^He[255&p]^this.encKey[y+2],m=Ke[m>>>24]^ze[r>>16&255]^je[p>>8&255]^He[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=qe[r>>>24]<<24^qe[p>>16&255]<<16^qe[o>>8&255]<<8^qe[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=Xe(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^Je[p>>16&255]^Ze[o>>8&255]^Qe[255&m]^this.decKey[y],a=We[p>>>24]^Je[o>>16&255]^Ze[m>>8&255]^Qe[255&r]^this.decKey[y+1],n=We[o>>>24]^Je[m>>16&255]^Ze[r>>8&255]^Qe[255&p]^this.decKey[y+2],m=We[m>>>24]^Je[r>>16&255]^Ze[p>>8&255]^Qe[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=Ge[r>>>24]<<24^Ge[p>>16&255]<<16^Ge[o>>8&255]<<8^Ge[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),et=function(){function e(e,t,a){void 0===a&&(a=16),this.key=Xe(e),this.iv=Xe(t),this.cipher=new Ye(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=Xe(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),Ye),at=a(0),nt=a.n(at);const st={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function it(e){const t=st[e];return crypto.getRandomValues(t),t[0]}function rt(){return""+it(32)+it(32)%16777215}var pt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const ot="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function mt(e){return ot.digest("SHA-1",p(e)).then(e=>new Uint8Array(e))}function dt(e){return ot.digest("SHA-256",p(e)).then(e=>new Uint8Array(e))}function yt(e,t,a){e=Ne(e);return m(new et(d(t),d(a)).encrypt(d(e)))}function ct(e,t,a){return m(new et(d(t),d(a)).decrypt(d(e)))}function lt(e,t){const a=me(t.modulus,16),i=me(t.exponent,16);return s(le(Y(me(n(e),16),i,a),16))}function gt(e,t,a){return pt(this,void 0,void 0,(function*(){const n=yield ot.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ot.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function ht(e){let t;try{t=function(e){var t,a,n,s,i,r,p=Math.ceil(64/R)+1,o=0,m=new Array(p),d=new Array(p),y=new Array(p),c=new Array(p),l=new Array(p),g=new Array(p),h=new Array(p);for(t=0;t<3;++t){for(a=17+(15&it(8)),fe(g,X(oe(it(32),32,0),e)),fe(h,g),s=1<"boolFalse"===e.predicate).id,vt=+Oe.API.constructors.find(e=>"boolTrue"===e.predicate).id,bt=+Oe.API.constructors.find(e=>"vector"===e.predicate).id,Pt=+Oe.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class wt{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(vt,(t||"")+":bool"):this.writeInt(_t,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);let a;"string"!=typeof e&&(e=e?e.toString():"0"),"-"===e[0]?(a=oe(0,64,8),Me(a,me(e.slice(1),10,64))):a=me(e,10,64);const n=Ne(s(le(a,16).slice(-16)).reverse(),8,!0,!0,!1);this.storeRawBytes(n)}storeDouble(e,t){const a=new ArrayBuffer(8),n=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(n[0],(t||"")+":double[low]"),this.writeInt(n[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",n(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",n(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",n(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Oe.MTProto:Oe.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(bt,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class St{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=Le(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===vt||t!==_t&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===Pt){const a=ft(this.fetchBytes(t+"[packed_string]"));return new St(a).fetchObject(e,t)}if(i===bt)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e1)&&kt.MSStream,!!("safari"in kt)||!(!Ct||!(/\b(iPad|iPhone|iPod)\b/.test(Ct)||Ct.match("Safari")&&!Ct.match("Chrome")))),At=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);var Mt;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(Mt||(Mt={}));const Rt=[Mt.None,Mt.Error,Mt.Warn,Mt.Log,Mt.Debug],Et=Date.now();function Vt(){return"["+((Date.now()-Et)/1e3).toFixed(3)+"]"}let Tt;const Dt=It||At;Tt=Dt?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const Ut=!Dt,Bt=Dt?2:3;function xt(){const e=(new Error).stack.split("\n"),t=e[Bt]||e[e.length-1];return"["+(Tt(t)||"")+"]"}const Ft={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},Lt=[["debug",Mt.Debug],["info",Mt.Log],["warn",Mt.Warn],["error",Mt.Error],["assert",Mt.Error],["trace",Mt.Log]];function Nt(e,t=Mt.Log|Mt.Warn|Mt.Error,a=!1,n=""){let s;h||a||(t=Mt.Error),Ut?n||(u?n=Ft.yellow:f&&(n=Ft.cyan)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Mt.Log&&console.log(n,Vt(),e,xt(),...a)};return Lt.forEach(([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Vt(),e,xt(),...i)}}),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=Rt.slice(0,e+1).reduce((e,t)=>e|t,0)},r.bindPrefix=function(e){return Nt(`${s}] [${e}`,t,a,i)},r}var Ot=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};Nt("SRP",Mt.Error);function qt(e,t,a){return Ot(this,void 0,void 0,(function*(){const i=a?t.new_algo:t.current_algo,m=me(n(i.p),16),d=oe(i.g,32,256),y=me(n(yield function(e,t,a){return Ot(this,void 0,void 0,(function*(){let n=yield Gt.invokeCrypto("sha256-hash",o(t,(new TextEncoder).encode(e),t));n=o(a,n,a),n=yield Gt.invokeCrypto("sha256-hash",n);let s=yield Gt.invokeCrypto("pbkdf2",new Uint8Array(n),t,1e5);return s=o(a,s,a),n=yield Gt.invokeCrypto("sha256-hash",s),n}))}(e,i.salt1,i.salt2)),16),c=function(e,t){return e instanceof Uint8Array||(e=p(e)),Ne(e,t,!0,!0,!0)},l=Y(d,y,m),g=e=>{const t=new Uint8Array(e.length);for(let a=0;a{const a=ee(t,e);return!(ne(a)||Z(a)<1984||Z(e)<1984||Math.floor((Z(e)+7)/8)>256)},{a:P,a_for_hash:w,u:S}=yield(()=>Ot(this,void 0,void 0,(function*(){for(;;){const e=me(n(g(t.secure_random)),16),a=Y(d,e,m);if(b(a,m)){const t=s(le(a,16)),n=me((yield Gt.invokeCrypto("sha256-hash",o(t,_))).hex,16);if(!ce(n)&&!ne(n))return{a:e,a_for_hash:t,u:n}}}})))();let k;k=ie(h,v)?h:te(h,m),k=X(ee(k,v),m);const C=Y(k,te(P,$(S,y)),m),I=yield Gt.invokeCrypto("sha256-hash",c(s(le(C,16)),256));let A=yield Gt.invokeCrypto("sha256-hash",u);A=r(A,yield Gt.invokeCrypto("sha256-hash",f));const M=o(A,yield Gt.invokeCrypto("sha256-hash",i.salt1),yield Gt.invokeCrypto("sha256-hash",i.salt2),w,_,I),R=yield Gt.invokeCrypto("sha256-hash",M);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(w),M1:R}}))}var Gt=new class extends class{invokeCrypto(e,...t){return this.performTaskWorker(e,...t)}}{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":mt,"sha256-hash":dt,pbkdf2:gt,"aes-encrypt":yt,"aes-decrypt":ct,"rsa-encrypt":lt,factorize:ht,"mod-pow":ut,gzipUncompress:ft,computeSRP:qt}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}};const Kt=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,M.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|it(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Le(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;M.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;return w({type:"applyServerTimeOffset",payload:a}),n}};g.timeManager=Kt;var zt=Kt;const jt={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.4",versionFull:"1.0.4 (77)",build:77,langPackVersion:"0.3.9",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};jt.isMainDomain&&(jt.id=2496,jt.hash="8da85b0d5bfe62527e5b244c209159c3");var Ht=jt;function Wt(){}const Jt=e=>new Promise(t=>{setTimeout(t,e)});function Zt(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(Wt).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}class Qt{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...a){this.reuseResults&&(this.listenerResults[e]=a);const n=t&&[],s=this.listeners[e];if(s){s.slice().forEach(t=>{var i;if(-1===s.findIndex(e=>e.callback===t.callback))return;let r;try{r=t.callback(...a)}catch(e){console.error(e)}n&&n.push(r),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}function Xt(e,t){const a=e.indexOf(t),n=-1!==a&&e.splice(a,1);return n&&n[0]}class $t extends Qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=c.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Mt.Error|Mt.Log;return this.debug&&(n|=Mt.Debug),this.log=Nt("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}class Yt{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class ea{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new Yt(t),this._aes=new tt(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0,ca.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(aa.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(aa.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=Mt.Error|Mt.Log;this.debug&&(i|=Mt.Debug),this.log=Nt("TCP-"+t+n,i),this.log("constructor"),this.connect()}clear(){this.connected&&ca.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ia=0;class ra extends Qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ia,pa.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};S(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};S(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};S(e)}}const pa=new Map,oa=c.test?"_test":"";class ma{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=c.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+oa,s=`wss://${Ht.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new sa(It&&f&&void 0!==ra?ra:$t,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let n;if(c.ssl||!c.http){n="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(c.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new ga(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=c.transport,n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let s;const r="client"===t?"":"-1";return s=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),s?(n&&i.push(s),s):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){Xt(e[a][n][s],t)}}}var da=new ma,ya=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var ca=new class extends Qt{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return ya(this,void 0,void 0,(function*(){const e=this.transports={https:da.chooseServer(Ht.baseDcId,"client","https",!1),websocket:da.chooseServer(Ht.baseDcId,"client","websocket",!1)},t=Zt();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=Zt(),n=e.websocket;n.setAutoReconnect(!1),n.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),n.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>a.resolve(!1),2e3);const[s,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:s||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return ya(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield Jt(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}},la=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class ga{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=c.debug&&!1;let n=Mt.Error|Mt.Log;this.debug&&(n|=Mt.Debug),this.log=Nt("HTTP-"+e+a,n),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,ca.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return la(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new wt({mtproto:!0}),a=rt();t.storeMethod("ping",{ping_id:a});const n={msg_id:zt.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(aa.Connecting),this.sendEncryptedRequest(n).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=kt.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=p(this.authKey),this.serverSalt=p(n),this.isFileUpload=!!s.fileUpload,this.isFileDownload=!!s.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=Nt(this.name,Mt.Log|Mt.Debug|Mt.Error|Mt.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=zt.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new wt({mtproto:!0});n.storeMethod(e,t);const s=zt.generateId(),i=this.generateSeqNo(),r={msg_id:s,seq_no:i,body:n.getBytes(!0)};return c.debug&&this.log("MT call",e,t,s,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new wt({mtproto:!0});a.storeObject(e,"Object");const n=zt.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return c.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new wt(a);if(!this.connectionInited){const e=Oe.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(Oe.layer,"layer");const t=Oe.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(Ht.id,"api_id"),n.storeString(va.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(Ht.version+(Ht.isMainDomain?" "+Ht.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(Ht.langPack,"lang_pack"),n.storeString(va.language,"lang_code")}if(a.afterMessageId){if(void 0===ua){const e=Oe.API.methods.find(e=>"invokeAfterMsg"===e.method);ua=e?+e.id:0}ua?(n.storeInt(ua,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:zt.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return c.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),ma.removeTransport(da.chosenServers,this.transport),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof ga&&(this.longPollInterval=kt.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(aa.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(aa.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=kt.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(aa.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?aa.Closed:aa.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{a.forEach(t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}})})}pushMessage(e,t){const a=new Promise((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),xe(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(aa.TimedOut))},5e3);a.catch(Wt).finally(()=>{clearTimeout(t),this.setConnectionStatus(aa.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=kt.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===aa.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(va.onConnectionStatusChange&&va.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return ha(this,void 0,void 0,(function*(){const a=t?0:8,n=o(this.authKeyUint8.subarray(88+a,88+a+32),e),s=yield Gt.invokeCrypto("sha256-hash",n);return new Uint8Array(s).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Gt.invokeCrypto("sha256-hash",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Gt.invokeCrypto("sha256-hash",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return va.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1,s=!1,i=!1;const r=Object.keys(this.pendingMessages).map(e=>me(e,10)).sort((e,t)=>he(e,t)).map(e=>le(e,10));for(const p of r){const r=this.sentMessages[p];if(r&&r.body){const p=r.body.length+32;if(a+p>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=p,r.isAPI?n=!0:r.longPoll&&(s=!0),e=r}delete this.pendingMessages[p]}if(this.transport instanceof ga&&n&&!s){const e=new wt({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:zt.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const p=t.filter(e=>e.noResponse).map(e=>e.msg_id);if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const o=this.sendEncryptedRequest(e);this.transport instanceof ga&&this.handleSentEncryptedRequestHTTP(o,e,p),this.transport instanceof ga||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new wt({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:zt.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return c.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return ha(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Gt.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Gt.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new wt({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),n=16-t.getOffset()%16+16*(1+it(8)%5),s=o(a,new Uint8Array(n).randomize());return this.getEncryptedMessage(s).then(e=>{const t=new wt({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof ga))return a;const n={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw n;return e},e=>{throw e.message||e.type||(e=Object.assign(n,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})})}parseResponse(e){this.lastResponseTime=Date.now();const t=new St(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!i(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),r=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,r).then(e=>this.getMsgKey(e,!1).then(t=>{if(!i(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new St(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const r=a.fetchIntBytes(64,!0,"session_id"),p=a.fetchLong("message_id");if(!(i(r,this.sessionId)||this.prevSessionId&&i(r,this.prevSessionId)))throw this.log.warn("Sessions",r,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+n(r));const o=a.fetchInt("seq_no"),m=e.byteLength,d=a.fetchInt("message_data[length]");let y=a.getOffset();if(d%4||d>m-y)throw new Error("[MT] Invalid body length: "+d);const c=a.fetchRawBytes(d,!0,"message_data");y=a.getOffset();const l=m-y;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new St(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:p,sessionId:r,seqNo:o}}))}applyServerSalt(e){const t=Ne(new Uint8Array(ge(me(e,10),!1)),8,!0,!1,!1);M.set({["dc"+this.dcId+"_server_salt"]:n(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof ga&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof ga&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof ga&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=me(t,10);be(a,32);const n=zt.applyServerTime(+le(a,10));(17===e.error_code||n)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),M.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&va.updatesProcessor&&va.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==va.updatesProcessor&&va.updatesProcessor(e)}}}const _a=new class{constructor(){this.networkers=[],this.language=navigator.language||Ht.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){Xt(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s){const i=new fa(e,t,a,n,s);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};g&&(g.networkerFactory=_a);var va=_a,ba=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Pa=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,c.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new wt;t.storeBytes(s(e.modulus),"n"),t.storeBytes(s(e.exponent),"e");const a=t.getBuffer();return Gt.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[n(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return ba(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(h&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new St(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return wa(this,void 0,void 0,(function*(){const t=new wt({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),h&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));Pa.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!i(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,h&&this.log("Got ResPQ",n(e.serverNonce),n(e.pq),e.fingerprints);const r=yield Pa.select(e.fingerprints);if(!r)throw new Error("[MT] No public key found");e.publicKey=r,h&&this.log("PQ factorization start",e.pq);try{var p=yield Gt.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=p[0],e.q=p[1],h&&this.log("PQ factorization done",p),this.sendReqDhParams(e)}))}sendReqDhParams(e){return wa(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new wt({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const p=Ne(s,192,!1,!0,!1),o=p.slice().reverse(),m=yield(()=>wa(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=o.concat(yield Gt.invokeCrypto("sha256-hash",t.concat(p)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield Gt.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),i=r(t,yield Gt.invokeCrypto("sha256-hash",s)).concat(s);if(-1===he(me(n(i),16),me(e.publicKey.modulus,16)))return i}})))(),d=Ne(yield Gt.invokeCrypto("rsa-encrypt",m,e.publicKey),256,!0,!0,!0),y={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:d},c=new wt({mtproto:!0});c.storeMethod("req_DH_params",y);const l=c.getBytes(!0);let g;h&&this.log("Send req_DH_params",y);try{g=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const u=g.fetchObject("Server_DH_Params","RESPONSE");if(h&&this.log("Sent req_DH_params, response:",u),"server_DH_params_fail"!==u._&&"server_DH_params_ok"!==u._)throw new Error("[MT] Server_DH_Params response invalid: "+u._);if(!i(e.nonce,u.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!i(e.serverNonce,u.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===u._){if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce)).slice(-16),u.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,u.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return wa(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield Gt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Gt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Gt.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),r=new St(s,{mtproto:!0}),p=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==p._)throw new Error("[MT] server_DH_inner_data response invalid: "+p);if(!i(e.nonce,p.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!i(e.serverNonce,p.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");h&&this.log("Done decrypting answer"),e.g=p.g,e.dhPrime=p.dh_prime,e.gA=p.g_a,e.serverTime=p.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=r.getOffset();if(!i(n,yield Gt.invokeCrypto("sha1-hash",s.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");zt.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){h&&this.log("Verifying DH params",e,t,a);const s=n(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");h&&this.log("dhPrime cmp OK");const i=me(n(a),16),r=me(s,16);if(he(i,U)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(he(i,ee(r,U))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");h&&this.log("1 < gA < dhPrime-1 OK");const p=function(e,t){let a=ue(e);t-=1;for(let n=0;n=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return h&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return wa(this,void 0,void 0,(function*(){const t=s(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield Gt.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new wt({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const p=(yield Gt.invokeCrypto("sha1-hash",n.getBuffer())).concat(n.getBytes(!0)),o=yield Gt.invokeCrypto("aes-encrypt",p,e.tmpAesKey,e.tmpAesIv),m=new wt({mtproto:!0});let d;m.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:o}),h&&this.log("Send set_client_DH_params");try{d=yield this.sendPlainRequest(e.dcId,m.getBytes(!0))}catch(e){throw e}const y=d.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==y._&&"dh_gen_retry"!==y._&&"dh_gen_fail"!==y._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+y._);if(!i(e.nonce,y.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!i(e.serverNonce,y.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield Gt.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield Gt.invokeCrypto("sha1-hash",c),g=l.slice(0,8),u=l.slice(-8);switch(h&&this.log("Got Set_client_DH_params_answer",y._,c),y._){case"dh_gen_ok":{const t=(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([1],g))).slice(-16);if(!i(t,y.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,y),new Error("new_nonce_hash1 mismatch");const a=r(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return h&&this.log("Auth successfull!",u,c,a),e.authKeyId=u,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([2],g))).slice(-16),y.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([3],g))).slice(-16),y.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=ca.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>wa(this,void 0,void 0,(function*(){let n;yield this.getTransportType();let s=1;for(;s++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},n=this.sendReqPQ(a);return void t(yield n)}catch(e){n=e}a(n)}))),this.cached[e]=t)}};function ka(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>a(e.target.result)),n[t](e)})}function Ca(e){return ka(e,"readAsArrayBuffer")}function Ia(e,t=""){let a;const n=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class Aa{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),c.test&&(this.name+="_test"),this.storeName=t,this.log=Nt("IDB-"+this.storeName),this.openDatabase(!0),Aa.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Ia([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Aa.STORAGES=[];var Ma=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Ra=new class{constructor(){this.log=Nt("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=c.transport,ca.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const n in a){const s=a[n];for(const a in s){s[a].forEach((s,i,r)=>{e({networker:s,dcId:+a,connectionType:n,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return da.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],n=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=n,this.transportType=e;for(const a in this.gettingNetworkers){const n=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const s=a.replace(t,e);this.gettingNetworkers[s]=n,this.log("changed networker getKey from",a,"to",s)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);e.networker.changeTransport(a)})}getBaseDcId(){return Ma(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield M.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(Ht.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ma(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}M.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,M.set({dc:this.baseDcId})}logOut(){return Ma(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>M.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,Aa.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",i=this.getTransportType(a);this.cachedNetworkers[i]||(this.cachedNetworkers[i]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[i][a];e in r||(r[e]=[]);const p=r[e],o="client"===a||"https"===i?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}let m=this.generateNetworkerGetKey(e,i,a);if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;let c=this.chooseServer(e,a,i);return this.gettingNetworkers[m]=Promise.all([d,y].map(e=>M.get(e))).then(([r,o])=>Ma(this,void 0,void 0,(function*(){let l,g;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=s(r),n=(yield Gt.invokeCrypto("sha1-hash",a)).slice(-8),i=s(o);l=va.getNetworker(e,a,n,i,t)}else try{const a=yield Sa.auth(e);M.set({[d]:n(a.authKey),[y]:n(a.serverSalt)}),l=va.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const h=this.getTransportType(a);if(h!==i&&(m=this.generateNetworkerGetKey(e,h,a),c.destroy(),ma.removeTransport(da.chosenServers,c),l&&(c=this.chooseServer(e,a,h)),this.log("transport has been changed during authorization from",i,"to",h)),delete this.gettingNetworkers[m],g)throw this.log("get networker error",g,g.stack),g;return l.changeTransport(c),p.unshift(l),this.setOnDrainIfNeeded(l),l})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),va.removeNetworker(e),ma.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=Zt();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),g){const s=Date.now(),i=kt.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(Wt).finally(()=>{clearInterval(i)})}const r=t=>{t?xe(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=m||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let p,o,m=(new Error).stack||"empty stack";const d=m=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const y=(o=m).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),y.then(n.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(M.delete("dc"),M.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then(()=>{this.invokeApi(e,t,a).then(n.resolve,r)},r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then(()=>d(o)):d(o)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{d(o)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{d(o)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{d(o)},1e3*e)}})};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(d,r):this.getBaseDcId().then(e=>{this.getNetworker(p=e,a).then(d,r)}),n}};g.apiManager=Ra;var Ea=Ra;var Va=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Ta=new class{constructor(){this.blobSupported=!0;try{Ia([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,Ca(a).then(e=>new Uint8Array(e))).then(t=>e.write(t)):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>Va(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;a.push(e)})),truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=Ia(a,e);return n&&t&&t(s),s}}}},Da=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Ua{constructor(e){this.dbName=e,this.useStorage=!0,c.test&&(this.dbName+="_test"),Ua.STORAGES.length&&(this.useStorage=Ua.STORAGES[0].useStorage),this.openDatabase(),Ua.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Ia(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>Da(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=Ta.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}Ua.STORAGES=[];var Ba=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const xa=new class{constructor(){this.cacheStorage=new Ua("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=Nt("AFM",Mt.Error|Mt.Log),this.tempId=0,this.queueId=0,this.debug=c.debug,this.uncompressTGS=(e,t)=>Gt.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=Zt();return w({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice(e=>0===e.queueId)||t.findAndSplice(e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eBa(this,void 0,void 0,(function*(){return r&&r(),Ea.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,s,i=0,r=0,p){return this.downloadRequest(e,i,()=>Ba(this,void 0,void 0,(function*(){p&&p();const i=()=>Ba(this,void 0,void 0,(function*(){p&&p();return Ea.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(i);throw e})})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=n(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(i)}return i()})),this.getDelta(s),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=n(t);let s=this.refreshReferencePromises[a];if(!s){const n=Zt();s=this.refreshReferencePromises[a]={deferred:n,timeout:kt.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},n.catch(Wt).finally(()=>{clearTimeout(s.timeout)});w({type:"refreshReference",payload:t})}return s.deferred.then(t=>{if(a===n(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!Ta.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"image/webp"!==e.mimeType||Oa()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=Zt(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const h=this.tempId++;o.getFile(r).then(e=>Ba(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then(t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>Ba(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=Zt(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(oBa(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{u();const y=yield _(n,s,i,p,h,e.queueId,u),c=y.bytes;v.length&&P(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);u(),yield o,u(),yield Ta.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<2e7)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const u=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{S({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=rt();let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},h=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(h,g),d>4e3)return h;let u=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),h.reject(e),i=!0,u=()=>{}};const f=s?"upload.saveBigFilePart":"upload.saveFilePart",_=this.tempId++,v=this;const b=function*(){for(let t=0;tCa(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return v.debug&&v.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),Ea.invokeApi(f,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,h.notify({done:p*o,total:n}),p>=d&&(h.resolve(l),r=!0)},u)}),m).catch(u)}}(),P=()=>{if(i)return;const e=b.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,u({type:"UPLOAD_CANCELED"}))},h.notify=e=>{S({progress:Object.assign({fileName:t},e)})},h.finally(()=>{w.delete(h),w.size||delete this.uploadPromises[t]});const w=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return w.add(h),h}};g.apiFileManager=xa;var Fa=xa,La=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Na=!1;const Oa=()=>Na;va.setUpdatesProcessor(e=>{S({update:e})}),va.onConnectionStatusChange=e=>{S({type:"connectionStatusChange",payload:e})};const qa={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Fa.webpConvertPromises[t];n&&(n.resolve(a),delete Fa.webpConvertPromises[t])},webpSupport:e=>{Na=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=pa.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),pa.delete(a))},localStorageProxy:e=>{M.finishTask(e.id,e.payload)},userAgent:e=>{va.userAgent=e.payload},online:()=>{va.forceReconnectTimeout()},forceReconnect:()=>{va.forceReconnect()},toggleStorage:e=>{const t=e.payload;Ua.toggleStorage(t)},refreshReference:e=>{const t=n(e.originalPayload),a=Fa.refreshReferencePromises[t],s=null==a?void 0:a.deferred;s&&(e.error?s.reject(e.error):s.resolve(e.payload))},crypto:e=>{Gt.invokeCrypto(e.task,...e.args).then(t=>{S({taskId:e.taskId,result:t})})}};kt.addEventListener("message",e=>La(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=qa[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Fa[t.task].apply(Fa,t.args);e instanceof Promise&&(e=yield e),S({taskId:a,result:e})}catch(e){S({taskId:a,error:e})}break;case"getNetworker":Ea[t.task].apply(Ea,t.args).finally(()=>{S({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":va[t.task].apply(va,t.args);break;default:try{let e=Ea[t.task].apply(Ea,t.args);e instanceof Promise&&(e=yield e),S({taskId:a,result:e})}catch(e){S({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),S("ready")}]); -//# sourceMappingURL=mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js.map \ No newline at end of file +!function(e){"use strict";var t=(e,t,a,n)=>{let s=65535&e|0,i=e>>>16&65535|0,r=0;for(;0!==a;){r=a>2e3?2e3:a,a-=r;do{s=s+t[n++]|0,i=i+s|0}while(--r);s%=65521,i%=65521}return s|i<<16|0};const a=new Uint32Array((()=>{let e,t=[];for(var a=0;a<256;a++){e=a;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[a]=e}return t})());var n=(e,t,n,s)=>{const i=a,r=s+n;e^=-1;for(let a=s;a>>8^i[255&(e^t[a])];return-1^e},s=function(e,t){let a,n,s,i,r,p,o,m,d,y,c,l,g,h,u,f,_,v,b,P,w,S,k,C;const I=e.state;a=e.next_in,k=e.input,n=a+(e.avail_in-5),s=e.next_out,C=e.output,i=s-(t-e.avail_out),r=s+(e.avail_out-257),p=I.dmax,o=I.wsize,m=I.whave,d=I.wnext,y=I.window,c=I.hold,l=I.bits,g=I.lencode,h=I.distcode,u=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)C[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=k[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=h[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",I.mode=30;break e}if(c>>>=v,l-=v,v=s-i,P>v){if(v=P-v,v>m&&I.sane){e.msg="invalid distance too far back",I.mode=30;break e}if(w=0,S=y,0===d){if(w+=o-v,v2;)C[s++]=S[w++],C[s++]=S[w++],C[s++]=S[w++],b-=3;b&&(C[s++]=S[w++],b>1&&(C[s++]=S[w++]))}else{w=s-P;do{C[s++]=C[w++],C[s++]=C[w++],C[s++]=C[w++],b-=3}while(b>2);b&&(C[s++]=C[w++],b>1&&(C[s++]=C[w++]))}break}}break}}while(a>3,a-=b,l-=b<<3,c&=(1<{const c=y.bits;let l,g,h,u,f,_,v=0,b=0,P=0,w=0,S=0,k=0,C=0,I=0,A=0,M=0,R=null,E=0;const V=new Uint16Array(16),T=new Uint16Array(16);let D,U,B,x=null,F=0;for(v=0;v<=15;v++)V[v]=0;for(b=0;b=1&&0===V[w];w--);if(S>w&&(S=w),0===w)return s[m++]=20971520,s[m++]=20971520,y.bits=1,0;for(P=1;P0&&(0===e||1!==w))return-1;for(T[1]=0,v=1;v<15;v++)T[v+1]=T[v]+V[v];for(b=0;b852||2===e&&A>592)return 1;for(;;){D=v-C,d[b]<_?(U=0,B=d[b]):d[b]>_?(U=x[F+d[b]],B=R[E+d[b]]):(U=96,B=0),l=1<>C)+g]=D<<24|U<<16|B|0}while(0!==g);for(l=1<>=1;if(0!==l?(M&=l-1,M+=l):M=0,b++,0==--V[v]){if(v===w)break;v=t[a+d[b]]}if(v>S&&(M&u)!==h){for(0===C&&(C=S),f+=P,k=v-C,I=1<852||2===e&&A>592)return 1;h=M&u,s[h]=S<<24|k<<16|f-m|0}}return 0!==M&&(s[f+M]=v-C<<24|64<<16|0),y.bits=S,0},d={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:y,Z_BLOCK:c,Z_TREES:l,Z_OK:g,Z_STREAM_END:h,Z_NEED_DICT:u,Z_STREAM_ERROR:f,Z_DATA_ERROR:_,Z_MEM_ERROR:v,Z_BUF_ERROR:b,Z_DEFLATED:P}=d,w=12,S=30,k=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function C(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const I=e=>{if(!e||!e.state)return f;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,g},A=e=>{if(!e||!e.state)return f;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,I(e)},M=(e,t)=>{let a;if(!e||!e.state)return f;const n=e.state;return t<0?(a=0,t=-t):(a=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?f:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=a,n.wbits=t,A(e))},R=(e,t)=>{if(!e)return f;const a=new C;e.state=a,a.window=null;const n=M(e,t);return n!==g&&(e.state=null),n};let E,V,T=!0;const D=e=>{if(T){E=new Int32Array(512),V=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(m(1,e.lens,0,288,E,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;m(2,e.lens,0,32,V,0,e.work,{bits:5}),T=!1}e.lencode=E,e.lenbits=9,e.distcode=V,e.distbits=5},U=(e,t,a,n)=>{let s;const i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(i.window.set(t.subarray(a-i.wsize,a),0),i.wnext=0,i.whave=i.wsize):(s=i.wsize-i.wnext,s>n&&(s=n),i.window.set(t.subarray(a-n,a-n+s),i.wnext),(n-=s)?(i.window.set(t.subarray(a-n,a),0),i.wnext=n,i.whave=i.wsize):(i.wnext+=s,i.wnext===i.wsize&&(i.wnext=0),i.whave{let i,r,p,o,d,C,I,A,M,R,E,V,T,B,x,F,L,N,O,q,G,K,z=0;const j=new Uint8Array(4);let H,W;const J=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return f;i=e.state,i.mode===w&&(i.mode=13),d=e.next_out,p=e.output,I=e.avail_out,o=e.next_in,r=e.input,C=e.avail_in,A=i.hold,M=i.bits,R=C,E=I,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0),A=0,M=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&A)<<8)+(A>>8))%31){e.msg="incorrect header check",i.mode=S;break}if((15&A)!==P){e.msg="unknown compression method",i.mode=S;break}if(A>>>=4,M-=4,G=8+(15&A),0===i.wbits)i.wbits=G;else if(G>i.wbits){e.msg="invalid window size",i.mode=S;break}i.dmax=1<>8&1),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===C)break e;C--,A+=r[o++]<>>8&255,j[2]=A>>>16&255,j[3]=A>>>24&255,i.check=n(i.check,j,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>8),512&i.flags&&(j[0]=255&A,j[1]=A>>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===C)break e;C--,A+=r[o++]<>>8&255,i.check=n(i.check,j,2,0)),A=0,M=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(V=i.length,V>C&&(V=C),V&&(i.head&&(G=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(r.subarray(o,o+V),G)),512&i.flags&&(i.check=n(i.check,r,V,o)),C-=V,o+=V,i.length-=V),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===C)break e;V=0;do{G=r[o+V++],i.head&&G&&i.length<65536&&(i.head.name+=String.fromCharCode(G))}while(G&&V>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=w;break;case 10:for(;M<32;){if(0===C)break e;C--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===C)break e;C--,A+=r[o++]<>>=1,M-=1,3&A){case 0:i.mode=14;break;case 1:if(D(i),i.mode=20,a===l){A>>>=2,M-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=S}A>>>=2,M-=2;break;case 14:for(A>>>=7&M,M-=7&M;M<32;){if(0===C)break e;C--,A+=r[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=S;break}if(i.length=65535&A,A=0,M=0,i.mode=15,a===l)break e;case 15:i.mode=16;case 16:if(V=i.length,V){if(V>C&&(V=C),V>I&&(V=I),0===V)break e;p.set(r.subarray(o,o+V),d),C-=V,o+=V,I-=V,d+=V,i.length-=V;break}i.mode=w;break;case 17:for(;M<14;){if(0===C)break e;C--,A+=r[o++]<>>=5,M-=5,i.ndist=1+(31&A),A>>>=5,M-=5,i.ncode=4+(15&A),A>>>=4,M-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=S;break}i.have=0,i.mode=18;case 18:for(;i.have>>=3,M-=3}for(;i.have<19;)i.lens[J[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,H={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid code lengths set",i.mode=S;break}i.have=0,i.mode=19;case 19:for(;i.have>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=x+2;M>>=x,M-=x,0===i.have){e.msg="invalid bit length repeat",i.mode=S;break}G=i.lens[i.have-1],V=3+(3&A),A>>>=2,M-=2}else if(17===L){for(W=x+3;M>>=x,M-=x,G=0,V=3+(7&A),A>>>=3,M-=3}else{for(W=x+7;M>>=x,M-=x,G=0,V=11+(127&A),A>>>=7,M-=7}if(i.have+V>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=S;break}for(;V--;)i.lens[i.have++]=G}}if(i.mode===S)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=S;break}if(i.lenbits=9,H={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,H={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,H),i.distbits=H.bits,K){e.msg="invalid distances set",i.mode=S;break}if(i.mode=20,a===l)break e;case 20:i.mode=21;case 21:if(C>=6&&I>=258){e.next_out=d,e.avail_out=I,e.next_in=o,e.avail_in=C,i.hold=A,i.bits=M,s(e,E),d=e.next_out,p=e.output,I=e.avail_out,o=e.next_in,r=e.input,C=e.avail_in,A=i.hold,M=i.bits,i.mode===w&&(i.back=-1);break}for(i.back=0;z=i.lencode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,i.length=L,0===F){i.mode=26;break}if(32&F){i.back=-1,i.mode=w;break}if(64&F){e.msg="invalid literal/length code",i.mode=S;break}i.extra=15&F,i.mode=22;case 22:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;z=i.distcode[A&(1<>>24,F=z>>>16&255,L=65535&z,!(x<=M);){if(0===C)break e;C--,A+=r[o++]<>N)],x=z>>>24,F=z>>>16&255,L=65535&z,!(N+x<=M);){if(0===C)break e;C--,A+=r[o++]<>>=N,M-=N,i.back+=N}if(A>>>=x,M-=x,i.back+=x,64&F){e.msg="invalid distance code",i.mode=S;break}i.offset=L,i.extra=15&F,i.mode=24;case 24:if(i.extra){for(W=i.extra;M>>=i.extra,M-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=S;break}i.mode=25;case 25:if(0===I)break e;if(V=E-I,i.offset>V){if(V=i.offset-V,V>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=S;break}V>i.wnext?(V-=i.wnext,T=i.wsize-V):T=i.wnext-V,V>i.length&&(V=i.length),B=i.window}else B=p,T=d-i.offset,V=i.length;V>I&&(V=I),I-=V,i.length-=V;do{p[d++]=B[T++]}while(--V);0===i.length&&(i.mode=21);break;case 26:if(0===I)break e;p[d++]=i.length,I--,i.mode=21;break;case 27:if(i.wrap){for(;M<32;){if(0===C)break e;C--,A|=r[o++]<{if(!e||!e.state)return f;let t=e.state;return t.window&&(t.window=null),e.state=null,g},N=(e,t)=>{if(!e||!e.state)return f;const a=e.state;return 0==(2&a.wrap)?f:(a.head=t,t.done=!1,g)},O=(e,a)=>{const n=a.length;let s,i,r;return e&&e.state?(s=e.state,0!==s.wrap&&11!==s.mode?f:11===s.mode&&(i=1,i=t(i,a,n,0),i!==s.check)?_:(r=U(e,a,n,n),r?(s.mode=31,v):(s.havedict=1,g))):f};const q=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let G=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){G=!1}const K=new Uint8Array(256);for(let e=0;e<256;e++)K[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;K[254]=K[254]=1;var z=(e,t)=>{let a,n;const s=t||e.length,i=new Array(2*s);for(n=0,a=0;a4)i[n++]=65533,a+=r-1;else{for(t&=2===r?31:3===r?15:7;r>1&&a1?i[n++]=65533:t<65536?i[n++]=t:(t-=65536,i[n++]=55296|t>>10&1023,i[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&G)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let a="";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let a=t-1;for(;a>=0&&128==(192&e[a]);)a--;return a<0||0===a?t:a+K[e[a]]>t?a:t},H={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},W=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0},J=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Z=Object.prototype.toString,{Z_NO_FLUSH:Q,Z_FINISH:X,Z_OK:$,Z_STREAM_END:Y,Z_NEED_DICT:ee,Z_STREAM_ERROR:te,Z_DATA_ERROR:ae,Z_MEM_ERROR:ne}=d;function se(e){this.options=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const a=t.shift();if(a){if("object"!=typeof a)throw new TypeError(a+"must be non-object");for(const t in a)q(a,t)&&(e[t]=a[t])}}return e}({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==$)throw new Error(H[a]);if(this.header=new J,N(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=(e=>{let t,a,n,s,i,r=e.length,p=0;for(s=0;s>>6,t[i++]=128|63&a):a<65536?(t[i++]=224|a>>>12,t[i++]=128|a>>>6&63,t[i++]=128|63&a):(t[i++]=240|a>>>18,t[i++]=128|a>>>12&63,t[i++]=128|a>>>6&63,t[i++]=128|63&a);return t})(t.dictionary):"[object ArrayBuffer]"===Z.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(a=O(this.strm,t.dictionary),a!==$)))throw new Error(H[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||H[a.err];return a.result}se.prototype.push=function(e,t){const a=this.strm,n=this.options.chunkSize,s=this.options.dictionary;let i,r,p;if(this.ended)return!1;for(r=t===~~t?t:!0===t?X:Q,"[object ArrayBuffer]"===Z.call(e)?a.input=new Uint8Array(e):a.input=e,a.next_in=0,a.avail_in=a.input.length;;){for(0===a.avail_out&&(a.output=new Uint8Array(n),a.next_out=0,a.avail_out=n),i=F(a,r),i===ee&&s&&(i=O(a,s),i===$?i=F(a,r):i===ae&&(i=ee));a.avail_in>0&&i===Y&&a.state.wrap>0&&0!==e[a.next_in];)B(a),i=F(a,r);switch(i){case te:case ae:case ee:case ne:return this.onEnd(i),this.ended=!0,!1}if(p=a.avail_out,a.next_out&&(0===a.avail_out||i===Y))if("string"===this.options.to){let e=j(a.output,a.next_out),t=a.next_out-e,s=z(a.output,e);a.next_out=t,a.avail_out=n-t,t&&a.output.set(a.output.subarray(e,e+t),0),this.onData(s)}else this.onData(a.output.length===a.next_out?a.output:a.output.subarray(0,a.next_out));if(i!==$||0!==p){if(i===Y)return i=L(this.strm),this.onEnd(i),this.ended=!0,!0;if(0===a.avail_in)break}}return!0},se.prototype.onData=function(e){this.chunks.push(e)},se.prototype.onEnd=function(e){e===$&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=(e=>{let t=0;for(let a=0,n=e.length;ae+(t.byteLength||t.length),0),a=new Uint8Array(t);let n=0;return e.forEach(e=>{a.set(e instanceof ArrayBuffer?new Uint8Array(e):e,n),n+=e.byteLength||e.length}),a}function m(e){const t=new Uint8Array(e.byteLength);for(let a=0,n=4*e.length;a>>2]>>>24-a%4*8&255;return t}function d(e){const t=p(e),a=[];for(let e=0,n=t.length;e>>2]|=t[e]<<24-e%4*8;return new Uint32Array(a)}a.r(t),a.d(t,"isWebpSupported",(function(){return Oa})),Object.defineProperty(Uint8Array.prototype,"hex",{get:function(){return n(this)},set:function(e){this.set(s(e))},enumerable:!0,configurable:!0}),Uint8Array.prototype.randomize=function(){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(this),this},Uint8Array.prototype.concat=function(...e){return o(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Array.prototype.findAndSplice=function(e){let t=this.findIndex(e);return-1!==t?this.splice(t,1)[0]:void 0},String.prototype.toHHMMSS=function(e=!1){const t=parseInt(this+"",10),a=Math.floor(t/3600);let n=Math.floor((t-3600*a)/60),s=t-3600*a-60*n;return a&&(e=!0),n<10&&(n=e?"0"+n:n),s<10&&(s="0"+s),(a?a+":":"")+n+":"+s},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then(e=>t(()=>e),e=>t(()=>Promise.reject(e)))},Promise.prototype.safeFinally=function(e){return this.catch(()=>{}).finally(e)};const y={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};y.http=location.search.indexOf("http=1")>0,y.http&&(y.transport="https");var c=y;const l=c.debug,g="undefined"!=typeof window?window:self;var h=l;const u="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!u,_=f||u,v=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(a=>{a.length&&a.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},b=(...e)=>{self.postMessage(...e)},P=()=>{},w=u?v.bind(null,!1):f?b:P,S=u?v.bind(null,!0):f?b:P;class k{constructor(){this.prefix="",this.cache={},this.useStorage=!0,c.test&&(this.prefix="t_")}get(e,t=!0){if(this.cache.hasOwnProperty(e)&&t)return this.cache[e];if(this.useStorage){let t;try{t=localStorage.getItem(this.prefix+e)}catch(e){this.useStorage=!1}if(null!==t)try{t=JSON.parse(t)}catch(e){}else t=void 0;return t}}set(e,t=!1){for(const a in e)if(e.hasOwnProperty(a)){const n=e[a];if(this.cache[a]=n,this.useStorage&&!t)try{const e=JSON.stringify(n);localStorage.setItem(this.prefix+a,e)}catch(e){this.useStorage=!1}}}delete(e,t=!1){e=""+e,t||delete this.cache[e];try{localStorage.removeItem(this.prefix+e)}catch(e){}}clear(){const e=["dc","server_time_offset","xt_instance","user_auth","state_id"];for(let t=1;t<=5;++t)e.push(`dc${t}_server_salt`),e.push(`dc${t}_auth_key`);for(let t of e)this.delete(t,!0)}toggleStorage(e){if(this.useStorage=e,e)return this.set(this.cache);this.clear()}}class C{constructor(){this.taskId=0,this.tasks={},C.STORAGES.push(this),_||(this.storage=new k)}finishTask(e,t){this.tasks.hasOwnProperty(e)&&(this.tasks[e](t),delete this.tasks[e])}proxy(e,...t){return new Promise((a,n)=>{if(_){const n=this.taskId++;this.tasks[n]=a;w({type:"localStorageProxy",id:n,payload:{type:e,args:t}})}else{t=Array.prototype.slice.call(t);a(this.storage[e].apply(this.storage,t))}})}get(e,t){return this.proxy("get",e,t)}set(e,t){return this.proxy("set",e,t)}delete(e,t){return this.proxy("delete",e,t)}clear(){return this.proxy("clear")}toggleStorage(e){return this.proxy("toggleStorage",e)}}C.STORAGES=[];const I=new C;g.appStorage=I;var A,M=I,R=0,E=0,V="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\'\"+-";for(R=0;1<1<>=1))-1)+1;var T,D,U=oe(1,1,1),B=(oe(0,1,1),new Array(0)),x=B,F=B,L=B,N=B,O=B,q=B,G=B,K=B,z=B,j=B,H=B,W=B,J=B;function Z(e){var t,a,n;for(t=e.length-1;0==e[t]&&t>0;t--);for(a=0,n=e[t];n;n>>=1,a++);return a+=R*t}function Q(e,t){var a=oe(0,(e.length>t?e.length:t)*R,0);return fe(a,e),a}function X(e,t){var a=ue(e);return Ee(a,t),De(a,1)}function $(e,t){var a=Q(e,e.length+t.length);return function(e,t){var a;x.length!=2*e.length&&(x=new Array(2*e.length));for(_e(x,0),a=0;at.length?e.length+1:t.length+1);return Me(a,t),De(a,1)}function te(e,t){var a=Q(e,e.length>t.length?e.length+1:t.length+1);return Re(a,t),De(a,1)}function ae(e,t,a,n,s){var i=0,r=Math.max(e.length,t.length);for(z.length!=r&&(z=new Array(r),j=new Array(r),H=new Array(r),W=new Array(r),J=new Array(r));!(1&e[0]||1&t[0]);)Pe(e),Pe(t),i++;for(fe(z,e),fe(a,t),_e(j,1),_e(H,0),_e(W,0),_e(J,1);;){for(;!(1&z[0]);)Pe(z),1&j[0]||1&H[0]?(Re(j,t),Pe(j),Me(H,e),Pe(H)):(Pe(j),Pe(H));for(;!(1&a[0]);)Pe(a),1&W[0]||1&J[0]?(Re(W,t),Pe(W),Me(J,e),Pe(J)):(Pe(W),Pe(J));if(ie(a,z)?(Me(a,z),Me(W,j),Me(J,H)):(Me(z,a),Me(j,W),Me(H,J)),de(z,0)){for(;ne(W);)Re(W,t),Me(J,e);return Se(J,-1),fe(n,W),fe(s,J),void we(a,i)}}}function ne(e){return e[e.length-1]>>R-1&1}function se(e,t,a){var n,s=e.length,i=t.length;for(T=s+a=0;n++)if(e[n]>0)return 1;for(n=s-1+a;n0)return 0;for(n=T-1;n>=a;n--){if(e[n-a]>t[n])return 1;if(e[n-a]=0;a--){if(e[a]>t[a])return 1;if(e[a]>=1;for(we(t,d=R-d),we(n,d),s=n.length;0===n[s-1]&&s>i;s--);for(_e(a,0);!se(t,n,s-i);)Ae(n,t,s-i),a[s-i]++;for(r=s-1;r>=i;r--){for(n[r]==t[i-1]?a[r-i]=E:a[r-i]=Math.floor((n[r]*A+n[r-1])/t[i-1]);m=(o=(i>1?t[i-2]:0)*a[r-i])>>R,o&=E,m=(p=m+a[r-i]*t[i-1])>>R,p&=E,m==n[r]?p==n[r-1]?o>(r>1?n[r-2]:0):p>n[r-1]:m>n[r];)a[r-i]--;Ce(n,t,-a[r-i],r-i),ne(n)&&(Ie(n,t,r-i),a[r-i]--)}be(t,d),be(n,d)}function pe(e,t){var a,n=0;for(a=e.length-1;a>=0;a--)n=(n*A+e[a])%t;return n}function oe(e,t,a){var n;n=a>(n=Math.ceil(t/R)+1)?a:n;var s=new Array(n);return _e(s,e),s}function me(e,t,a){var n,s,i,r,p,o=e.length;if(-1===t){for(i=new Array(0);;){for(r=new Array(i.length+1),s=0;s=36&&(n-=26),!(n>=t||n<0));s++)Se(i,t),ve(i,n);for(o=i.length;o>0&&!i[o-1];o--);for(o=a>o+1?a:o+1,r=new Array(o),p=ot.length){for(;a0;a--)s+=e[a]+",";s+=e[0]}else for(;!ce(q);)n=ke(q,t),s=V.substring(n,n+1)+s;return 0===s.length&&(s="0"),s}function ge(e,t=!0){q.length!==e.length?q=ue(e):fe(q,e);const a=[];for(;!ce(q);)B=ke(q,256),a.push(B);return t&&a.reverse(),a}function he(e,t){return ie(e,t)?1:ye(e,t)?0:-1}function ue(e){return fe(D=Array(e.length),e),D}function fe(e,t){var a,n=e.length>=R}function ve(e,t){var a,n,s,i;for(e[0]+=t,n=e.length,s=0,a=0;a>R))*A),e[a]=s&E,!(s=(s>>R)-i))return}function be(e,t){var a,n=Math.floor(t/R);if(n){for(a=0;a>t);e[a]>>=t}function Pe(e){var t;for(t=0;t>1);e[t]=e[t]>>1|e[t]&A>>1}function we(e,t){var a,n=Math.floor(t/R);if(n){for(a=e.length;a>=n;a--)e[a]=e[a-n];for(;a>=0;a--)e[a]=0;t%=R}if(t){for(a=e.length-1;a>0;a--)e[a]=E&(e[a]<>R-t);e[a]=E&e[a]<>R))*A),e[a]=s&E,s=(s>>R)-i}function ke(e,t){var a,n,s=0;for(a=e.length-1;a>=0;a--)n=s*A+e[a],e[a]=Math.floor(n/t),s=n%t;return s}function Ce(e,t,a,n){var s,i,r,p;for(r=e.length>=R;for(s=r;i&&s>=R}function Ie(e,t,a){var n,s,i,r;for(i=e.length>=R;for(n=i;s&&n>=R}function Ae(e,t,a){var n,s,i,r;for(i=e.length>=R;for(n=i;s&&n>=R}function Me(e,t){var a,n,s;for(s=e.length>=R;for(a=s;n&&a>=R}function Re(e,t){var a,n,s;for(s=e.length>=R;for(a=s;n&&a>=R}function Ee(e,t){N.length!==e.length?N=ue(e):fe(N,e),O.length!==e.length&&(O=ue(e)),re(N,t,O,e)}function Ve(e,t,a){var n;for(F.length!=2*e.length&&(F=new Array(2*e.length)),_e(F,0),n=0;n0&&!e[i-1];i--);for(r=i>t.length?2*i:2*t.length,F.length!=r&&(F=new Array(r)),_e(F,0),a=0;a>=R,n=a+1;n>=R;F[a+i]=s}Ee(F,t),fe(e,F)}function De(e,t){var a,n;for(a=e.length;a>0&&!e[a-1];a--);return fe(n=new Array(a+t),e),n}function Ue(e,t,a){var n,s,i,r;if(G.length!=a.length&&(G=ue(a)),0!=(1&a[0])){for(_e(G,0),i=a.length;i>0&&!a[i-1];i--);for(r=A-function(e,t){for(var a=1,n=0;;){if(1===e)return a;if(0===e)return 0;if(n-=a*Math.floor(t/e),1===(t%=e))return n;if(0===t)return 0;a-=n*Math.floor(e/t),e%=t}}(pe(a,A),A),G[i]=1,Ve(e,G,a),L.length!=e.length?L=ue(e):fe(L,e),n=t.length-1;n>0&!t[n];n--);if(0!=t[n]){for(s=1<>=1);for(;;){if(!(s>>=1)){if(--n<0)return void Be(e,U,a,r);s=1<0&&0==a[d-1];d--);for(;y>0&&0==t[y-1];y--);for(m=K.length-1,s=0;s>R,o=e[s],i=1;i>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i]+o*t[i],K[i-1]=r&E,r>>=R,i++;for(;i>=R,i++;for(;i>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++,r+=K[i]+p*a[i],K[i-1]=r&E,r>>=R,i++;for(;i>=R,i++;for(;i>=R,i++;K[i-1]=r&E}ie(a,K)||Me(K,a),fe(e,K)}function xe(e){return"object"==typeof e&&null!==e}function Fe(e){return e>>>0}function Le(e,t){e=Fe(e),t=Fe(t);const a=me(e.toString(16),16,32);we(a,32),Re(a,me(t.toString(16),16,32));return le(a,10)}function Ne(e,t=16,a,n=!1,s=!1){const i=e.byteLength||e.length,r=n?t-i:t-i%t;if(r>0&&r"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:-646342540,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"}],type:"InputMedia"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1073147056,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"kicked",type:"flags.1?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-2107528095,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:-779165146,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?Vector"}],type:"ChatFull"},{id:-516145888,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?Vector"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-2074799289,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"}],type:"MessageMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:1080663248,predicate:"messageActionPaymentSent",params:[{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"MessageAction"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1441072131,predicate:"messageActionSetMessagesTTL",params:[{name:"period",type:"int"}],type:"MessageAction"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:739712882,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"}],type:"Dialog"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-1673717362,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?string"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-818518751,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"profile_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1682413576,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1007549728,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"username",type:"string"}],type:"Update"},{id:-232290676,predicate:"updateUserPhoto",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"photo",type:"UserProfilePhoto"},{name:"previous",type:"Bool"}],type:"Update"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Update"},{id:1135492588,predicate:"updateStickerSets",params:[],type:"Update"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:-299124375,predicate:"updateDraftMessage",params:[{name:"peer",type:"Peer"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:1153291573,predicate:"updateChannelReadMessagesContents",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"}],type:"Update"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:357013699,predicate:"updateMessageReactions",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:856375399,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:1248893260,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:512177195,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"int"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:408623183,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:-673242758,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:-1240849242,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-2067782896,predicate:"messages.featuredStickers",params:[{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:215516896,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"}],type:"Invoice"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:378828315,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?PaymentSavedCredentials"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1655957568,predicate:"phoneConnection",params:[{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-1661470870,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"}],type:"ChannelAdminLogEventsFilter"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:1648543603,predicate:"fileHash",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:-534283678,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-532532493,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"int"},{name:"file_size_max",type:"int"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:1705297877,predicate:"messages.sponsoredMessages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-2091463255,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1873957073,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"count",type:"int"}],type:"ReactionCount"},{id:142306870,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactons",type:"flags.1?Vector"}],type:"MessageReactions"},{id:-1826077446,predicate:"messageUserReaction",params:[{name:"user_id",type:"long"},{name:"reaction",type:"string"}],type:"MessageUserReaction"},{id:-1553558980,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1126886015,method:"auth.signIn",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:1099779595,method:"account.deleteAccount",params:[{name:"reason",type:"string"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:1880182943,method:"account.sendVerifyEmailCode",params:[{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:-323339813,method:"account.verifyEmail",params:[{name:"email",type:"string"},{name:"code",type:"string"}],type:"Bool"},{id:-262453244,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?int"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:-1919060949,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"document_id",type:"long"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:228423076,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-497026848,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-869258997,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:164303470,method:"messages.createChat",params:[{name:"users",type:"Vector"},{name:"title",type:"string"}],type:"Updates"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:864953444,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"int"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:2057376407,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1137057461,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:1180140658,method:"messages.getUnreadMentions",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:251759059,method:"messages.readMentions",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-134016113,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1932455680,method:"messages.getSearchCounters",params:[{name:"peer",type:"InputPeer"},{name:"filters",type:"Vector"}],type:"Vector"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:-265962357,method:"messages.unpinAllMessages",params:[{name:"peer",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:627641572,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?string"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:-521245833,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?string"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:335875750,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"Vector"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:-647969580,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"string"}],type:"Bool"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:1926525996,method:"photos.updateProfilePhoto",params:[{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1319462148,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.File"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:536919235,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1302676017,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"int"}],type:"Vector"},{id:-956147407,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"int"}],type:"Vector"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:1029681423,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1976353651,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-619695760,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:818134173,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"}]},layer:137},qe=new Uint8Array(256),Ge=new Uint8Array(256),Ke=new Uint32Array(256),ze=new Uint32Array(256),je=new Uint32Array(256),He=new Uint32Array(256),We=new Uint32Array(256),Je=new Uint32Array(256),Ze=new Uint32Array(256),Qe=new Uint32Array(256);function Xe(e){if(e instanceof Uint32Array)return e;if("string"==typeof e){if(e.length%4!=0)for(var t=e.length%4;t<=4;t++)e+="\0x00";var a=new Uint32Array(e.length/4);for(t=0;t>7),r[i[m]^m]=m;for(;!qe[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,qe[p]=a,Ge[a]=p,s=16843009*i[t=i[e=i[p]]]^65537*t^257*e^16843008*p,n=257*i[a]^16843008*a,Ke[p]=n=n<<24^n>>>8,ze[p]=n=n<<24^n>>>8,je[p]=n=n<<24^n>>>8,He[p]=n=n<<24^n>>>8,We[a]=s=s<<24^s>>>8,Je[a]=s=s<<24^s>>>8,Ze[a]=s=s<<24^s>>>8,Qe[a]=s=s<<24^s>>>8,o=r[o]||1}();var Ye=function(){function e(e){var t=Xe(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var a,n=1,s=t.length;s<4*t.length+28;s++)a=this.encKey[s-1],(s%t.length==0||8===t.length&&s%t.length==4)&&(a=qe[a>>>24]<<24^qe[a>>16&255]<<16^qe[a>>8&255]<<8^qe[255&a],s%t.length==0&&(a=a<<8^a>>>24^n<<24,n=n<<1^283*(n>>7))),this.encKey[s]=this.encKey[s-t.length]^a;for(var i=0;s;i++,s--)a=this.encKey[3&i?s:s-4],this.decKey[i]=s<=4||i<4?a:We[qe[a>>>24]]^Je[qe[a>>16&255]]^Ze[qe[a>>8&255]]^Qe[qe[255&a]]}return e.prototype.encrypt=function(e){for(var t,a,n,s=Xe(e),i=new Uint32Array(4),r=s[0]^this.encKey[0],p=s[1]^this.encKey[1],o=s[2]^this.encKey[2],m=s[3]^this.encKey[3],d=this.encKey.length/4-2,y=4,c=0;c>>24]^ze[p>>16&255]^je[o>>8&255]^He[255&m]^this.encKey[y],a=Ke[p>>>24]^ze[o>>16&255]^je[m>>8&255]^He[255&r]^this.encKey[y+1],n=Ke[o>>>24]^ze[m>>16&255]^je[r>>8&255]^He[255&p]^this.encKey[y+2],m=Ke[m>>>24]^ze[r>>16&255]^je[p>>8&255]^He[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=qe[r>>>24]<<24^qe[p>>16&255]<<16^qe[o>>8&255]<<8^qe[255&m]^this.encKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e.prototype.decrypt=function(e){for(var t,a,n,s=Xe(e),i=new Uint32Array(4),r=s[0]^this.decKey[0],p=s[3]^this.decKey[1],o=s[2]^this.decKey[2],m=s[1]^this.decKey[3],d=this.decKey.length/4-2,y=4,c=0;c>>24]^Je[p>>16&255]^Ze[o>>8&255]^Qe[255&m]^this.decKey[y],a=We[p>>>24]^Je[o>>16&255]^Ze[m>>8&255]^Qe[255&r]^this.decKey[y+1],n=We[o>>>24]^Je[m>>16&255]^Ze[r>>8&255]^Qe[255&p]^this.decKey[y+2],m=We[m>>>24]^Je[r>>16&255]^Ze[p>>8&255]^Qe[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=Ge[r>>>24]<<24^Ge[p>>16&255]<<16^Ge[o>>8&255]<<8^Ge[255&m]^this.decKey[y++],t=r,r=p,p=o,o=m,m=t;return i},e}(),et=function(){function e(e,t,a){void 0===a&&(a=16),this.key=Xe(e),this.iv=Xe(t),this.cipher=new Ye(e),this.blockSize=a/4}return e.prototype.encrypt=function(e,t){for(var a=Xe(e),n=t||new Uint32Array(a.length),s=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),r=new Uint32Array(this.blockSize),p=0;p=this.blockSize&&this.incrementCounter(),s&&(i-=s,s=0)}return this.offset=(this.offset+a.length%4)%4,n},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}(),Ye),at=a(0),nt=a.n(at);const st={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function it(e){const t=st[e];return crypto.getRandomValues(t),t[0]}function rt(){return""+it(32)+it(32)%16777215}var pt=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const ot="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;function mt(e){return ot.digest("SHA-1",p(e)).then(e=>new Uint8Array(e))}function dt(e){return ot.digest("SHA-256",p(e)).then(e=>new Uint8Array(e))}function yt(e,t,a){e=Ne(e);return m(new et(d(t),d(a)).encrypt(d(e)))}function ct(e,t,a){return m(new et(d(t),d(a)).decrypt(d(e)))}function lt(e,t){const a=me(t.modulus,16),i=me(t.exponent,16);return s(le(Y(me(n(e),16),i,a),16))}function gt(e,t,a){return pt(this,void 0,void 0,(function*(){const n=yield ot.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ot.deriveBits({name:"PBKDF2",salt:t,iterations:a,hash:{name:"SHA-512"}},n,512).then(e=>new Uint8Array(e))}))}function ht(e){let t;try{t=function(e){var t,a,n,s,i,r,p=Math.ceil(64/R)+1,o=0,m=new Array(p),d=new Array(p),y=new Array(p),c=new Array(p),l=new Array(p),g=new Array(p),h=new Array(p);for(t=0;t<3;++t){for(a=17+(15&it(8)),fe(g,X(oe(it(32),32,0),e)),fe(h,g),s=1<"boolFalse"===e.predicate).id,vt=+Oe.API.constructors.find(e=>"boolTrue"===e.predicate).id,bt=+Oe.API.constructors.find(e=>"vector"===e.predicate).id,Pt=+Oe.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class wt{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(vt,(t||"")+":bool"):this.writeInt(_t,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);let a;"string"!=typeof e&&(e=e?e.toString():"0"),"-"===e[0]?(a=oe(0,64,8),Me(a,me(e.slice(1),10,64))):a=me(e,10,64);const n=Ne(s(le(a,16).slice(-16)).reverse(),8,!0,!0,!1);this.storeRawBytes(n)}storeDouble(e,t){const a=new ArrayBuffer(8),n=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(n[0],(t||"")+":double[low]"),this.writeInt(n[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const n=a.length;n<=253?this.byteView[this.offset++]=n:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&n,this.byteView[this.offset++]=(65280&n)>>8,this.byteView[this.offset++]=(16711680&n)>>16);for(let e=0;e>>",n(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",n(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",n(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?Oe.MTProto:Oe.API).methods.find(t=>t.method===e);if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const n=t.pFlags||t,s={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),s=e[0].split(".");if(!(t[s[0]]&1<<+s[1])){if(!("true"===e[1]?n[i.name]:void 0!==t[i.name]))continue;t[s[0]]|=1<<+s[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,s[i.name]=r)}for(let e in s)this.intView[s[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(bt,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const n=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===s);if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+s+" found");s===t&&(i=!0),i||this.writeInt(r.id,a+"["+s+"][id]");const p=e.pFlags,o={};for(const t of r.params){let n=t.type;if(-1!==n.indexOf("?")){const a=n.split("?"),s=a[0].split(".");if(!(e[s[0]]&1<<+s[1])){if(!("true"===a[1]?p&&p[t.name]:void 0!==e[t.name]))continue;e[s[0]]|=1<<+s[1]}n=a[1]}const i=this.storeObject(e[t.name],n,a+"["+s+"]["+t.name+"]");"#"===n&&(e[t.name]=e[t.name]||0,o[t.name]=i)}for(let t in o)this.intView[o[t]]=e[t];return r.type}}class St{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),this.byteView.slice(this.offset-16,this.offset+16).hex),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),n=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),n[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]"),a=Le(this.readInt((e||"")+":long[high]"),t);if(!this.mtproto){const e=+a;if(Number.isSafeInteger(e))return e}return a}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===vt||t!==_t&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,n="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView.subarray(this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const s=e.substr(7,e.length-8);for(let e=0;ee.type===t),!n)throw new Error("Constructor not found for type: "+e)}else{const i=this.readInt(t+"[id]");if(i===Pt){const a=ft(this.fetchBytes(t+"[packed_string]"));return new St(a).fetchObject(e,t)}if(i===bt)return this.fetchVector(e,t);let r=a.constructorsIndex;if(!r){a.constructorsIndex=r={};for(let e=0,t=a.constructors.length;e1)&&kt.MSStream,!!("safari"in kt)||!(!Ct||!(/\b(iPad|iPhone|iPod)\b/.test(Ct)||Ct.match("Safari")&&!Ct.match("Chrome")))),At=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i);var Mt;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(Mt||(Mt={}));const Rt=[Mt.None,Mt.Error,Mt.Warn,Mt.Log,Mt.Debug],Et=Date.now();function Vt(){return"["+((Date.now()-Et)/1e3).toFixed(3)+"]"}let Tt;const Dt=It||At;Tt=Dt?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const Ut=!Dt,Bt=Dt?2:3;function xt(){const e=(new Error).stack.split("\n"),t=e[Bt]||e[e.length-1];return"["+(Tt(t)||"")+"]"}const Ft={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},Lt=[["debug",Mt.Debug],["info",Mt.Log],["warn",Mt.Warn],["error",Mt.Error],["assert",Mt.Error],["trace",Mt.Log]];function Nt(e,t=Mt.Log|Mt.Warn|Mt.Error,a=!1,n=""){let s;h||a||(t=Mt.Error),Ut?n||(u?n=Ft.yellow:f&&(n=Ft.cyan)):n="";let i=n;n=n?`%s ${n}%s`:"%s";const r=function(...a){return t&Mt.Log&&console.log(n,Vt(),e,xt(),...a)};return Lt.forEach(([a,s])=>{r[a]=function(...i){return t&s&&console[a](n,Vt(),e,xt(),...i)}}),r.setPrefix=function(t){s=t,e="["+t+"]"},r.setPrefix(e),r.setLevel=function(e){t=Rt.slice(0,e+1).reduce((e,t)=>e|t,0)},r.bindPrefix=function(e){return Nt(`${s}] [${e}`,t,a,i)},r}var Ot=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};Nt("SRP",Mt.Error);function qt(e,t,a){return Ot(this,void 0,void 0,(function*(){const i=a?t.new_algo:t.current_algo,m=me(n(i.p),16),d=oe(i.g,32,256),y=me(n(yield function(e,t,a){return Ot(this,void 0,void 0,(function*(){let n=yield Gt.invokeCrypto("sha256-hash",o(t,(new TextEncoder).encode(e),t));n=o(a,n,a),n=yield Gt.invokeCrypto("sha256-hash",n);let s=yield Gt.invokeCrypto("pbkdf2",new Uint8Array(n),t,1e5);return s=o(a,s,a),n=yield Gt.invokeCrypto("sha256-hash",s),n}))}(e,i.salt1,i.salt2)),16),c=function(e,t){return e instanceof Uint8Array||(e=p(e)),Ne(e,t,!0,!0,!0)},l=Y(d,y,m),g=e=>{const t=new Uint8Array(e.length);for(let a=0;a{const a=ee(t,e);return!(ne(a)||Z(a)<1984||Z(e)<1984||Math.floor((Z(e)+7)/8)>256)},{a:P,a_for_hash:w,u:S}=yield(()=>Ot(this,void 0,void 0,(function*(){for(;;){const e=me(n(g(t.secure_random)),16),a=Y(d,e,m);if(b(a,m)){const t=s(le(a,16)),n=me((yield Gt.invokeCrypto("sha256-hash",o(t,_))).hex,16);if(!ce(n)&&!ne(n))return{a:e,a_for_hash:t,u:n}}}})))();let k;k=ie(h,v)?h:te(h,m),k=X(ee(k,v),m);const C=Y(k,te(P,$(S,y)),m),I=yield Gt.invokeCrypto("sha256-hash",c(s(le(C,16)),256));let A=yield Gt.invokeCrypto("sha256-hash",u);A=r(A,yield Gt.invokeCrypto("sha256-hash",f));const M=o(A,yield Gt.invokeCrypto("sha256-hash",i.salt1),yield Gt.invokeCrypto("sha256-hash",i.salt2),w,_,I),R=yield Gt.invokeCrypto("sha256-hash",M);return{_:"inputCheckPasswordSRP",srp_id:t.srp_id,A:new Uint8Array(w),M1:R}}))}var Gt=new class extends class{invokeCrypto(e,...t){return this.performTaskWorker(e,...t)}}{constructor(){super(),this.webWorker=!1,this.taskId=0,this.awaiting={},this.pending=[],this.debug=!1,console.log("CW constructor"),this.utils={"sha1-hash":mt,"sha256-hash":dt,pbkdf2:gt,"aes-encrypt":yt,"aes-decrypt":ct,"rsa-encrypt":lt,factorize:ht,"mod-pow":ut,gzipUncompress:ft,computeSRP:qt}}performTaskWorker(e,...t){return this.debug&&console.log("CW start",e,t),Promise.resolve(this.utils[e](...t))}};const Kt=new class{constructor(){this.lastMessageId=[0,0],this.timeOffset=0,M.get("server_time_offset").then(e=>{e&&(this.timeOffset=e)})}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|it(16)<<3|4];(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t;return Le(t[0],t[1])}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),n=Math.abs(this.timeOffset-a)>10;M.set({server_time_offset:a}),this.lastMessageId=[0,0],this.timeOffset=a;return w({type:"applyServerTimeOffset",payload:a}),n}};g.timeManager=Kt;var zt=Kt;const jt={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.0.4",versionFull:"1.0.4 (81)",build:81,langPackVersion:"0.3.9",langPack:"macos",langPackCode:"en",domains:["web.telegram.org"],baseDcId:2,isMainDomain:"web.telegram.org"===location.hostname,suffix:"K"};jt.isMainDomain&&(jt.id=2496,jt.hash="8da85b0d5bfe62527e5b244c209159c3");var Ht=jt;function Wt(){}const Jt=e=>new Promise(t=>{setTimeout(t,e)});function Zt(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((a,n)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,a(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,n(...e))}});return t.catch(Wt).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}class Qt{constructor(e){this._constructor(e)}_constructor(e=!1){this.reuseResults=e,this.listeners={},this.listenerResults={}}addEventListener(e,t,a){var n,s;(null!==(n=this.listeners[e])&&void 0!==n?n:this.listeners[e]=[]).push({callback:t,options:a}),this.listenerResults.hasOwnProperty(e)&&(t(...this.listenerResults[e]),null===(s=a)||void 0===s?void 0:s.once)&&this.listeners[e].pop()}addMultipleEventsListeners(e){for(const t in e)this.addEventListener(t,e[t])}removeEventListener(e,t,a){this.listeners[e]&&this.listeners[e].findAndSplice(e=>e.callback===t)}_dispatchEvent(e,t,...a){this.reuseResults&&(this.listenerResults[e]=a);const n=t&&[],s=this.listeners[e];if(s){s.slice().forEach(t=>{var i;if(-1===s.findIndex(e=>e.callback===t.callback))return;let r;try{r=t.callback(...a)}catch(e){console.error(e)}n&&n.push(r),(null===(i=t.options)||void 0===i?void 0:i.once)&&this.removeEventListener(e,t.callback)})}return n}dispatchResultableEvent(e,...t){return this._dispatchEvent(e,!0,...t)}dispatchEvent(e,...t){this._dispatchEvent(e,!1,...t)}cleanup(){this.listeners={},this.listenerResults={}}}function Xt(e,t){const a=e.indexOf(t),n=-1!==a&&e.splice(a,1);return n&&n[0]}class $t extends Qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.debug=c.debug&&!1,this.handleOpen=()=>{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=()=>{this.log("closed"),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let n=Mt.Error|Mt.Log;return this.debug&&(n|=Mt.Debug),this.log=Nt("WS-"+e+a,n),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}class Yt{constructor(e){this._counter=e}increment(){for(let e=15;e>=0;e--){if(255!==this._counter[e]){this._counter[e]++;break}this._counter[e]=0}}}class ea{constructor(e,t){this._remainingCounter=null,this._remainingCounterIndex=16,this._counter=new Yt(t),this._aes=new tt(e)}update(e){const t=e.slice();for(let e=0;e{this.connected=!0,ca.setTransportOpened("websocket");const e=this.obfuscation.init(this.codec);if(this.connection.send(e),this.networker)this.pending.length=0,this.networker.setConnectionStatus(aa.Connected),this.networker.cleanupSent(),this.networker.resend();else for(const e of this.pending)e.encoded&&e.body&&(e.encoded=this.encodeBody(e.body));setTimeout(()=>{this.releasePending()},0)},this.onMessage=e=>{let t=this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then(e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}}).catch(e=>{this.log.error("handleMessage networker parseResponse error",e)});const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",t.hex)},this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),n=a-this.lastCloseTime;e=!isNaN(n)&&n{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(aa.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=Mt.Error|Mt.Log;this.debug&&(i|=Mt.Debug),this.log=Nt("TCP-"+t+n,i),this.log("constructor"),this.connect()}clear(){this.connected&&ca.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.pending.forEach(e=>{e.reject&&e.reject()}),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",()=>{e.removeEventListener("message",this.onMessage)},{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=this.connected?this.encodeBody(e):void 0;if(!this.networker){const a=new Promise((a,n)=>{this.pending.push({resolve:a,reject:n,body:e,encoded:t})});return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){if(!this.connected)return;let e=this.pending.length;for(let t=0;t body length to send:",n.length),i||(i=a.encoded=this.encodeBody(n)),this.connection.send(i),a.resolve?a.bodySent=!0:(this.pending.splice(t--,1),e--))}}}let ia=0;class ra extends Qt{constructor(e,t,a){super(),this.dcId=e,this.url=t,this.id=++ia,pa.set(this.id,this);const n={type:"socketProxy",payload:{type:"setup",payload:{dcId:e,url:t,logSuffix:a},id:this.id}};S(n)}send(e){const t={type:"socketProxy",payload:{type:"send",payload:e,id:this.id}};S(t)}close(){const e={type:"socketProxy",payload:{type:"close",id:this.id}};S(e)}}const pa=new Map,oa=c.test?"_test":"";class ma{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=c.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const n="apiws"+oa,s=`wss://${Ht.suffix.toLowerCase()}ws${e}${a}.web.telegram.org/${n}`;return new sa(It&&f&&void 0!==ra?ra:$t,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let n;if(c.ssl||!c.http){n="https://"+(this.sslSubdomains[e-1]+("client"!==t?"-1":""))+".web.telegram.org/"+(c.test?"apiw_test1":"apiw1")}else for(let t of this.dcOptions)if(t.id===e){n="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new ga(e,n,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=c.transport,n=!0){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const s=this.chosenServers[a][t];e in s||(s[e]=[]);const i=s[e];if(!i.length||!n){let s;const r="client"===t?"":"-1";return s=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,r),s?(n&&i.push(s),s):(console.error("No chosenServer!",e),null)}return i[0]}static removeTransport(e,t){for(const a in e)for(const n in e[a])for(const s in e[a][n]){Xt(e[a][n][s],t)}}}var da=new ma,ya=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var ca=new class extends Qt{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",e=>{e.get("websocket")||this.waitForWebSocket()}),setTimeout(()=>{this.waitForWebSocket()},200)}pingTransports(){return ya(this,void 0,void 0,(function*(){const e=this.transports={https:da.chooseServer(Ht.baseDcId,"client","https",!1),websocket:da.chooseServer(Ht.baseDcId,"client","websocket",!1)},t=Zt();this.transports.https._send(new Uint8Array,"no-cors").then(()=>t.resolve(!0),()=>t.resolve(!1)),setTimeout(()=>t.resolve(!1),2e3);const a=Zt(),n=e.websocket;n.setAutoReconnect(!1),n.connection.addEventListener("close",()=>a.resolve(!1),{once:!0}),n.connection.addEventListener("open",()=>a.resolve(!0),{once:!0}),setTimeout(()=>a.resolve(!1),2e3);const[s,i]=yield Promise.all([t,a]);for(const t in e){e[t].destroy()}return{https:s||this.opened.get("https")>0,websocket:i||this.opened.get("websocket")>0}}))}waitForWebSocket(){return ya(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield Jt(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}},la=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class ga{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=c.debug&&!1;let n=Mt.Error|Mt.Log;this.debug&&(n|=Mt.Debug),this.log=Nt("HTTP-"+e+a,n),this.log("constructor"),this.connected=!1}_send(e,t){return this.debug&&this.log.debug("-> body length to send:",e.length),fetch(this.url,{method:"POST",body:e,mode:t}).then(e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then(e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))}),e;return this.setConnected(!0),e.arrayBuffer().then(e=>new Uint8Array(e))},e=>{throw this.setConnected(!1),e})}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,ca.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach(e=>e.reject()),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})});return this.releasePending(),t}}releasePending(){return la(this,void 0,void 0,(function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()})},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new wt({mtproto:!0}),a=rt();t.storeMethod("ping",{ping_id:a});const n={msg_id:zt.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(aa.Connecting),this.sendEncryptedRequest(n).then(()=>{this.toggleOffline(!1)},()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=kt.setTimeout(()=>this.checkConnection("from failed checkConnection request"),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)})},this.authKeyUint8=p(this.authKey),this.serverSalt=p(n),this.isFileUpload=!!s.fileUpload,this.isFileDownload=!!s.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload;const i=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+e+i,this.log=Nt(this.name,Mt.Log|Mt.Debug|Mt.Error|Mt.Warn,void 0),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=new Uint8Array(8).randomize()}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&function(e,t){for(let a=e.length-1;a>=0;--a)t(e[a],a,e)}(t.inner,(e,a)=>{const n=this.updateSentMessage(e);n?t.inner[a]=n.msg_id:t.inner.splice(a,1)}),t.msg_id=zt.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const n=new wt({mtproto:!0});n.storeMethod(e,t);const s=zt.generateId(),i=this.generateSeqNo(),r={msg_id:s,seq_no:i,body:n.getBytes(!0)};return c.debug&&this.log("MT call",e,t,s,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new wt({mtproto:!0});a.storeObject(e,"Object");const n=zt.generateId(),s=this.generateSeqNo(t.notContentRelated),i={msg_id:n,seq_no:s,body:a.getBytes(!0)};return c.debug&&this.log("MT message",e,n,s),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const n=new wt(a);if(!this.connectionInited){const e=Oe.API.methods.find(e=>"invokeWithLayer"===e.method);if(!e)throw new Error("no invokeWithLayer!");n.storeInt(+e.id,"invokeWithLayer"),n.storeInt(Oe.layer,"layer");const t=Oe.API.methods.find(e=>"initConnection"===e.method);if(!t)throw new Error("no initConnection!");n.storeInt(+t.id,"initConnection"),n.storeInt(0,"flags"),n.storeInt(Ht.id,"api_id"),n.storeString(va.userAgent||"Unknown UserAgent","device_model"),n.storeString(navigator.platform||"Unknown Platform","system_version"),n.storeString(Ht.version+(Ht.isMainDomain?" "+Ht.suffix:""),"app_version"),n.storeString(navigator.language||"en","system_lang_code"),n.storeString(Ht.langPack,"lang_pack"),n.storeString(va.language,"lang_code")}if(a.afterMessageId){if(void 0===ua){const e=Oe.API.methods.find(e=>"invokeAfterMsg"===e.method);ua=e?+e.id:0}ua?(n.storeInt(ua,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:zt.generateId(),seq_no:this.generateSeqNo(),body:n.getBytes(!0),isAPI:!0};return c.debug?this.log("Api call",e,s,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(s,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),ma.removeTransport(da.chosenServers,this.transport),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.transport=e,e&&(e.networker=this,e instanceof ga&&(this.longPollInterval=kt.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connected&&e.connection&&this.setConnectionStatus(aa.Connected),this.resend())}destroy(){this.changeTransport()}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}sendLongPoll(){if(this.sendingLongPoll)return;this.sendingLongPoll=!0;this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then(()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)},e=>{this.log("Long-poll failed",e)}).finally(()=>{this.sendingLongPoll=void 0})}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(aa.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=kt.setTimeout(()=>this.checkConnection("from toggleOfline"),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(aa.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?aa.Closed:aa.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then(e=>(this.toggleOffline(!1),this.parseResponse(e).then(e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))),e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1)).then(e=>{a.forEach(t=>{if(this.sentMessages[t]){const a=this.sentMessages[t].deferred;delete this.sentMessages[t],delete this.pendingMessages[t],e?a.resolve():a.reject()}})})}pushMessage(e,t){const a=new Promise((a,n)=>{this.sentMessages[e.msg_id]=Object.assign(e,t,t.notContentRelated?void 0:{deferred:{resolve:a,reject:n}}),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),xe(t)&&(t.messageId=e.msg_id)});if(!t.notContentRelated&&!t.noResponse){const t=setTimeout(()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime<5e3||(this.log.error("timeout",e),this.isOnline&&this.setConnectionStatus(aa.TimedOut))},5e3);a.catch(Wt).finally(()=>{clearTimeout(t),this.setConnectionStatus(aa.Connected),--this.activeRequests,this.setDrainTimeout()}),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}return a}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=kt.setTimeout(()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()},1e4))}setConnectionStatus(e,t){const a=e===aa.Connected,n=this.status!==e;this.isOnline=a,this.status=e,n&&(va.onConnectionStatusChange&&va.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest())}pushResend(e,t=100){const a=t?Date.now()+t:0,n=this.sentMessages[e];if(n.container)for(const e of n.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;n.acked&&this.log.error("pushResend: acked message?",n),this.debug&&this.log.debug("pushResend:",e,n,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return ha(this,void 0,void 0,(function*(){const a=t?0:8,n=o(this.authKeyUint8.subarray(88+a,88+a+32),e),s=yield Gt.invokeCrypto("sha256-hash",n);return new Uint8Array(s).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),s=new Uint8Array(52),i=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),i.push(Gt.invokeCrypto("sha256-hash",n)),s.set(this.authKeyUint8.subarray(40+a,40+a+36),0),s.set(e,36),i.push(Gt.invokeCrypto("sha256-hash",s)),Promise.all(i).then(e=>{const t=new Uint8Array(32),a=new Uint8Array(32),n=new Uint8Array(e[0]),s=new Uint8Array(e[1]);return t.set(n.subarray(0,8)),t.set(s.subarray(8,24),8),t.set(n.subarray(24,32),24),a.set(s.subarray(0,8)),a.set(n.subarray(8,24),8),a.set(s.subarray(24,32),24),[t,a]})}isStopped(){return va.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}if(this.pendingResends.length){const e=this.pendingResends.slice(),t={noSchedule:!0,notContentRelated:!0,messageId:""};this.wrapMtpMessage({_:"msg_resend_req",msg_ids:e},t),this.lastResendReq={req_msg_id:t.messageId,resend_msg_ids:e}}let e;const t=[];let a=0,n=!1,s=!1,i=!1;const r=Object.keys(this.pendingMessages).map(e=>me(e,10)).sort((e,t)=>he(e,t)).map(e=>le(e,10));for(const p of r){const r=this.sentMessages[p];if(r&&r.body){const p=r.body.length+32;if(a+p>655360&&(this.log.warn("lengthOverflow",r,t),i=!0,e))break;t.push(r),a+=p,r.isAPI?n=!0:r.longPoll&&(s=!0),e=r}delete this.pendingMessages[p]}if(this.transport instanceof ga&&n&&!s){const e=new wt({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),t.push({msg_id:zt.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!t.length)return;const p=t.filter(e=>e.noResponse).map(e=>e.msg_id);if(t.length>1){const n=this.generateContainerMessage(a,t);e=n.messageWithBody,this.sentMessages[e.msg_id]=n.message}else this.sentMessages[e.msg_id]=e;this.pendingAcks=[];const o=this.sendEncryptedRequest(e);this.transport instanceof ga&&this.handleSentEncryptedRequestHTTP(o,e,p),this.transport instanceof ga||this.cleanupSent(),i&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new wt({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const n=[];t.forEach((e,t)=>{n.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")});const s={msg_id:zt.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:n};return c.debug&&this.log.warn("Container",n,s.msg_id,s.seq_no),{message:s,messageWithBody:Object.assign({body:a.getBytes(!0)},s)}}getEncryptedMessage(e){return ha(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield Gt.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then(e=>Gt.invokeCrypto("aes-decrypt",t,e[0],e[1]))}getEncryptedOutput(e){const t=new wt({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),n=16-t.getOffset()%16+16*(1+it(8)%5),s=o(a,new Uint8Array(n).randomize());return this.getEncryptedMessage(s).then(e=>{const t=new wt({startMaxLength:e.bytes.length+256});t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data");return t.getBytes(!0)})}sendEncryptedRequest(e){return this.getEncryptedOutput(e).then(t=>{this.debug&&this.log.debug("sendEncryptedRequest: launching message into space:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport.send(t);if(!(this.transport instanceof ga))return a;const n={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then(e=>{if(!(null==e?void 0:e.byteLength))throw n;return e},e=>{throw e.message||e.type||(e=Object.assign(n,{type:"NETWORK_BAD_REQUEST",originalError:e})),e})})}parseResponse(e){this.lastResponseTime=Date.now();const t=new St(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!i(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+a.hex);const s=t.fetchIntBytes(128,!0,"msg_key"),r=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,r).then(e=>this.getMsgKey(e,!1).then(t=>{if(!i(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new St(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const r=a.fetchIntBytes(64,!0,"session_id"),p=a.fetchLong("message_id");if(!(i(r,this.sessionId)||this.prevSessionId&&i(r,this.prevSessionId)))throw this.log.warn("Sessions",r,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+n(r));const o=a.fetchInt("seq_no"),m=e.byteLength,d=a.fetchInt("message_data[length]");let y=a.getOffset();if(d%4||d>m-y)throw new Error("[MT] Invalid body length: "+d);const c=a.fetchRawBytes(d,!0,"message_data");y=a.getOffset();const l=m-y;if(l<12||l>1024)throw new Error("[MT] Invalid padding length: "+l);a=new St(c,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const n=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==n+e.bytes&&a.setOffset(n+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const n=this.sentMessages[e.req_msg_id],s=n&&n.resultType||"Object";e.req_msg_id&&!n||(e.result=a.fetchObject(s,t+"[result]"))}}});return{response:a.fetchObject("","INPUT"),messageId:p,sessionId:r,seqNo:o}}))}applyServerSalt(e){const t=Ne(new Uint8Array(ge(me(e,10),!1)),8,!0,!1,!1);M.set({["dc"+this.dcId+"_server_salt"]:n(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof ga&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof ga&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=self.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof ga&&(t=3e4),this.scheduleRequest(t)}reqResendMessage(e){this.debug&&this.log.debug("Req resend",e),this.pendingResends.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;return Object.keys(this.sentMessages).forEach(t=>{const a=this.sentMessages[t];if(a.notContentRelated&&void 0===this.pendingMessages[t])delete this.sentMessages[t];else if(a.container){for(const t of a.inner)if(void 0!==this.sentMessages[t])return void(e=!0);delete this.sentMessages[t]}else e=!0}),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){for(const e in this.sentMessages){const t=this.sentMessages[e];(t.body||t.container)&&this.pushResend(e)}}processMessage(e,t,a){if("messageEmpty"===e._)return void this.log.warn("processMessage: messageEmpty",e,t);if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=me(t,10);be(a,32);const n=zt.applyServerTime(+le(a,10));(17===e.error_code||n)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),M.get("dc").then(t=>{t===this.dcId&&!this.isFileNetworker&&va.updatesProcessor&&va.updatesProcessor(e)});break;case"msgs_ack":for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResendMessage(e.answer_msg_id);break;case"msgs_state_info":if(this.ackMessage(e.answer_msg_id),this.lastResendReq&&this.lastResendReq.req_msg_id===e.req_msg_id&&this.pendingResends.length)for(const e of this.lastResendReq.resend_msg_ids){const t=this.pendingResends.indexOf(e);-1!==t&&this.pendingResends.splice(t,1)}break;case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,n=this.sentMessages[a];if(this.processMessageAck(a),n){const t=n.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),n.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.msg_id,a=this.sentMessages[t];a&&(a.deferred.resolve(e),delete this.sentMessages[t]);break}default:this.ackMessage(t),null!==va.updatesProcessor&&va.updatesProcessor(e)}}}const _a=new class{constructor(){this.networkers=[],this.language=navigator.language||Ht.langPackCode,this.updatesProcessor=null,this.onConnectionStatusChange=null,this.akStopped=!1,this.userAgent=navigator.userAgent}removeNetworker(e){Xt(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,n,s){const i=new fa(e,t,a,n,s);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter(e=>e.isStopped());this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}};g&&(g.networkerFactory=_a);var va=_a,ba=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Pa=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,c.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map(e=>{const t=new wt;t.storeBytes(s(e.modulus),"n"),t.storeBytes(s(e.exponent),"e");const a=t.getBuffer();return Gt.invokeCrypto("sha1-hash",a).then(t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[n(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}})})).then(()=>{this.prepared=!0,this.preparePromise=null})}select(e){return ba(this,void 0,void 0,(function*(){yield this.prepare();for(let t=0;t{if(h&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw p;try{const t=new St(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const n=t.fetchLong("msg_id");"0"===n&&this.log.error("msg_id === 0",n);const s=t.fetchInt("msg_len");return s||this.log.error("no msg_len",s),t}catch(e){this.log.error("mtpSendPlainRequest: deserialization went bad",e);throw Object.assign(p,{originalError:e})}},e=>{throw e.message||e.type||(e=Object.assign(p,{originalError:e})),e})}sendReqPQ(e){return wa(this,void 0,void 0,(function*(){const t=new wt({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),h&&this.log("Send req_pq",e.nonce.hex);try{const n=this.sendPlainRequest(e.dcId,t.getBytes(!0));Pa.prepare(),a=yield n}catch(e){throw this.log.error("req_pq error",e.message),e}const s=a.fetchObject("ResPQ");if("resPQ"!==s._)throw new Error("[MT] resPQ response invalid: "+s._);if(!i(e.nonce,s.nonce))throw this.log.error(e.nonce,s.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=s.server_nonce,e.pq=s.pq,e.fingerprints=s.server_public_key_fingerprints,h&&this.log("Got ResPQ",n(e.serverNonce),n(e.pq),e.fingerprints);const r=yield Pa.select(e.fingerprints);if(!r)throw new Error("[MT] No public key found");e.publicKey=r,h&&this.log("PQ factorization start",e.pq);try{var p=yield Gt.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=p[0],e.q=p[1],h&&this.log("PQ factorization done",p),this.sendReqDhParams(e)}))}sendReqDhParams(e){return wa(this,void 0,void 0,(function*(){e.newNonce=new Uint8Array(32).randomize();const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new wt({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const s=a.getBytes(!0);if(s.length>144)throw"DH_params: data is more than 144 bytes!";const p=Ne(s,192,!1,!0,!1),o=p.slice().reverse(),m=yield(()=>wa(this,void 0,void 0,(function*(){for(;;){const t=new Uint8Array(32).randomize(),a=o.concat(yield Gt.invokeCrypto("sha256-hash",t.concat(p)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const s=yield Gt.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),i=r(t,yield Gt.invokeCrypto("sha256-hash",s)).concat(s);if(-1===he(me(n(i),16),me(e.publicKey.modulus,16)))return i}})))(),d=Ne(yield Gt.invokeCrypto("rsa-encrypt",m,e.publicKey),256,!0,!0,!0),y={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:d},c=new wt({mtproto:!0});c.storeMethod("req_DH_params",y);const l=c.getBytes(!0);let g;h&&this.log("Send req_DH_params",y);try{g=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const u=g.fetchObject("Server_DH_Params","RESPONSE");if(h&&this.log("Sent req_DH_params, response:",u),"server_DH_params_fail"!==u._&&"server_DH_params_ok"!==u._)throw new Error("[MT] Server_DH_Params response invalid: "+u._);if(!i(e.nonce,u.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!i(e.serverNonce,u.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===u._){if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce)).slice(-16),u.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,u.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return wa(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat(e.serverNonce))).concat((yield Gt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield Gt.invokeCrypto("sha1-hash",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield Gt.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),s=a.slice(20),r=new St(s,{mtproto:!0}),p=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==p._)throw new Error("[MT] server_DH_inner_data response invalid: "+p);if(!i(e.nonce,p.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!i(e.serverNonce,p.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");h&&this.log("Done decrypting answer"),e.g=p.g,e.dhPrime=p.dh_prime,e.gA=p.g_a,e.serverTime=p.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const o=r.getOffset();if(!i(n,yield Gt.invokeCrypto("sha1-hash",s.slice(0,o))))throw new Error("[MT] server_DH_inner_data SHA1-hash mismatch");zt.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){h&&this.log("Verifying DH params",e,t,a);const s=n(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");h&&this.log("dhPrime cmp OK");const i=me(n(a),16),r=me(s,16);if(he(i,U)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(he(i,ee(r,U))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");h&&this.log("1 < gA < dhPrime-1 OK");const p=function(e,t){let a=ue(e);t-=1;for(let n=0;n=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return h&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return wa(this,void 0,void 0,(function*(){const t=s(e.g.toString(16));e.b=new Uint8Array(256).randomize();try{var a=yield Gt.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new wt({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const p=(yield Gt.invokeCrypto("sha1-hash",n.getBuffer())).concat(n.getBytes(!0)),o=yield Gt.invokeCrypto("aes-encrypt",p,e.tmpAesKey,e.tmpAesIv),m=new wt({mtproto:!0});let d;m.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:o}),h&&this.log("Send set_client_DH_params");try{d=yield this.sendPlainRequest(e.dcId,m.getBytes(!0))}catch(e){throw e}const y=d.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==y._&&"dh_gen_retry"!==y._&&"dh_gen_fail"!==y._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+y._);if(!i(e.nonce,y.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!i(e.serverNonce,y.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield Gt.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield Gt.invokeCrypto("sha1-hash",c),g=l.slice(0,8),u=l.slice(-8);switch(h&&this.log("Got Set_client_DH_params_answer",y._,c),y._){case"dh_gen_ok":{const t=(yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([1],g))).slice(-16);if(!i(t,y.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,y),new Error("new_nonce_hash1 mismatch");const a=r(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return h&&this.log("Auth successfull!",u,c,a),e.authKeyId=u,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([2],g))).slice(-16),y.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e);case"dh_gen_fail":if(!i((yield Gt.invokeCrypto("sha1-hash",e.newNonce.concat([3],g))).slice(-16),y.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=ca.pingTransports().then(({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)})}auth(e){let t=this.cached[e];return t||(t=new Promise((t,a)=>wa(this,void 0,void 0,(function*(){let n;yield this.getTransportType();let s=1;for(;s++<=3;)try{const a={dcId:e,nonce:new Uint8Array(16).randomize()},n=this.sendReqPQ(a);return void t(yield n)}catch(e){n=e}a(n)}))),this.cached[e]=t)}};function ka(e,t){return new Promise(a=>{const n=new FileReader;n.addEventListener("loadend",e=>a(e.target.result)),n[t](e)})}function Ca(e){return ka(e,"readAsArrayBuffer")}function Ia(e,t=""){let a;const n=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{a=new Blob(e,{type:n})}catch(t){let s=new BlobBuilder;e.forEach(e=>{s.append(e)}),a=s.getBlob(n)}return a}class Aa{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let a in t)void 0!==t[a]&&(e[a]=t[a])}(this,e),c.test&&(this.name+="_test"),this.storeName=t,this.log=Nt("IDB-"+this.storeName),this.openDatabase(!0),Aa.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let a=!1;return setTimeout(()=>{a||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,n)=>{t.onsuccess=s=>{a=!0;const i=t.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{a=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},t.onupgradeneeded=e=>{a=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var a;const n=e.createObjectStore(t.name);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const e of t.indexes)n.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",a=>e.map((e,n)=>a.put(t[n],e)),"")}saveFile(e,t){return t instanceof Blob||(t=Ia([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,a,n=this.storeName){let s;return a&&(s=performance.now(),this.log(a+": start")),this.openDatabase().then(i=>new Promise((r,p)=>{const o=i.transaction([n],e);o.onerror=e=>{clearTimeout(m),p(o.error)},o.oncomplete=e=>{clearTimeout(m),a&&this.log(a+": end",performance.now()-s);const t=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?d:[].concat(d)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Aa.STORAGES=[];var Ma=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const Ra=new class{constructor(){this.log=Nt("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=c.transport,ca.addEventListener("transport",e=>{this.changeTransportType(e)})}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const n in a){const s=a[n];for(const a in s){s[a].forEach((s,i,r)=>{e({networker:s,dcId:+a,connectionType:n,transportType:t,index:i,array:r})})}}}}chooseServer(e,t,a){return da.chooseServer(e,t,a,"client"===t)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],n=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=n,this.transportType=e;for(const a in this.gettingNetworkers){const n=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const s=a.replace(t,e);this.gettingNetworkers[s]=n,this.log("changed networker getKey from",a,"to",s)}this.iterateNetworkers(e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);e.networker.changeTransport(a)})}getBaseDcId(){return Ma(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield M.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(Ht.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ma(this,void 0,void 0,(function*(){if(!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}M.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then(e=>{this.setOnDrainIfNeeded(e)}),this.baseDcId=e,M.set({dc:this.baseDcId})}logOut(){return Ma(this,void 0,void 0,(function*(){const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map(e=>M.get(e))),a=[];for(let e=0;e{this.baseDcId=void 0,Aa.closeDatabases(),self.postMessage({type:"clear"})};return setTimeout(n,1e3),Promise.all(a).catch(e=>{e.handled=!0}).finally(n)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",i=this.getTransportType(a);this.cachedNetworkers[i]||(this.cachedNetworkers[i]={client:{},download:{},upload:{}});const r=this.cachedNetworkers[i][a];e in r||(r[e]=[]);const p=r[e],o="client"===a||"https"===i?1:3;if(p.length>=o){let e=p.length-1,t=!1;for(;e>=0;--e)if(p[e].isOnline){t=!0;break}const a=t?p.splice(e,1)[0]:p.pop();return p.unshift(a),Promise.resolve(a)}let m=this.generateNetworkerGetKey(e,i,a);if(this.gettingNetworkers[m])return this.gettingNetworkers[m];const d=`dc${e}_auth_key`,y=`dc${e}_server_salt`;let c=this.chooseServer(e,a,i);return this.gettingNetworkers[m]=Promise.all([d,y].map(e=>M.get(e))).then(([r,o])=>Ma(this,void 0,void 0,(function*(){let l,g;if(r&&512===r.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=s(r),n=(yield Gt.invokeCrypto("sha1-hash",a)).slice(-8),i=s(o);l=va.getNetworker(e,a,n,i,t)}else try{const a=yield Sa.auth(e);M.set({[d]:n(a.authKey),[y]:n(a.serverSalt)}),l=va.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){g=e}const h=this.getTransportType(a);if(h!==i&&(m=this.generateNetworkerGetKey(e,h,a),c.destroy(),ma.removeTransport(da.chosenServers,c),l&&(c=this.chooseServer(e,a,h)),this.log("transport has been changed during authorization from",i,"to",h)),delete this.gettingNetworkers[m],g)throw this.log("get networker error",g,g.stack),g;return l.changeTransport(c),p.unshift(l),this.setOnDrainIfNeeded(l),l})))}setOnDrainIfNeeded(e){if(e.onDrain)return;(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then(t=>e.dcId!==t)).then(t=>{e.onDrain||t&&(e.onDrain=()=>{this.log("networker drain",e.dcId),e.onDrain=void 0,e.destroy(),va.removeNetworker(e),ma.removeTransport(this.cachedNetworkers,e)},e.setDrainTimeout())})}invokeApi(e,t={},a={}){const n=Zt();let{afterMessageId:s,prepareTempMessageId:i}=a;if(i&&n.then(()=>{delete this.afterMessageTempIds[i]}),g){const s=Date.now(),i=kt.setInterval(()=>{o&&o.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-s)/1e3)},5e3);n.catch(Wt).finally(()=>{clearInterval(i)})}const r=t=>{t?xe(t)||(t={message:t}):t={type:"ERROR_EMPTY"},n.reject(t),(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors||(406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=m||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout(()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)},100)))};let p,o,m=(new Error).stack||"empty stack";const d=m=>{if(s){const e=this.afterMessageTempIds[s];e&&(a.afterMessageId=e.messageId)}const y=(o=m).wrapApiCall(e,t,a);return i&&(this.afterMessageTempIds[i]={messageId:a.messageId,promise:n}),y.then(n.resolve,i=>{if("FILE_REFERENCE_EXPIRED"!==i.type&&this.log.error("Error",i.code,i.type,this.baseDcId,p,e,t),401===i.code&&this.baseDcId===p)"SESSION_PASSWORD_NEEDED"!==i.type&&(M.delete("dc"),M.delete("user_auth")),r(i);else if(401===i.code&&this.baseDcId&&p!==this.baseDcId){if(void 0===this.cachedExportPromise[p]){const e=new Promise((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:p},{noErrorBox:!0}).then(a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:p,noErrorBox:!0}).then(e,t)},t)});this.cachedExportPromise[p]=e}this.cachedExportPromise[p].then(()=>{this.invokeApi(e,t,a).then(n.resolve,r)},r)}else if(303===i.code){const s=+i.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];s!==p&&(a.dcId?a.dcId=s:this.setBaseDcId(s),this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r))}else if(400===i.code&&0===i.type.indexOf("FILE_MIGRATE")){const s=+i.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];s!==p?this.getNetworker(s,a).then(s=>{s.wrapApiCall(e,t,a).then(n.resolve,r)},r):r(i)}else if(a.rawError||420!==i.code)if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(i.type)){const e=this.afterMessageTempIds[s];s=void 0,delete a.afterMessageId,e?e.promise.then(()=>d(o)):d(o)}else if(a.rawError||500!==i.code)"UNKNOWN"===i.type?setTimeout(()=>{d(o)},1e3):r(i);else{const e=Date.now();if(a.stopTime&&e>=a.stopTime)return r(i);a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,setTimeout(()=>{d(o)},1e3*a.waitTime)}else{const e=+i.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(void 0!==a.floodMaxTimeout?a.floodMaxTimeout:60)&&!a.prepareTempMessageId)return r(i);setTimeout(()=>{d(o)},1e3*e)}})};return(p=a.dcId||this.baseDcId)?this.getNetworker(p,a).then(d,r):this.getBaseDcId().then(e=>{this.getNetworker(p=e,a).then(d,r)}),n}};g.apiManager=Ra;var Ea=Ra;var Va=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};var Ta=new class{constructor(){this.blobSupported=!0;try{Ia([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?(a=t,Ca(a).then(e=>new Uint8Array(e))).then(t=>e.write(t)):e.write(t);var a}getFakeFileWriter(e,t){const a=[];return{write:e=>Va(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;a.push(e)})),truncate:()=>{a.length=0},finalize:(n=!0)=>{const s=Ia(a,e);return n&&t&&t(s),s}}}},Da=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};class Ua{constructor(e){this.dbName=e,this.useStorage=!0,c.test&&(this.dbName+="_test"),Ua.STORAGES.length&&(this.useStorage=Ua.STORAGES[0].useStorage),this.openDatabase(),Ua.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(a=>a.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=Ia(t));const a=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,a).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,a)=>Da(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{a(),n=!0},15e3);try{const a=yield this.openDatabase();if(!a)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield e(a);if(n)return;t(s)}catch(e){a(e)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const a=Ta.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(a)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}Ua.STORAGES=[];var Ba=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};const xa=new class{constructor(){this.cacheStorage=new Ua("cachedFiles"),this.cachedDownloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.webpConvertPromises={},this.refreshReferencePromises={},this.log=Nt("AFM",Mt.Error|Mt.Log),this.tempId=0,this.queueId=0,this.debug=c.debug,this.uncompressTGS=(e,t)=>Gt.invokeCrypto("gzipUncompress",e.slice().buffer,!0),this.convertWebp=(e,t)=>{const a=Zt();return w({type:"convertWebp",payload:{fileName:t,bytes:e}}),this.webpConvertPromises[t]=a},setInterval(()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}},18e5)}downloadRequest(e,t,a,n,s=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise((e,r)=>{i.push({id:t,queueId:s,cb:a,deferred:{resolve:e,reject:r},activeDelta:n})});return setTimeout(()=>{this.downloadCheck(e)},0),r}downloadCheck(e){const t=this.downloadPulls[e],a="upload"===e?24:36;if(this.downloadActives[e]>=a||!t||!t.length)return!1;const n=t.findAndSplice(e=>0===e.queueId)||t.findAndSplice(e=>e.queueId===this.queueId)||t.shift(),s=n.activeDelta||1;this.downloadActives[e]+=s,n.cb().then(t=>{this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.resolve(t)},t=>{t&&t.type&&("DOWNLOAD_CANCELED"===t.type||"UPLOAD_CANCELED"===t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=s,this.downloadCheck(e),n.deferred.reject(t)})}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=(this.cachedDownloadPromises[e]?[this.cachedDownloadPromises[e]]:void 0)||(this.uploadPromises[e]?Array.from(this.uploadPromises[e]):[]);let a=!1;for(let e=0,n=t.length;eBa(this,void 0,void 0,(function*(){return r&&r(),Ea.invokeApi("upload.getWebFile",{location:t,offset:a,limit:n},{dcId:e,fileDownload:!0})})),this.getDelta(n),i)}requestFilePart(e,t,a,s,i=0,r=0,p){return this.downloadRequest(e,i,()=>Ba(this,void 0,void 0,(function*(){p&&p();const i=()=>Ba(this,void 0,void 0,(function*(){p&&p();return Ea.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch(e=>{if("FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t).then(i);throw e})})),r=t.file_reference;if(r&&!t.checkedReference){t.checkedReference=!0;const e=n(r);if(this.refreshReferencePromises[e])return this.refreshReference(t).then(i)}return i()})),this.getDelta(s),r)}getDelta(e){return e/1024/128}getLimitPart(e){let t;return t=512,524288}refreshReference(e){const t=e.file_reference,a=n(t);let s=this.refreshReferencePromises[a];if(!s){const n=Zt();s=this.refreshReferencePromises[a]={deferred:n,timeout:kt.setTimeout(()=>{this.log.error("Didn't refresh the reference:",e),n.reject("REFERENCE_IS_NOT_REFRESHED")},6e4)},n.catch(Wt).finally(()=>{clearTimeout(s.timeout)});w({type:"refreshReference",payload:t})}return s.deferred.then(t=>{if(a===n(t))throw"REFERENCE_IS_NOT_REFRESHED";e.file_reference=t})}downloadFile(e){var t;if(!Ta.isAvailable())return Promise.reject({type:"BROWSER_BLOB_NOT_SUPPORTED"});const a=null!==(t=e.size)&&void 0!==t?t:0,{dcId:n,location:s}=e;let i;"image/webp"!==e.mimeType||Oa()?"application/x-tgsticker"===e.mimeType&&(i=this.uncompressTGS,e.mimeType="application/json"):(i=this.convertWebp,e.mimeType="image/png");const r=function(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join("_");break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join("_");break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join("_");break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join("_");break;default:console.error("Unrecognized location:",e),n=""}return n+(a?"."+a:a)}(s,e.fileName),p=this.cachedDownloadPromises[r],o=this.getFileStorage();if(this.debug&&this.log("downloadFile",r,a,s,e.mimeType),p)return a?p.then(t=>t.sizethis.downloadFile(e)).catch(()=>this.downloadFile(e))):t):p;const m=Zt(),d=e.mimeType||"image/jpeg";let y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.truncate()};const h=this.tempId++;o.getFile(r).then(e=>Ba(this,void 0,void 0,(function*(){if(e.size{o.getFileWriter(r,d).then(t=>{c=t;const p=e.limitPart||this.getLimitPart(a);let o,d,y=Promise.resolve();const f=(e,t)=>Ba(this,void 0,void 0,(function*(){if(i){return yield i(e,r)}return e})),_="inputWebFileLocation"===s._?this.requestWebFilePart.bind(this):this.requestFilePart.bind(this),v=[];o=0;do{d=Zt(),v.push({offset:o,writeFilePromise:y,writeFileDeferred:d}),y=d,o+=p}while(oBa(this,void 0,void 0,(function*(){const{offset:i,writeFilePromise:o,writeFileDeferred:d}=v.shift();try{u();const y=yield _(n,s,i,p,h,e.queueId,u),c=y.bytes;v.length&&P(),this.debug&&this.log("downloadFile requestFilePart result:",r,y);const g=i+p>=a||!c.byteLength;if(c.byteLength){b+=c.byteLength,m.notify({done:b,offset:i,total:a});const e=yield f(c);u(),yield o,u(),yield Ta.write(t,e)}d.resolve(),g&&(l=!0,m.resolve(t.finalize(a<2e7)))}catch(e){g(e)}}));for(let e=0,t=Math.min(1/0,v.length);e{["STORAGE_OFFLINE"].includes(e)||this.log.error("saveFile error:",e)})});const u=()=>{if(y)throw y};return m.cancel=()=>{if(!y&&!l){const e=new Error("Canceled");e.type="DOWNLOAD_CANCELED",g(e)}},m.notify=e=>{S({progress:Object.assign({fileName:r},e)})},this.cachedDownloadPromises[r]=m,m.safeFinally(()=>{delete this.cachedDownloadPromises[r]}),m}deleteFile(e){return delete this.cachedDownloadPromises[e],this.getFileStorage().delete(e)}uploadFile({file:e,fileName:t}){var a;const n=e.size,s=n>=10485760;let i=!1,r=!1,p=0,o=262144;n>67108864?o=524288:n<102400&&(o=32768);const m=this.getDelta(o),d=Math.ceil(n/o),y=rt();let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,parts:d,name:t,md5_checksum:""},g={notify:e=>{}},h=new Promise((e,t)=>{if(d>4e3)return t({type:"FILE_TOO_BIG"});g.resolve=e,g.reject=t});if(Object.assign(h,g),d>4e3)return h;let u=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),h.reject(e),i=!0,u=()=>{}};const f=s?"upload.saveBigFilePart":"upload.saveFilePart",_=this.tempId++,v=this;const b=function*(){for(let t=0;tCa(e.slice(t,t+o)).then(e=>{if(i)throw{type:"UPLOAD_CANCELED"};return v.debug&&v.log("Upload file part, isBig:",s,a,e.byteLength,new Uint8Array(e).length,new Uint8Array(e).slice().length),Ea.invokeApi(f,{file_id:y,file_part:a,file_total_parts:d,bytes:e},{fileUpload:!0}).then(e=>{p++,h.notify({done:p*o,total:n}),p>=d&&(h.resolve(l),r=!0)},u)}),m).catch(u)}}(),P=()=>{if(i)return;const e=b.next();e.done||i||e.value.then(P)};for(let e=0,t=Math.min(1/0,d);e{i||r||(i=!0,u({type:"UPLOAD_CANCELED"}))},h.notify=e=>{S({progress:Object.assign({fileName:t},e)})},h.finally(()=>{w.delete(h),w.size||delete this.uploadPromises[t]});const w=null!==(a=this.uploadPromises[t])&&void 0!==a?a:this.uploadPromises[t]=new Set;return w.add(h),h}};g.apiFileManager=xa;var Fa=xa,La=function(e,t,a,n){return new(a||(a=Promise))((function(s,i){function r(e){try{o(n.next(e))}catch(e){i(e)}}function p(e){try{o(n.throw(e))}catch(e){i(e)}}function o(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,p)}o((n=n.apply(e,t||[])).next())}))};let Na=!1;const Oa=()=>Na;va.setUpdatesProcessor(e=>{S({update:e})}),va.onConnectionStatusChange=e=>{S({type:"connectionStatusChange",payload:e})};const qa={convertWebp:e=>{const{fileName:t,bytes:a}=e.payload,n=Fa.webpConvertPromises[t];n&&(n.resolve(a),delete Fa.webpConvertPromises[t])},webpSupport:e=>{Na=e.payload},socketProxy:e=>{const t=e.payload,a=t.id,n=pa.get(a);"message"===t.type?n.dispatchEvent("message",t.payload):"open"===t.type?n.dispatchEvent("open"):"close"===t.type&&(n.dispatchEvent("close"),pa.delete(a))},localStorageProxy:e=>{M.finishTask(e.id,e.payload)},userAgent:e=>{va.userAgent=e.payload},online:()=>{va.forceReconnectTimeout()},forceReconnect:()=>{va.forceReconnect()},toggleStorage:e=>{const t=e.payload;Ua.toggleStorage(t)},refreshReference:e=>{const t=n(e.originalPayload),a=Fa.refreshReferencePromises[t],s=null==a?void 0:a.deferred;s&&(e.error?s.reject(e.error):s.resolve(e.payload))},crypto:e=>{Gt.invokeCrypto(e.task,...e.args).then(t=>{S({taskId:e.taskId,result:t})})}};kt.addEventListener("message",e=>La(void 0,void 0,void 0,(function*(){try{const t=e.data,a=t.taskId,n=qa[t.type];if(n)return void n(t);if(!t.task)return;switch(t.task){case"requestFilePart":case"setQueueId":case"cancelDownload":case"uploadFile":case"downloadFile":try{let e=Fa[t.task].apply(Fa,t.args);e instanceof Promise&&(e=yield e),S({taskId:a,result:e})}catch(e){S({taskId:a,error:e})}break;case"getNetworker":Ea[t.task].apply(Ea,t.args).finally(()=>{S({taskId:a,result:null})});break;case"setLanguage":case"startAll":case"stopAll":va[t.task].apply(va,t.args);break;default:try{let e=Ea[t.task].apply(Ea,t.args);e instanceof Promise&&(e=yield e),S({taskId:a,result:e})}catch(e){S({taskId:a,error:e})}}}catch(e){console.error("worker task error:",e)}}))),S("ready")}]); +//# sourceMappingURL=mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js.map b/public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map similarity index 99% rename from public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js.map rename to public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map index 2d24ff1ba..467c62df3 100644 --- a/public/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js.map +++ b/public/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/random.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/array.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","a","Uint32Array","f","h","u","w","b","k","_","g","v","y","x","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","bits","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","this","last","wrap","havedict","flags","check","total","head","wbits","length","offset","extra","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","j","K","P","Y","G","X","W","done","text","time","xflags","os","extra_len","String","fromCharCode","comment","hcrc","data_type","apply","Array","2","1","0","toString","q","J","Q","V","$","ee","te","ie","ne","options","slice","arguments","shift","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","Error","header","dictionary","charCodeAt","ae","push","result","onEnd","onData","join","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","bytesToHex","bytes","arr","bytesFromHex","hexString","len","Math","ceil","start","parseInt","charAt","substr","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","byteLength","tmp","lastLength","forEach","ArrayBuffer","bytesFromWordss","bytesToWordss","words","str","configurable","randomize","crypto","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","MOUNT_CLASS_TO","self","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","radix","bpe","mask","digitsStr","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","expand","ans","copy_","mod","dup","mod_","trim","mult","copyInt_","linCombShift_","mult_","powMod","powMod_","sub","sub_","add","add_","eGCD_","max","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","y1","y2","subShift_","addShift_","rightShift_","modInt","minSize","buff","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","out","reverse","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","isObject","intToUint","val","longFromInts","high","low","bigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","buffer","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","xor","left","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","carry","arrays","8","16","32","nextRandomUint","array","randomLong","subtle","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","aesDecryptSync","rsaEncrypt","publicKey","modulus","exponent","hash_pbkdf2","salt","iterations","importKey","deriveBits","hash","pqPrimeFactorization","pqBytes","what","lim","minLen","it","pqPrimeLeemon","console","error","bytesModPow","xBigInt","yBigInt","mBigInt","gzipUncompress","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","log","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","storeRawBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","split","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","toLowerCase","schema","isBare","constructorData","override","hex","readInt","doubleView","longDec","num","Number","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","computeSRP","password","isNew","algo","new_algo","current_algo","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","h1","M1","srp_id","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","messageId","serverTime","localTime","newTimeOffset","changed","abs","server_time_offset","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","once","pop","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","increment","Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","tag","Connection","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","init","connection","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","response","processMessage","sessionId","onClose","needTimeout","retryAt","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","clearTimeout","Connecting","bodySent","setTransportClosed","setAutoReconnect","enable","toEncode","encodePacket","promise","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","transportType","reuse","client","download","upload","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","offline","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","warn","serializer","pingId","storeMethod","ping_id","pingMessage","msg_id","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","min","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","language","afterMessageId","resultType","isAPI","oldTransport","removeTransport","nextReqTimeout","longPollInterval","clearInterval","setInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","sqrt","pushResend","shouldResolve","msgId","noSchedule","timeout","TimedOut","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","map","long","sort","messageByteLength","filter","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","code","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","setOffset","mt_rpc_result","newServerSalt","cb","performScheduledRequest","notEmpty","rawError","matches","error_message","error_code","description","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_twoPow","pow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","readBlobAs","blob","reader","FileReader","target","readBlobAsArrayBuffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","connections","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","replace","iterateNetworkers","info","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","unshift","getKey","generateNetworkerGetKey","ak","ss","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","removeNetworker","prepareTempMessageId","startTime","interval","cachedNetworker","rejectPromise","logOut","noErrorBox","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","exportedAuth","newDcId","includes","stopTime","waitTime","floodMaxTimeout","blobSupported","fileWriter","write","saveFileCallback","part","truncate","finalize","saveToStorage","dbName","caches","timeoutOperation","Response","headers","size","rejected","res","fakeWriter","getFakeFileWriter","saveFile","deleteAll","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","convertWebp","convertPromise","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","getFile","getFileWriter","limitPart","getLimitPart","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","Infinity","progress","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1<
ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":739712882,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":142306870,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactons\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":-1826077446,\"predicate\":\"messageUserReaction\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessageUserReaction\"},{\"id\":-1553558980,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"}]},\"layer\":137} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n\nexport function sha256HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n let bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\nimport { addPadding, isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, bigInt2str, int2bigInt, sub_ } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n /* let perf = performance.now();\n const jsbnBytes: Uint8Array = new Uint8Array(8);\n const jsbnBigInt = bigStringInt(sLong);\n for(let i = 0; i < 8; i++) {\n jsbnBytes[i] = +jsbnBigInt.shiftRight(8 * i).and(bigint(255)).toString(10);\n }\n console.log('perf1', performance.now() - perf); */\n\n // perf = performance.now();\n let bigInt: number[];\n if(sLong[0] === '-') { // leemon library can't parse signed numbers\n bigInt = int2bigInt(0, 64, 8);\n sub_(bigInt, str2bigInt(sLong.slice(1), 10, 64));\n } else {\n bigInt = str2bigInt(sLong, 10, 64);\n }\n\n const hex = bigInt2str(bigInt, 16).slice(-16);\n const bytes = addPadding(bytesFromHex(hex).reverse(), 8, true, true, false);\n\n // console.log('perf2', performance.now() - perf);\n\n this.storeRawBytes(bytes);\n\n // if(jsbnBytes.hex !== bytes.hex) {\n // console.error(bigInt, sLong, bigInt2str(bigInt, 10), negative(bigInt), jsbnBytes.hex, bigInt2str(bigInt, 16), bytes.hex);\n // }\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\r\n \r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = powMod(g, x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n \r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await CryptoWorker.invokeCrypto('sha256-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.9',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport { indexOfAndSplice } from '../../helpers/array';\r\nimport App from '../../config/app';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256-hash', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n result.result = deserializer.fetchObject(type, field + '[result]');\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\n\n \nimport transportController from \"./transports/controller\";\n \n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1-hash', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1-hash', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj) {\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n info.networker.changeTransport(transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n networker.changeTransport(transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { readBlobAsArrayBuffer } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport FileManager from \"../filemanager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport { bytesToHex } from \"../../helpers/bytes\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n};\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20e6;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): CancellablePromise {\r\n if(!FileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob: Blob) => {\r\n if(blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await FileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport { bytesToHex } from '../../helpers/bytes';\nimport ctx from '../../environment/ctx';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n },\n\n crypto: (task: any) => {\n cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId: task.taskId, result});\n });\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n\n switch(task.task) {\n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./node_modules/pako/dist/pako_inflate.min.js","webpack:///./src/helpers/bytes.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/config/modes.ts","webpack:///./src/config/debug.ts","webpack:///./src/helpers/context.ts","webpack:///./src/lib/localStorage.ts","webpack:///./src/lib/sessionStorage.ts","webpack:///./src/vendor/leemon.ts","webpack:///./src/lib/mtproto/bin_utils.ts","webpack:///./src/lib/mtproto/schema.ts","webpack:///./node_modules/@cryptography/aes/dist/es/aes.js","webpack:///./src/helpers/random.ts","webpack:///./src/lib/crypto/crypto_utils.ts","webpack:///./src/lib/mtproto/tl_utils.ts","webpack:///./src/environment/ctx.ts","webpack:///./src/environment/userAgent.ts","webpack:///./src/lib/logger.ts","webpack:///./src/lib/crypto/srp.ts","webpack:///./src/lib/crypto/cryptoworker.ts","webpack:///./src/lib/crypto/crypto_methods.ts","webpack:///./src/lib/mtproto/timeManager.ts","webpack:///./src/config/app.ts","webpack:///./src/helpers/noop.ts","webpack:///./src/helpers/schedulers/pause.ts","webpack:///./src/helpers/cancellablePromise.ts","webpack:///./src/helpers/eventListenerBase.ts","webpack:///./src/helpers/array.ts","webpack:///./src/lib/mtproto/transports/websocket.ts","webpack:///./src/lib/mtproto/transports/obfuscation.ts","webpack:///./src/lib/mtproto/transports/intermediate.ts","webpack:///./src/lib/mtproto/connectionStatus.ts","webpack:///./src/lib/mtproto/transports/tcpObfuscated.ts","webpack:///./src/lib/mtproto/transports/socketProxied.ts","webpack:///./src/lib/mtproto/dcConfigurator.ts","webpack:///./src/lib/mtproto/transports/controller.ts","webpack:///./src/lib/mtproto/transports/http.ts","webpack:///./src/lib/mtproto/networker.ts","webpack:///./src/lib/mtproto/networkerFactory.ts","webpack:///./src/lib/mtproto/rsaKeysManager.ts","webpack:///./src/lib/mtproto/authorizer.ts","webpack:///./src/helpers/blob.ts","webpack:///./src/lib/idb.ts","webpack:///./src/helpers/object.ts","webpack:///./src/lib/mtproto/apiManager.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/lib/mtproto/apiFileManager.ts","webpack:///./src/helpers/fileName.ts","webpack:///./src/lib/mtproto/mtproto.worker.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","e","a","Uint32Array","f","h","u","w","b","k","_","g","v","y","x","E","R","A","state","next_in","input","avail_in","next_out","output","avail_out","dmax","wsize","whave","wnext","window","hold","bits","lencode","distcode","lenbits","distbits","msg","sane","Uint16Array","Uint8Array","Z","S","O","U","T","D","I","B","N","C","z","F","Z_NO_FLUSH","Z_PARTIAL_FLUSH","Z_SYNC_FLUSH","Z_FULL_FLUSH","Z_FINISH","Z_BLOCK","Z_TREES","Z_OK","Z_STREAM_END","Z_NEED_DICT","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_MEM_ERROR","Z_BUF_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","this","last","wrap","havedict","flags","check","total","head","wbits","length","offset","extra","ncode","nlen","ndist","have","next","lens","work","lendyn","distdyn","back","was","total_in","total_out","adler","Int32Array","set","subarray","L","M","H","j","K","P","Y","G","X","W","done","text","time","xflags","os","extra_len","String","fromCharCode","comment","hcrc","data_type","apply","Array","2","1","0","toString","q","J","Q","V","$","ee","te","ie","ne","options","slice","arguments","shift","TypeError","chunkSize","windowBits","to","raw","err","ended","chunks","strm","Error","header","dictionary","charCodeAt","ae","push","result","onEnd","onData","join","re","se","oe","le","de","fe","Inflate","inflate","inflateRaw","ungzip","constants","default","bytesToHex","bytes","arr","bytesFromHex","hexString","len","Math","ceil","start","parseInt","charAt","substr","bytesCmp","bytes1","bytes2","bytesXor","convertToUint8Array","TextEncoder","encode","bufferConcats","args","reduce","acc","byteLength","tmp","lastLength","forEach","ArrayBuffer","bytesFromWordss","bytesToWordss","words","str","configurable","randomize","crypto","getRandomValues","concat","toJSON","findAndSplice","verify","index","findIndex","splice","undefined","toHHMMSS","leadZero","sec_num","hours","floor","minutes","seconds","Promise","finally","fn","onFinally","callback","resolve","then","reason","reject","safeFinally","catch","Modes","test","location","search","indexOf","debug","http","ssl","multipleConnections","asServiceWorker","transport","DEBUG","MOUNT_CLASS_TO","self","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","listeners","listener","postMessage","notifyWorker","noop","notifySomeone","notifyAll","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","keys","delete","enabled","clear","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","radix","bpe","mask","digitsStr","one","int2bigInt","s0","s3","s4","s5","s6","s7","sa","eg_u","eg_A","eg_B","eg_C","eg_D","bitSize","expand","ans","copy_","mod","dup","mod_","trim","mult","copyInt_","linCombShift_","mult_","powMod","powMod_","sub","sub_","add","add_","eGCD_","max","halve_","greater","equalsInt","negative","multInt_","leftShift_","greaterShift","kx","ky","divide_","y1","y2","subShift_","addShift_","rightShift_","modInt","minSize","buff","str2bigInt","base","kk","substring","addInt_","equals","isZero","bigInt2str","divInt_","bigInt2bytes","littleEndian","out","reverse","cmp","ys","multMod_","squareMod_","k1","k2","kn","np","inverseModInt","mont_","ui","ks","isObject","intToUint","val","longFromInts","high","low","bigInt","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","needPadding","padding","buffer","Si","T1","T2","T3","T4","T5","T6","T7","T8","getWords","buf","pos","xor","left","right","x2","x4","tEnc","tDec","xInv","computeTables","AES","_key","encKey","decKey","rcon","encrypt","_message","a2","b2","c2","message","rounds","decrypt","AES_IGE","iv","cipher","cipherText","prevX","prevY","yXOR","counter","incrementCounter","carry","arrays","8","16","32","nextRandomUint","array","randomLong","subtle","sha1HashSync","digest","sha256HashSync","aesEncryptSync","keyBytes","ivBytes","aesDecryptSync","rsaEncrypt","publicKey","modulus","exponent","hash_pbkdf2","salt","iterations","importKey","deriveBits","hash","pqPrimeFactorization","pqBytes","what","lim","minLen","it","pqPrimeLeemon","console","error","bytesModPow","xBigInt","yBigInt","mBigInt","gzipUncompress","boolFalse","API","constructors","find","predicate","boolTrue","vector","gzipPacked","MTProto","maxLength","mtproto","startMaxLength","createBuffer","intView","byteView","resultBuffer","resultInt32","getArray","typed","resultArray","needBytes","previousBuffer","previousArray","field","log","checkLength","writeInt","iHigh","iLow","sLong","isArray","storeLongP","storeIntBytes","storeRawBytes","Float64Array","sUTF8","unescape","encodeURIComponent","methodName","params","methodData","methods","method","storeInt","pFlags","flagsOffsets","param","condType","split","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","itemType","toLowerCase","schema","isBare","constructorData","override","hex","readInt","doubleView","longDec","num","Number","isSafeInteger","fetchObject","decodeURIComponent","escape","fetchInt","fetchLong","fetchIntBytes","fetchString","fetchBytes","fetchDouble","fetchBool","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","TLDeserialization","TLSerialization","USER_AGENT","navigator","userAgent","IS_SAFARI","vendor","platform","maxTouchPoints","MSStream","match","IS_FIREFOX","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","_logTimer","Date","now","dT","toFixed","getCallerFunctionNameFromLine","IS_WEBKIT","line","splitted","lastIndexOf","STYLES_SUPPORTED","LINE_INDEX","getCallerFunctionName","lines","stack","LOGGER_STYLES","black","red","green","yellow","blue","magenta","cyan","white","logger","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","computeSRP","password","isNew","algo","new_algo","current_algo","client_salt","server_salt","invokeCrypto","makePasswordHash","salt1","salt2","padArray","flipper","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","a_for_hash","secure_random","generate_and_check_random","g_b","h1","M1","srp_id","performTaskWorker","super","webWorker","awaiting","pending","utils","task","timeManager","lastMessageId","timeOffset","timeTicks","messageId","serverTime","localTime","newTimeOffset","changed","abs","server_time_offset","App","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","hostname","suffix","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","cancel","assign","EventListenerBase","reuseResults","_constructor","listenerResults","once","pop","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","Counter","initialValue","_counter","_remainingCounter","_remainingCounterIndex","_aes","encrypted","increment","Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","tag","Connection","retryTimeout","intermediate","obfuscation","connected","autoReconnect","onOpen","setTransportOpened","init","connection","networker","setConnectionStatus","Connected","cleanupSent","resend","encoded","encodeBody","releasePending","onMessage","decode","readPacket","parseResponse","response","processMessage","sessionId","onClose","needTimeout","retryAt","lastCloseTime","isNaN","Closed","reconnectTimeout","reconnect","clearTimeout","Connecting","bodySent","setTransportClosed","setAutoReconnect","enable","toEncode","encodePacket","promise","socketId","socketsProxied","Map","TEST_SUFFIX","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","transportType","reuse","client","download","upload","servers","transports","opened","waitForWebSocket","https","dcConfigurator","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","invokeAfterMsgConstructor","authKey","authKeyId","serverSalt","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResends","nextReq","checkConnectionPeriod","offline","lastResendReq","isOnline","lastResponseTime","activeRequests","checkLongPoll","isClean","longPollPending","isStopped","isFileNetworker","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","warn","serializer","pingId","storeMethod","ping_id","pingMessage","msg_id","generateId","seq_no","generateSeqNo","getBytes","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","min","authKeyUint8","isFileUpload","fileUpload","isFileDownload","fileDownload","updateSession","seqNo","prevSessionId","sentMessageId","sentMessage","container","forEachReverse","inner","innerSentMessageId","innerSentMessage","updateSentMessage","notContentRelated","pushMessage","connectionInited","invokeWithLayer","layer","initConnection","language","afterMessageId","resultType","isAPI","oldTransport","removeTransport","nextReqTimeout","longPollInterval","clearInterval","setInterval","changeTransport","forceReconnect","sendingLongPoll","wrapMtpCall","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","noResponseMsgs","sqrt","pushResend","shouldResolve","msgId","noSchedule","timeout","TimedOut","setDrainTimeout","onDrainTimeout","onDrain","willChange","onConnectionStatusChange","innerMsgId","acked","dataWithPadding","isOut","msgKeyLargePlain","msgKeyLarge","msgKey","sha2aText","sha2bText","promises","results","aesKey","aesIv","sha2a","sha2b","akStopped","ackMsgIds","wrapMtpMessage","msg_ids","resendMsgIds","resendOpts","req_msg_id","resend_msg_ids","outMessage","messages","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","map","long","sort","messageByteLength","filter","generateContainerMessage","messageWithBody","handleSentEncryptedRequestHTTP","innerMessages","getMsgKey","keyIv","getAesKeyIv","encryptedData","dataBuffer","getBuffer","paddingLength","getOffset","getEncryptedMessage","encryptedResult","request","getEncryptedOutput","requestData","baseError","code","originalError","responseBuffer","deserializer","fetchRawBytes","getDecryptedMessage","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","setOffset","mt_rpc_result","newServerSalt","cb","performScheduledRequest","notEmpty","rawError","matches","error_message","error_code","description","innerMessage","applyServerSalt","new_server_salt","bad_msg_id","ackMessage","changedOffset","applyServerTime","badMessage","processMessageAck","first_msg_id","updatesProcessor","answer_msg_id","reqResendMessage","badMsgId","processError","networkerFactory","networkers","stoppedNetworkers","langCode","forceReconnectTimeout","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","select","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","dc","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","_gABigInt","_dhPrimeBigInt","_twoPow","pow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","new_nonce_hash2","new_nonce_hash3","getTransportTypePromise","getTransportType","_try","sendReqPQ","readBlobAs","blob","reader","FileReader","target","readBlobAsArrayBuffer","blobConstruct","blobParts","mimeType","safeMimeType","blobSafeMimeType","Blob","bb","BlobBuilder","blobPart","append","getBlob","db","storeName","storageIsAvailable","fromObject","safeAssign","openDatabase","preserve","onclose","createNew","openDbPromise","indexedDB","open","finished","onerror","onsuccess","calledNew","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","store","objectStoreNames","contains","createObjectStore","indexes","createIndex","indexName","keyPath","objectParameters","entryName","getObjectStore","objectStore","put","fileName","save","perf","performance","oncomplete","requests","getAll","apiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","afterMessageTempIds","changeTransportType","connections","dcs","oldTransportType","oldObject","newObject","oldGetKey","newGetKey","replace","iterateNetworkers","info","setBaseDcId","userAuth","dcID","getBaseDcId","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","storageKeys","storageResult","logoutPromises","invokeApi","ignoreErrors","closeDatabases","handled","maxNetworkers","found","unshift","getKey","generateNetworkerGetKey","ak","ss","authKeyHex","serverSaltHex","authorizer","_error","newTransportType","canRelease","removeNetworker","prepareTempMessageId","startTime","interval","cachedNetworker","rejectPromise","logOut","noErrorBox","performRequest","after","wrapApiCall","exportResolve","exportReject","dc_id","exportedAuth","newDcId","includes","stopTime","waitTime","floodMaxTimeout","blobSupported","fileWriter","write","saveFileCallback","part","truncate","finalize","saveToStorage","dbName","caches","timeoutOperation","Response","headers","size","rejected","res","fakeWriter","getFakeFileWriter","saveFile","deleteAll","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","convertWebp","convertPromise","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","isWebpSupported","ext","thumb_size","Boolean","photo_id","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","getFileNameByLocation","cachedPromise","fileStorage","getFileStorage","deleteFile","downloadFile","cacheFileWriter","resolved","errorHandler","getFile","getFileWriter","limitPart","getLimitPart","writeFileDeferred","writeFilePromise","processDownloaded","requestWebFilePart","requestFilePart","delayed","superpuper","isFinal","processedResult","Infinity","progress","file","fileSize","isBigFile","doneParts","partSize","totalParts","fileId","_part","resultInputFile","parts","md5_checksum","details","file_id","file_part","file_total_parts","generator","Set","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n","/*! pako 2.0.3 https://github.com/nodeca/pako @license (MIT AND Zlib) */\n!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).pako={})}(this,(function(e){\"use strict\";var t=(e,t,i,n)=>{let a=65535&e|0,r=e>>>16&65535|0,s=0;for(;0!==i;){s=i>2e3?2e3:i,i-=s;do{a=a+t[n++]|0,r=r+a|0}while(--s);a%=65521,r%=65521}return a|r<<16|0};const i=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var n=(e,t,n,a)=>{const r=i,s=a+n;e^=-1;for(let i=a;i>>8^r[255&(e^t[i])];return-1^e};var a=function(e,t){let i,n,a,r,s,o,l,d,f,h,c,u,w,b,k,m,_,g,v,p,y,x,E,R;const A=e.state;i=e.next_in,E=e.input,n=i+(e.avail_in-5),a=e.next_out,R=e.output,r=a-(t-e.avail_out),s=a+(e.avail_out-257),o=A.dmax,l=A.wsize,d=A.whave,f=A.wnext,h=A.window,c=A.hold,u=A.bits,w=A.lencode,b=A.distcode,k=(1<>>24,c>>>=g,u-=g,g=_>>>16&255,0===g)R[a++]=65535&_;else{if(!(16&g)){if(0==(64&g)){_=w[(65535&_)+(c&(1<>>=g,u-=g),u<15&&(c+=E[i++]<>>24,c>>>=g,u-=g,g=_>>>16&255,!(16&g)){if(0==(64&g)){_=b[(65535&_)+(c&(1<o){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(c>>>=g,u-=g,g=a-r,p>g){if(g=p-g,g>d&&A.sane){e.msg=\"invalid distance too far back\",A.mode=30;break e}if(y=0,x=h,0===f){if(y+=l-g,g2;)R[a++]=x[y++],R[a++]=x[y++],R[a++]=x[y++],v-=3;v&&(R[a++]=x[y++],v>1&&(R[a++]=x[y++]))}else{y=a-p;do{R[a++]=R[y++],R[a++]=R[y++],R[a++]=R[y++],v-=3}while(v>2);v&&(R[a++]=R[y++],v>1&&(R[a++]=R[y++]))}break}}break}}while(i>3,i-=v,u-=v<<3,c&=(1<{const u=c.bits;let w,b,k,m,_,g,v=0,p=0,y=0,x=0,E=0,R=0,A=0,Z=0,S=0,O=0,U=null,T=0;const D=new Uint16Array(16),I=new Uint16Array(16);let B,N,C,z=null,F=0;for(v=0;v<=r;v++)D[v]=0;for(p=0;p=1&&0===D[x];x--);if(E>x&&(E=x),0===x)return a[f++]=20971520,a[f++]=20971520,c.bits=1,0;for(y=1;y0&&(0===e||1!==x))return-1;for(I[1]=0,v=1;v852||2===e&&S>592)return 1;for(;;){B=v-A,h[p]g?(N=z[F+h[p]],C=U[T+h[p]]):(N=96,C=0),w=1<>A)+b]=B<<24|N<<16|C|0}while(0!==b);for(w=1<>=1;if(0!==w?(O&=w-1,O+=w):O=0,p++,0==--D[v]){if(v===x)break;v=t[i+h[p]]}if(v>E&&(O&m)!==k){for(0===A&&(A=E),_+=y,R=v-A,Z=1<852||2===e&&S>592)return 1;k=O&m,a[k]=E<<24|R<<16|_-f|0}}return 0!==O&&(a[_+O]=v-A<<24|64<<16|0),c.bits=E,0},h={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{Z_FINISH:c,Z_BLOCK:u,Z_TREES:w,Z_OK:b,Z_STREAM_END:k,Z_NEED_DICT:m,Z_STREAM_ERROR:_,Z_DATA_ERROR:g,Z_MEM_ERROR:v,Z_BUF_ERROR:p,Z_DEFLATED:y}=h,x=12,E=30,R=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function A(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Z=e=>{if(!e||!e.state)return _;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg=\"\",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,b},S=e=>{if(!e||!e.state)return _;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,Z(e)},O=(e,t)=>{let i;if(!e||!e.state)return _;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?_:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,S(e))},U=(e,t)=>{if(!e)return _;const i=new A;e.state=i,i.window=null;const n=O(e,t);return n!==b&&(e.state=null),n};let T,D,I=!0;const B=e=>{if(I){T=new Int32Array(512),D=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(f(1,e.lens,0,288,T,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;f(2,e.lens,0,32,D,0,e.work,{bits:5}),I=!1}e.lencode=T,e.lenbits=9,e.distcode=D,e.distbits=5},N=(e,t,i,n)=>{let a;const r=e.state;return null===r.window&&(r.wsize=1<=r.wsize?(r.window.set(t.subarray(i-r.wsize,i),0),r.wnext=0,r.whave=r.wsize):(a=r.wsize-r.wnext,a>n&&(a=n),r.window.set(t.subarray(i-n,i-n+a),r.wnext),(n-=a)?(r.window.set(t.subarray(i-n,i),0),r.wnext=n,r.whave=r.wsize):(r.wnext+=a,r.wnext===r.wsize&&(r.wnext=0),r.whaveU(e,15),inflateInit2:U,inflate:(e,i)=>{let r,s,o,l,d,h,A,Z,S,O,U,T,D,I,C,z,F,L,M,H,j,K,P=0;const Y=new Uint8Array(4);let G,X;const W=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return _;r=e.state,r.mode===x&&(r.mode=13),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,O=h,U=A,K=b;e:for(;;)switch(r.mode){case 1:if(0===r.wrap){r.mode=13;break}for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0),Z=0,S=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&Z)<<8)+(Z>>8))%31){e.msg=\"incorrect header check\",r.mode=E;break}if((15&Z)!==y){e.msg=\"unknown compression method\",r.mode=E;break}if(Z>>>=4,S-=4,j=8+(15&Z),0===r.wbits)r.wbits=j;else if(j>r.wbits){e.msg=\"invalid window size\",r.mode=E;break}r.dmax=1<>8&1),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=3;case 3:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,Y[2]=Z>>>16&255,Y[3]=Z>>>24&255,r.check=n(r.check,Y,4,0)),Z=0,S=0,r.mode=4;case 4:for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>8),512&r.flags&&(Y[0]=255&Z,Y[1]=Z>>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0,r.mode=5;case 5:if(1024&r.flags){for(;S<16;){if(0===h)break e;h--,Z+=s[l++]<>>8&255,r.check=n(r.check,Y,2,0)),Z=0,S=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(T=r.length,T>h&&(T=h),T&&(r.head&&(j=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Uint8Array(r.head.extra_len)),r.head.extra.set(s.subarray(l,l+T),j)),512&r.flags&&(r.check=n(r.check,s,T,l)),h-=T,l+=T,r.length-=T),r.length))break e;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===h)break e;T=0;do{j=s[l+T++],r.head&&j&&r.length<65536&&(r.head.name+=String.fromCharCode(j))}while(j&&T>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=x;break;case 10:for(;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>=7&S,S-=7&S,r.mode=27;break}for(;S<3;){if(0===h)break e;h--,Z+=s[l++]<>>=1,S-=1,3&Z){case 0:r.mode=14;break;case 1:if(B(r),r.mode=20,i===w){Z>>>=2,S-=2;break e}break;case 2:r.mode=17;break;case 3:e.msg=\"invalid block type\",r.mode=E}Z>>>=2,S-=2;break;case 14:for(Z>>>=7&S,S-=7&S;S<32;){if(0===h)break e;h--,Z+=s[l++]<>>16^65535)){e.msg=\"invalid stored block lengths\",r.mode=E;break}if(r.length=65535&Z,Z=0,S=0,r.mode=15,i===w)break e;case 15:r.mode=16;case 16:if(T=r.length,T){if(T>h&&(T=h),T>A&&(T=A),0===T)break e;o.set(s.subarray(l,l+T),d),h-=T,l+=T,A-=T,d+=T,r.length-=T;break}r.mode=x;break;case 17:for(;S<14;){if(0===h)break e;h--,Z+=s[l++]<>>=5,S-=5,r.ndist=1+(31&Z),Z>>>=5,S-=5,r.ncode=4+(15&Z),Z>>>=4,S-=4,r.nlen>286||r.ndist>30){e.msg=\"too many length or distance symbols\",r.mode=E;break}r.have=0,r.mode=18;case 18:for(;r.have>>=3,S-=3}for(;r.have<19;)r.lens[W[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,G={bits:r.lenbits},K=f(0,r.lens,0,19,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid code lengths set\",r.mode=E;break}r.have=0,r.mode=19;case 19:for(;r.have>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=C,S-=C,r.lens[r.have++]=F;else{if(16===F){for(X=C+2;S>>=C,S-=C,0===r.have){e.msg=\"invalid bit length repeat\",r.mode=E;break}j=r.lens[r.have-1],T=3+(3&Z),Z>>>=2,S-=2}else if(17===F){for(X=C+3;S>>=C,S-=C,j=0,T=3+(7&Z),Z>>>=3,S-=3}else{for(X=C+7;S>>=C,S-=C,j=0,T=11+(127&Z),Z>>>=7,S-=7}if(r.have+T>r.nlen+r.ndist){e.msg=\"invalid bit length repeat\",r.mode=E;break}for(;T--;)r.lens[r.have++]=j}}if(r.mode===E)break;if(0===r.lens[256]){e.msg=\"invalid code -- missing end-of-block\",r.mode=E;break}if(r.lenbits=9,G={bits:r.lenbits},K=f(1,r.lens,0,r.nlen,r.lencode,0,r.work,G),r.lenbits=G.bits,K){e.msg=\"invalid literal/lengths set\",r.mode=E;break}if(r.distbits=6,r.distcode=r.distdyn,G={bits:r.distbits},K=f(2,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,G),r.distbits=G.bits,K){e.msg=\"invalid distances set\",r.mode=E;break}if(r.mode=20,i===w)break e;case 20:r.mode=21;case 21:if(h>=6&&A>=258){e.next_out=d,e.avail_out=A,e.next_in=l,e.avail_in=h,r.hold=Z,r.bits=S,a(e,U),d=e.next_out,o=e.output,A=e.avail_out,l=e.next_in,s=e.input,h=e.avail_in,Z=r.hold,S=r.bits,r.mode===x&&(r.back=-1);break}for(r.back=0;P=r.lencode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,r.length=F,0===z){r.mode=26;break}if(32&z){r.back=-1,r.mode=x;break}if(64&z){e.msg=\"invalid literal/length code\",r.mode=E;break}r.extra=15&z,r.mode=22;case 22:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;P=r.distcode[Z&(1<>>24,z=P>>>16&255,F=65535&P,!(C<=S);){if(0===h)break e;h--,Z+=s[l++]<>L)],C=P>>>24,z=P>>>16&255,F=65535&P,!(L+C<=S);){if(0===h)break e;h--,Z+=s[l++]<>>=L,S-=L,r.back+=L}if(Z>>>=C,S-=C,r.back+=C,64&z){e.msg=\"invalid distance code\",r.mode=E;break}r.offset=F,r.extra=15&z,r.mode=24;case 24:if(r.extra){for(X=r.extra;S>>=r.extra,S-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg=\"invalid distance too far back\",r.mode=E;break}r.mode=25;case 25:if(0===A)break e;if(T=U-A,r.offset>T){if(T=r.offset-T,T>r.whave&&r.sane){e.msg=\"invalid distance too far back\",r.mode=E;break}T>r.wnext?(T-=r.wnext,D=r.wsize-T):D=r.wnext-T,T>r.length&&(T=r.length),I=r.window}else I=o,D=d-r.offset,T=r.length;T>A&&(T=A),A-=T,r.length-=T;do{o[d++]=I[D++]}while(--T);0===r.length&&(r.mode=21);break;case 26:if(0===A)break e;o[d++]=r.length,A--,r.mode=21;break;case 27:if(r.wrap){for(;S<32;){if(0===h)break e;h--,Z|=s[l++]<{if(!e||!e.state)return _;let t=e.state;return t.window&&(t.window=null),e.state=null,b},inflateGetHeader:(e,t)=>{if(!e||!e.state)return _;const i=e.state;return 0==(2&i.wrap)?_:(i.head=t,t.done=!1,b)},inflateSetDictionary:(e,i)=>{const n=i.length;let a,r,s;return e&&e.state?(a=e.state,0!==a.wrap&&11!==a.mode?_:11===a.mode&&(r=1,r=t(r,i,n,0),r!==a.check)?g:(s=N(e,i,n,n),s?(a.mode=31,v):(a.havedict=1,b))):_},inflateInfo:\"pako inflate (from Nodeca project)\"};const z=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var F=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if(\"object\"!=typeof i)throw new TypeError(i+\"must be non-object\");for(const t in i)z(i,t)&&(e[t]=i[t])}}return e},L=e=>{let t=0;for(let i=0,n=e.length;i=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;H[254]=H[254]=1;var j=e=>{let t,i,n,a,r,s=e.length,o=0;for(a=0;a>>6,t[r++]=128|63&i):i<65536?(t[r++]=224|i>>>12,t[r++]=128|i>>>6&63,t[r++]=128|63&i):(t[r++]=240|i>>>18,t[r++]=128|i>>>12&63,t[r++]=128|i>>>6&63,t[r++]=128|63&i);return t},K=(e,t)=>{let i,n;const a=t||e.length,r=new Array(2*a);for(n=0,i=0;i4)r[n++]=65533,i+=s-1;else{for(t&=2===s?31:3===s?15:7;s>1&&i1?r[n++]=65533:t<65536?r[n++]=t:(t-=65536,r[n++]=55296|t>>10&1023,r[n++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&M)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i=\"\";for(let n=0;n{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+H[e[i]]>t?i:t},Y={2:\"need dictionary\",1:\"stream end\",0:\"\",\"-1\":\"file error\",\"-2\":\"stream error\",\"-3\":\"data error\",\"-4\":\"insufficient memory\",\"-5\":\"buffer error\",\"-6\":\"incompatible version\"};var G=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg=\"\",this.state=null,this.data_type=2,this.adler=0};var X=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name=\"\",this.comment=\"\",this.hcrc=0,this.done=!1};const W=Object.prototype.toString,{Z_NO_FLUSH:q,Z_FINISH:J,Z_OK:Q,Z_STREAM_END:V,Z_NEED_DICT:$,Z_STREAM_ERROR:ee,Z_DATA_ERROR:te,Z_MEM_ERROR:ie}=h;function ne(e){this.options=F({chunkSize:65536,windowBits:15,to:\"\"},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg=\"\",this.ended=!1,this.chunks=[],this.strm=new G,this.strm.avail_out=0;let i=C.inflateInit2(this.strm,t.windowBits);if(i!==Q)throw new Error(Y[i]);if(this.header=new X,C.inflateGetHeader(this.strm,this.header),t.dictionary&&(\"string\"==typeof t.dictionary?t.dictionary=j(t.dictionary):\"[object ArrayBuffer]\"===W.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=C.inflateSetDictionary(this.strm,t.dictionary),i!==Q)))throw new Error(Y[i])}function ae(e,t){const i=new ne(t);if(i.push(e),i.err)throw i.msg||Y[i.err];return i.result}ne.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,a=this.options.dictionary;let r,s,o;if(this.ended)return!1;for(s=t===~~t?t:!0===t?J:q,\"[object ArrayBuffer]\"===W.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),r=C.inflate(i,s),r===$&&a&&(r=C.inflateSetDictionary(i,a),r===Q?r=C.inflate(i,s):r===te&&(r=$));i.avail_in>0&&r===V&&i.state.wrap>0&&0!==e[i.next_in];)C.inflateReset(i),r=C.inflate(i,s);switch(r){case ee:case te:case $:case ie:return this.onEnd(r),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||r===V))if(\"string\"===this.options.to){let e=P(i.output,i.next_out),t=i.next_out-e,a=K(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(a)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(r!==Q||0!==o){if(r===V)return r=C.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},ne.prototype.onData=function(e){this.chunks.push(e)},ne.prototype.onEnd=function(e){e===Q&&(\"string\"===this.options.to?this.result=this.chunks.join(\"\"):this.result=L(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var re=ne,se=ae,oe=function(e,t){return(t=t||{}).raw=!0,ae(e,t)},le=ae,de=h,fe={Inflate:re,inflate:se,inflateRaw:oe,ungzip:le,constants:de};e.Inflate=re,e.constants=de,e.default=fe,e.inflate=se,e.inflateRaw=oe,e.ungzip=le,Object.defineProperty(e,\"__esModule\",{value:!0})}));\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function bytesToHex(bytes: ArrayLike) {\r\n const length = bytes.length;\r\n const arr: string[] = new Array(length);\r\n for(let i = 0; i < length; ++i) {\r\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\r\n }\r\n return arr.join('');\r\n}\r\n\r\nexport function bytesFromHex(hexString: string) {\r\n const len = hexString.length;\r\n const bytes = new Uint8Array(Math.ceil(len / 2));\r\n let start = 0;\r\n\r\n if(len % 2) { // read 0x581 as 0x0581\r\n bytes[start++] = parseInt(hexString.charAt(0), 16);\r\n }\r\n\r\n for(let i = start; i < len; i += 2) {\r\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bytesToBase64(bytes: number[] | Uint8Array) {\r\n let mod3: number;\r\n let result = '';\r\n\r\n for(let nLen = bytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; ++nIdx) {\r\n mod3 = nIdx % 3;\r\n nUint24 |= bytes[nIdx] << (16 >>> mod3 & 24);\r\n if(mod3 === 2 || nLen - nIdx === 1) {\r\n result += String.fromCharCode(\r\n uint6ToBase64(nUint24 >>> 18 & 63),\r\n uint6ToBase64(nUint24 >>> 12 & 63),\r\n uint6ToBase64(nUint24 >>> 6 & 63),\r\n uint6ToBase64(nUint24 & 63)\r\n );\r\n nUint24 = 0;\r\n }\r\n }\r\n\r\n return result.replace(/A(?=A$|$)/g, '=');\r\n}\r\n\r\nexport function uint6ToBase64(nUint6: number) {\r\n return nUint6 < 26\r\n ? nUint6 + 65\r\n : nUint6 < 52\r\n ? nUint6 + 71\r\n : nUint6 < 62\r\n ? nUint6 - 4\r\n : nUint6 === 62\r\n ? 43\r\n : nUint6 === 63\r\n ? 47\r\n : 65;\r\n}\r\n\r\nexport function bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\r\n const len = bytes1.length;\r\n if(len !== bytes2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < len; ++i) {\r\n if(bytes1[i] !== bytes2[i]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\r\n const len = bytes1.length;\r\n const bytes = new Uint8Array(len);\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = bytes1[i] ^ bytes2[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\n/* export function bytesToArrayBuffer(b: number[]) {\r\n return (new Uint8Array(b)).buffer;\r\n}\r\n\r\nexport function convertToArrayBuffer(bytes: any | ArrayBuffer | Uint8Array) {\r\n // Be careful with converting subarrays!!\r\n if(bytes instanceof ArrayBuffer) {\r\n return bytes;\r\n }\r\n if(bytes.buffer !== undefined &&\r\n bytes.buffer.byteLength === bytes.length * bytes.BYTES_PER_ELEMENT) {\r\n return bytes.buffer;\r\n }\r\n return bytesToArrayBuffer(bytes);\r\n} */\r\n\r\nexport function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\r\n if(bytes instanceof Uint8Array) {\r\n return bytes;\r\n } else if(typeof(bytes) === 'string') {\r\n return new TextEncoder().encode(bytes);\r\n }\r\n\r\n return new Uint8Array(bytes);\r\n}\r\n\r\n/* export function bytesFromArrayBuffer(buffer: ArrayBuffer) {\r\n const len = buffer.byteLength;\r\n const byteView = new Uint8Array(buffer);\r\n const bytes: number[] = [];\r\n\r\n for(let i = 0; i < len; ++i) {\r\n bytes[i] = byteView[i];\r\n }\r\n\r\n return bytes;\r\n}\r\n\r\nexport function bufferConcat(buffer1: any, buffer2: any) {\r\n const l1 = buffer1.byteLength || buffer1.length;\r\n const l2 = buffer2.byteLength || buffer2.length;\r\n const tmp = new Uint8Array(l1 + l2);\r\n tmp.set(buffer1 instanceof ArrayBuffer ? new Uint8Array(buffer1) : buffer1, 0);\r\n tmp.set(buffer2 instanceof ArrayBuffer ? new Uint8Array(buffer2) : buffer2, l1);\r\n\r\n return tmp.buffer;\r\n} */\r\n\r\nexport function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\r\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\r\n\r\n const tmp = new Uint8Array(length);\r\n \r\n let lastLength = 0;\r\n args.forEach(b => {\r\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\r\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\r\n });\r\n\r\n return tmp/* .buffer */;\r\n}\r\n\r\nexport function bytesFromWordss(input: Uint32Array) {\r\n const o = new Uint8Array(input.byteLength);\r\n for(let i = 0, length = input.length * 4; i < length; ++i) {\r\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\r\n }\r\n\r\n return o;\r\n}\r\n\r\nexport function bytesToWordss(input: Parameters[0]) {\r\n const bytes = convertToUint8Array(input);\r\n\r\n const words: number[] = [];\r\n for(let i = 0, len = bytes.length; i < len; ++i) {\r\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\r\n }\r\n\r\n return new Uint32Array(words);\r\n}\r\n\r\n// * https://stackoverflow.com/a/52827031\r\n/* export const isBigEndian = (() => {\r\n const array = new Uint8Array(4);\r\n const view = new Uint32Array(array.buffer);\r\n return !((view[0] = 1) & array[0]);\r\n})(); */\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { bytesToHex, bytesFromHex, bufferConcats } from '../helpers/bytes';\n\nObject.defineProperty(Uint8Array.prototype, 'hex', {\n get: function(): string {\n return bytesToHex(this);\n },\n \n set: function(str: string) {\n this.set(bytesFromHex(str));\n },\n enumerable: true,\n configurable: true\n});\n\nUint8Array.prototype.randomize = function() {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(this);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n \n return this;\n};\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n //return {type: 'bytes', value: [...this]};\n};\n\nArray.prototype.findAndSplice = function(verify: (value: T, index?: number, array?: Array) => boolean) {\n let index = this.findIndex(verify);\n return index !== -1 ? this.splice(index, 1)[0] : undefined;\n};\n\nString.prototype.toHHMMSS = function(leadZero = false) {\n const sec_num = parseInt(this + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n \n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? \"0\" + minutes : minutes;\n if(seconds < 10) seconds = \"0\" + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n};\n\n/* Promise.prototype.finally = Promise.prototype.finally || {\n finally(fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n }\n}.finally; */\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\nPromise.prototype.safeFinally = function(this: Promise, fn: () => any) {\n return this.catch(() => {}).finally(fn);\n};\n\ndeclare global {\n interface Uint8Array {\n hex: string;\n randomize: () => Uint8Array,\n concat: (...args: Array) => Uint8Array,\n //toString: () => string,\n toJSON: () => number[],\n //toJSON: () => {type: 'bytes', value: number[]},\n }\n \n interface Array {\n findAndSplice(verify: (value: T, index?: number, array?: Array) => boolean): T;\n }\n \n interface String {\n toHHMMSS(leadZero?: boolean): string;\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n safeFinally: (onfinally?: () => void) => Promise;\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { TransportType } from \"../lib/mtproto/dcConfigurator\";\r\n\r\nconst Modes = {\r\n test: location.search.indexOf('test=1') > 0/* || true */,\r\n debug: location.search.indexOf('debug=1') > 0,\r\n http: false,\r\n ssl: true, // location.search.indexOf('ssl=1') > 0 || location.protocol === 'https:' && location.search.indexOf('ssl=0') === -1,\r\n multipleConnections: true,\r\n asServiceWorker: false,\r\n transport: 'websocket' as TransportType\r\n};\r\n\r\n \r\nModes.http = location.search.indexOf('http=1') > 0;\r\n \r\n\r\n \r\n \r\n \r\n\r\nif(Modes.http) {\r\n Modes.transport = 'https';\r\n}\r\n\r\n \r\n \r\n \r\n\r\nexport default Modes;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from \"./modes\";\r\n\r\nexport const DEBUG = process.env.NODE_ENV !== 'production' || Modes.debug;\r\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\r\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\r\nexport default DEBUG;\r\n\r\n//let m = DEBUG;\r\n/* if(!DEBUG) {\r\n ctx.sandpitTurtle = () => {\r\n //if(!m) {\r\n for(let i in MOUNT_CLASS_TO) {\r\n ctx[i] = MOUNT_CLASS_TO[i];\r\n }\r\n //m = true;\r\n //}\r\n \r\n //DEBUG = !DEBUG;\r\n };\r\n} */\r\n\r\n/* export const superDebug = (object: any, key: string) => {\r\n var d = object[key];\r\n var beforeStr = '', afterStr = '';\r\n for(var r of d) {\r\n beforeStr += r.before.hex + '\\n';\r\n afterStr += r.after.hex + '\\n';\r\n }\r\n\r\n beforeStr = beforeStr.trim();\r\n afterStr = afterStr.trim();\r\n //var beforeStr = d.map(r => r.before.hex).join('\\n');\r\n //var afterStr = d.map(r => r.after.hex).join('\\n');\r\n\r\n var dada = (name: string, str: string) => {\r\n var a = document.createElement('a');\r\n a.target = '_blank';\r\n a.download = name + '.txt';\r\n a.href = URL.createObjectURL(new Blob([str], {\r\n type: 'text/plain'\r\n }));\r\n document.body.append(a);\r\n a.click();\r\n };\r\n\r\n dada(key + '_' + 'before', beforeStr);\r\n dada(key + '_' + 'after', afterStr);\r\n}\r\n\r\nMOUNT_CLASS_TO.superDebug = superDebug; */\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// в SW может быть сразу две переменных TRUE\r\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\r\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\r\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\r\n\r\nexport const getWindowClients = () => {\r\n return (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' });\r\n};\r\n\r\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\r\n (self as any as ServiceWorkerGlobalScope)\r\n .clients\r\n .matchAll({ includeUncontrolled: false, type: 'window' })\r\n .then((listeners) => {\r\n if(!listeners.length) {\r\n //console.trace('no listeners?', self, listeners);\r\n return;\r\n }\r\n\r\n listeners.slice(all ? 0 : -1).forEach(listener => {\r\n // @ts-ignore\r\n listener.postMessage(...args);\r\n });\r\n });\r\n};\r\n\r\nconst notifyWorker = (...args: any[]) => {\r\n // @ts-ignore\r\n (self as any as DedicatedWorkerGlobalScope).postMessage(...args);\r\n};\r\n\r\nconst noop = () => {};\r\n\r\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\r\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { notifySomeone, IS_WORKER } from '../helpers/context';\r\nimport { WorkerTaskTemplate } from '../types';\r\n//import { stringify } from '../helpers/json';\r\n\r\nclass LocalStorage> {\r\n private prefix = '';\r\n private cache: Partial = {};\r\n private useStorage = true;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\r\n if(Modes.test) {\r\n this.prefix = 't_';\r\n }\r\n }\r\n\r\n public get(key: T, useCache = true): Storage[T] {\r\n if(this.cache.hasOwnProperty(key) && useCache) {\r\n return this.cache[key];\r\n } else if(this.useStorage) {\r\n let value: Storage[T];\r\n try {\r\n value = localStorage.getItem(this.prefix + key as string) as any;\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n\r\n if(value !== null) {\r\n try {\r\n value = JSON.parse(value);\r\n } catch(err) {\r\n //console.error(err);\r\n }\r\n } else {\r\n value = undefined;\r\n }\r\n\r\n return value;\r\n }/* else {\r\n throw 'something went wrong';\r\n } */\r\n }\r\n\r\n public set(obj: Partial, onlyLocal = false) {\r\n for(const key in obj) {\r\n if(obj.hasOwnProperty(key)) {\r\n const value = obj[key];\r\n this.cache[key] = value;\r\n\r\n if(this.useStorage && !onlyLocal) {\r\n try {\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(this.prefix + key, stringified);\r\n } catch(err) {\r\n this.useStorage = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal = false) {\r\n // ! it is needed here\r\n key = '' + key;\r\n\r\n if(!saveLocal) {\r\n delete this.cache[key];\r\n }\r\n \r\n //if(this.useStorage) {\r\n try {\r\n localStorage.removeItem(this.prefix + key);\r\n } catch(err) {\r\n \r\n }\r\n //}\r\n }\r\n\r\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\r\n // if(this.useStorage) {\r\n try {\r\n let obj: Partial = {};\r\n if(preserveKeys) {\r\n preserveKeys.forEach(key => {\r\n const value = this.get(key);\r\n if(value !== undefined) {\r\n obj[key] = value;\r\n }\r\n });\r\n }\r\n \r\n localStorage.clear();\r\n\r\n if(preserveKeys) {\r\n this.set(obj);\r\n }\r\n } catch(err) {\r\n\r\n }\r\n // }\r\n } */\r\n\r\n public clear() {\r\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id'];\r\n for(let i = 1; i <= 5; ++i) {\r\n keys.push(`dc${i}_server_salt`);\r\n keys.push(`dc${i}_auth_key`);\r\n }\r\n\r\n for(let key of keys) {\r\n this.delete(key, true);\r\n }\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n this.useStorage = enabled;\r\n\r\n if(!enabled) {\r\n this.clear();\r\n } else {\r\n return this.set(this.cache);\r\n }\r\n }\r\n}\r\n\r\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: {\r\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\r\n args: any[]\r\n }\r\n};\r\n\r\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\r\n type: 'localStorageProxy',\r\n payload: any\r\n};\r\n\r\nexport default class LocalStorageController> {\r\n private static STORAGES: LocalStorageController[] = [];\r\n private taskId = 0;\r\n private tasks: {[taskID: number]: (result: any) => void} = {};\r\n //private log = (...args: any[]) => console.log('[SW LS]', ...args);\r\n //private log = (...args: any[]) => {};\r\n\r\n private storage: LocalStorage;\r\n\r\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\r\n LocalStorageController.STORAGES.push(this);\r\n\r\n if(!IS_WORKER) {\r\n this.storage = new LocalStorage(/* preserveKeys */);\r\n }\r\n }\r\n\r\n public finishTask(taskId: number, result: any) {\r\n //this.log('finishTask:', taskID, result, Object.keys(this.tasks));\r\n\r\n if(!this.tasks.hasOwnProperty(taskId)) {\r\n //this.log('no such task:', taskID, result);\r\n return;\r\n }\r\n\r\n this.tasks[taskId](result);\r\n delete this.tasks[taskId];\r\n }\r\n\r\n private proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']) {\r\n return new Promise((resolve, reject) => {\r\n if(IS_WORKER) {\r\n const taskId = this.taskId++;\r\n\r\n this.tasks[taskId] = resolve;\r\n const task: LocalStorageProxyTask = {\r\n type: 'localStorageProxy', \r\n id: taskId,\r\n payload: {\r\n type,\r\n args\r\n }\r\n };\r\n\r\n notifySomeone(task);\r\n } else {\r\n args = Array.prototype.slice.call(args);\r\n\r\n // @ts-ignore\r\n const result: any = this.storage[type].apply(this.storage, args as any);\r\n resolve(result);\r\n }\r\n });\r\n }\r\n\r\n public get(key: T, useCache?: boolean) {\r\n return this.proxy('get', key, useCache);\r\n }\r\n\r\n public set(obj: Partial, onlyLocal?: boolean) {\r\n return this.proxy('set', obj, onlyLocal);\r\n }\r\n\r\n public delete(key: keyof Storage, saveLocal?: boolean) {\r\n return this.proxy('delete', key, saveLocal);\r\n }\r\n\r\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\r\n return this.proxy('clear'/* , preserveKeys */);\r\n }\r\n\r\n public toggleStorage(enabled: boolean) {\r\n return this.proxy('toggleStorage', enabled);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { AppInstance } from './mtproto/singleInstance';\r\nimport type { UserAuth } from './mtproto/mtproto_config';\r\nimport type { DcId } from '../types';\r\nimport { MOUNT_CLASS_TO } from '../config/debug';\r\nimport LocalStorageController from './localStorage';\r\n\r\nconst sessionStorage = new LocalStorageController<{\r\n dc: DcId,\r\n user_auth: UserAuth,\r\n state_id: number,\r\n dc1_auth_key: string,\r\n dc2_auth_key: string,\r\n dc3_auth_key: string,\r\n dc4_auth_key: string,\r\n dc5_auth_key: string,\r\n dc1_server_salt: string,\r\n dc2_server_salt: string,\r\n dc3_server_salt: string,\r\n dc4_server_salt: string,\r\n dc5_server_salt: string,\r\n server_time_offset: number,\r\n xt_instance: AppInstance,\r\n kz_version: 'K' | 'Z',\r\n tgme_sync: {\r\n canRedirect: boolean,\r\n ts: number\r\n }\r\n}>(/* ['kz_version'] */);\r\nMOUNT_CLASS_TO.appStorage = sessionStorage;\r\nexport default sessionStorage;\r\n","'use strict'\n//@flow\n\n/** * * * * * * * * * *\n * Big Integer Library *\n * Created 2000 *\n * Leemon Baird *\n * www.leemon.com *\n * * * * * * * * * * * */\n\n////////////////////////////////////////////////////////////////////////////////////////\n// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.\n// For most functions, if it needs a BigInt as a local variable it will actually use\n// a global, and will only allocate to it only when it's not the right size. This ensures\n// that when a function is called repeatedly with same-sized parameters, it only allocates\n// memory on the first call.\n//\n// Note that for cryptographic purposes, the calls to Math.random() must\n// be replaced with calls to a better pseudorandom number generator.\n//\n// In the following, \"bigInt\" means a bigInt with at least one leading zero element,\n// and \"integer\" means a nonnegative integer less than radix. In some cases, integer\n// can be negative. Negative bigInts are 2s complement.\n//\n// The following functions do not modify their inputs.\n// Those returning a bigInt, string, or Array will dynamically allocate memory for that value.\n// Those returning a boolean will return the integer 0 (false) or 1 (true).\n// Those returning boolean or int will not allocate memory except possibly on the first\n// time they're called with a given parameter size.\n//\n// bigInt add(x,y) //return (x+y) for bigInts x and y.\n// bigInt addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.\n// string bigInt2str(x,base) //return a string form of bigInt x in a given base, with 2 <= base <= 95\n// int bitSize(x) //return how many bits long the bigInt x is, not counting leading zeros\n// bigInt dup(x) //return a copy of bigInt x\n// boolean equals(x,y) //is the bigInt x equal to the bigint y?\n// boolean equalsInt(x,y) //is bigint x equal to integer y?\n// bigInt expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed\n// Array findPrimes(n) //return array of all primes less than integer n\n// bigInt GCD(x,y) //return greatest common divisor of bigInts x and y (each with same number of elements).\n// boolean greater(x,y) //is x>y? (x and y are nonnegative bigInts)\n// boolean greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?\n// bigInt int2bigInt(t,n,m) //return a bigInt equal to integer t, with at least n bits and m array elements\n// bigInt inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null\n// int inverseModInt(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse\n// boolean isZero(x) //is the bigInt x equal to zero?\n// boolean millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime? (b is bigInt, 1=1). If s=1, then the most significant of those n bits is set to 1.\n// bigInt randTruePrime(k) //return a new, random, k-bit, true prime bigInt using Maurer's algorithm.\n// bigInt randProbPrime(k) //return a new, random, k-bit, probable prime bigInt (probability it's composite less than 2^-80).\n// bigInt str2bigInt(s,b,n,m) //return a bigInt for number represented in string s in base b with at least n bits and m array elements\n// bigInt sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement\n// bigInt trim(x,k) //return a copy of x with exactly k leading zero elements\n//\n//\n// The following functions each have a non-underscored version, which most users should call instead.\n// These functions each write to a single parameter, and the caller is responsible for ensuring the array\n// passed in is large enough to hold the result.\n//\n// void addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer\n// void add_(x,y) //do x=x+y for bigInts x and y\n// void copy_(x,y) //do x=y on bigInts x and y\n// void copyInt_(x,n) //do x=n on bigInt x and integer n\n// void GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed). (This never overflows its array).\n// boolean inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist\n// void mod_(x,n) //do x=x mod n for bigInts x and n. (This never overflows its array).\n// void mult_(x,y) //do x=x*y for bigInts x and y.\n// void multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.\n// void powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.\n// void randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.\n// void randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.\n// void sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.\n//\n// The following functions do NOT have a non-underscored version.\n// They each write a bigInt result to one or more parameters. The caller is responsible for\n// ensuring the arrays passed in are large enough to hold the results.\n//\n// void addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))\n// void carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.\n// void divide_(x,y,q,r) //divide x by y giving quotient q and remainder r\n// int divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder. (This never overflows its array).\n// void eGCD_(x,y,d,a,b) //sets a,b,d to positive bigInts such that d = GCD_(x,y) = a*x-b*y\n// void halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement. (This never overflows its array).\n// void leftShift_(x,n) //left shift bigInt x by n bits. n64 multiplier, but not with JavaScript's 32*32->32)\n// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square\n// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that\n// method would be slower. This is unfortunate because the code currently spends almost all of its time\n// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring\n// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded\n// sentences that seem to imply it's faster to do a non-modular square followed by a single\n// Montgomery reduction, but that's obviously wrong.\n////////////////////////////////////////////////////////////////////////////////////////\n\nexport type Bool = 1 | 0\n\n//globals\nexport var bpe = 0 //bits stored per array element\nvar mask = 0 //AND this with an array element to chop it down to bpe bits\nvar radix = mask + 1 //equals 2^bpe. A single 1 bit to the left of the last bit of mask.\n\n//the digits for converting to different bases\nvar digitsStr =\n '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\\\\'\"+-'\n\n//initialize the global variables\n\n//bpe=number of bits in the mantissa on this platform\nfor (bpe = 0; 1 << (bpe + 1) > 1 << bpe; bpe++);\nbpe >>= 1 //bpe=number of bits in one element of the array representing the bigInt\nmask = (1 << bpe) - 1 //AND the mask with an integer to get its bpe least significant bits\nradix = mask + 1 //2^bpe. a single 1 bit to the left of the first bit of mask\nexport var one = int2bigInt(1, 1, 1) //constant used in powMod_()\nexport var zero = int2bigInt(0, 1, 1)\n\n//the following global variables are scratchpad memory to\n//reduce dynamic memory allocation in the inner loop\nvar t: number[] | number = new Array(0)\nvar ss = t //used in mult_()\nvar s0 = t //used in multMod_(), squareMod_()\n// var s1=t; //used in powMod_(), multMod_(), squareMod_()\n// var s2=t; //used in powMod_(), multMod_()\nvar s3 = t //used in powMod_()\nvar s4 = t,\n s5 = t //used in mod_()\nvar s6 = t //used in bigInt2str()\nvar s7 = t //used in powMod_()\nvar T = t //used in GCD_()\nvar sa = t //used in mont_()\nvar mr_x1 = t,\n mr_r = t,\n mr_a = t, //used in millerRabin()\n eg_v = t,\n eg_u = t,\n eg_A = t,\n eg_B = t,\n eg_C = t,\n eg_D = t, //used in eGCD_(), inverseMod_()\n //, md_q1=t, md_q2=t, md_q3=t, md_r=t, md_r1=t, md_r2=t, md_tt=t, //used in mod_()\n\n primes = t,\n pows = t,\n s_i = t,\n s_i2 = t,\n s_R = t,\n s_rm = t,\n s_q = t,\n s_n1 = t,\n s_a = t,\n s_r2 = t,\n s_n = t,\n s_b = t,\n s_d = t,\n s_x1 = t,\n s_x2 = t,\n s_aa = t, //used in randTruePrime_()\n rpprb = t //used in randProbPrimeRounds() (which also uses \"primes\")\n\n////////////////////////////////////////////////////////////////////////////////////////\n\nvar k, buff\n\n/**\n * return array of all primes less than integer n\n *\n * @param {number} n\n * @returns {number[]}\n */\nexport function findPrimes(n: number): number[] {\n var i, s, p, ans\n s = new Array(n)\n for (i = 0; i < n; i++) s[i] = 0\n s[0] = 2\n p = 0 //first p elements of s are primes, the rest are a sieve\n for (; s[p] < n; ) {\n //s[p] is the pth prime\n for (\n i = s[p] * s[p];\n i < n;\n i += s[p] //mark multiples of s[p]\n )\n s[i] = 1\n p++\n s[p] = s[p - 1] + 1\n for (; s[p] < n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)\n }\n ans = new Array(p)\n for (i = 0; i < p; i++) ans[i] = s[i]\n return ans\n}\n\n/**\n * does a single round of Miller-Rabin base b consider x to be a possible prime?\n *\n * x is a bigInt, and b is an integer, with b 0; j--);\n for (z = 0, w = x[j]; w; w >>= 1, z++);\n z += bpe * j\n return z\n}\n\n/**\n * return a copy of x with at least n elements, adding leading zeros if needed\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\nexport function expand(x: number[], n: number): number[] {\n var ans = int2bigInt(0, (x.length > n ? x.length : n) * bpe, 0)\n copy_(ans, x)\n return ans\n}\n\n/**\n * return a k-bit true random prime using Maurer's algorithm.\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randTruePrime(k: number): number[] {\n var ans = int2bigInt(0, k, 0)\n randTruePrime_(ans, k)\n return trim(ans, 1)\n} */\n\n/**\n * return a k-bit random probable prime with probability of error < 2^-80\n *\n * @export\n * @param {number} k\n * @returns {number[]}\n */\n/* export function randProbPrime(k: number): number[] {\n if (k >= 600) return randProbPrimeRounds(k, 2) //numbers from HAC table 4.3\n if (k >= 550) return randProbPrimeRounds(k, 4)\n if (k >= 500) return randProbPrimeRounds(k, 5)\n if (k >= 400) return randProbPrimeRounds(k, 6)\n if (k >= 350) return randProbPrimeRounds(k, 7)\n if (k >= 300) return randProbPrimeRounds(k, 9)\n if (k >= 250) return randProbPrimeRounds(k, 12) //numbers from HAC table 4.4\n if (k >= 200) return randProbPrimeRounds(k, 15)\n if (k >= 150) return randProbPrimeRounds(k, 18)\n if (k >= 100) return randProbPrimeRounds(k, 27)\n return randProbPrimeRounds(k, 40) //number from HAC remark 4.26 (only an estimate)\n} */\n\n/**\n * return a k-bit probable random prime using n rounds of Miller Rabin\n * (after trial division with small primes)\n *\n * @export\n * @param {number} k\n * @param {number} n\n * @returns {number[]}\n */\n/* export function randProbPrimeRounds(k: number, n: number): number[] {\n var ans, i, divisible, B\n B = 30000 //B is largest prime to use in trial division\n ans = int2bigInt(0, k, 0)\n\n //optimization: try larger and smaller B to find the best limit.\n\n if (primes.length === 0) primes = findPrimes(30000) //check for divisibility by primes <=30000\n\n if (rpprb.length !== ans.length) rpprb = dup(ans)\n\n for (;;) {\n //keep trying random values for ans until one appears to be prime\n //optimization: pick a random number times L=2*3*5*...*p, plus a\n // random element of the list of all numbers in [0,L) not divisible by any prime up to p.\n // This can reduce the amount of random number generation.\n\n randBigInt_(ans, k, 0) //ans = a random odd number to check\n ans[0] |= 1\n divisible = 0\n\n //check ans for divisibility by small primes up to B\n for (i = 0; i < primes.length && primes[i] <= B; i++)\n if (modInt(ans, primes[i]) === 0 && !equalsInt(ans, primes[i])) {\n divisible = 1\n break\n }\n\n //optimization: change millerRabin so the base can be bigger than the number being checked, then eliminate the while here.\n\n //do n rounds of Miller Rabin, with random bases less than ans\n for (i = 0; i < n && !divisible; i++) {\n randBigInt_(rpprb, k, 0)\n while (\n !greater(ans, rpprb) //pick a random rpprb that's < ans\n )\n randBigInt_(rpprb, k, 0)\n if (!millerRabin(ans, rpprb)) divisible = 1\n }\n\n if (!divisible) return ans\n }\n} */\n\n/**\n * return a new bigInt equal to (x mod n) for bigInts x and n.\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {number[]}\n */\nexport function mod(x: number[], n: number[]): number[] {\n var ans = dup(x)\n mod_(ans, n)\n return trim(ans, 1)\n}\n\n/**\n * return (x+n) where x is a bigInt and n is an integer.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number[]}\n */\n/* export function addInt(x: number[], n: number): number[] {\n var ans = expand(x, x.length + 1)\n addInt_(ans, n)\n return trim(ans, 1)\n} */\n\n/**\n * return x*y for bigInts x and y. This is faster when y y.length ? x.length + 1 : y.length + 1)\n sub_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x+y) for bigInts x and y\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function add(x: number[], y: number[]): number[] {\n var ans = expand(x, x.length > y.length ? x.length + 1 : y.length + 1)\n add_(ans, y)\n return trim(ans, 1)\n}\n\n/**\n * return (x**(-1) mod n) for bigInts x and n.\n *\n * If no inverse exists, it returns null\n *\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(number[] | null)}\n */\n/* export function inverseMod(x: number[], n: number[]): number[] | null {\n var ans = expand(x, n.length)\n var s = inverseMod_(ans, n)\n return s ? trim(ans, 1) : null\n} */\n\n/**\n * return (x*y mod n) for bigInts x,y,n.\n *\n * For greater speed, let y= 2\n\n if (s_i2.length != ans.length) {\n s_i2 = dup(ans)\n s_R = dup(ans)\n s_n1 = dup(ans)\n s_r2 = dup(ans)\n s_d = dup(ans)\n s_x1 = dup(ans) //TODO Seems like a bug in eslint, reports as unused\n s_x2 = dup(ans)\n s_b = dup(ans)\n s_n = dup(ans)\n s_i = dup(ans)\n s_rm = dup(ans)\n s_q = dup(ans)\n s_a = dup(ans)\n s_aa = dup(ans)\n }\n\n if (k <= recLimit) {\n //generate small random primes by trial division up to its square root\n pm = (1 << ((k + 2) >> 1)) - 1 //pm is binary number with all ones, just over sqrt(2^k)\n copyInt_(ans, 0)\n for (dd = 1; dd; ) {\n dd = 0\n ans[0] = 1 | (1 << (k - 1)) | Math.floor(Math.random() * (1 << k)) //random, k-bit, odd integer, with msb 1\n for (j = 1; j < primes.length && (primes[j] & pm) == primes[j]; j++) {\n //trial division by all primes 3...sqrt(2^k)\n if (0 == ans[0] % primes[j]) {\n dd = 1\n break\n }\n }\n }\n carry_(ans)\n return\n }\n\n B = c * k * k //try small primes up to B (or all the primes[] array if the largest is less than B).\n if (k > 2 * m)\n //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits\n for (r = 1; k - k * r <= m; ) r = pows[Math.floor(Math.random() * 512)] //r=Math.pow(2,Math.random()-1);\n else r = 0.5\n\n //simulation suggests the more complex algorithm using r=.333 is only slightly faster.\n\n recSize = Math.floor(r * k) + 1\n\n randTruePrime_(s_q, recSize)\n copyInt_(s_i2, 0)\n s_i2[Math.floor((k - 2) / bpe)] |= 1 << ((k - 2) % bpe) //s_i2=2^(k-2)\n divide_(s_i2, s_q, s_i, s_rm) //s_i=floor((2^(k-1))/(2q))\n\n z = bitSize(s_i)\n\n for (;;) {\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_i-1]\n randBigInt_(s_R, z, 0)\n if (greater(s_i, s_R)) break\n } //now s_R is in the range [0,s_i-1]\n addInt_(s_R, 1) //now s_R is in the range [1,s_i]\n add_(s_R, s_i) //now s_R is in the range [s_i+1,2*s_i]\n\n copy_(s_n, s_q)\n mult_(s_n, s_R)\n multInt_(s_n, 2)\n addInt_(s_n, 1) //s_n=2*s_R*s_q+1\n\n copy_(s_r2, s_R)\n multInt_(s_r2, 2) //s_r2=2*s_R\n\n //check s_n for divisibility by small primes up to B\n for (divisible = 0, j = 0; j < primes.length && primes[j] < B; j++)\n if (modInt(s_n, primes[j]) == 0 && !equalsInt(s_n, primes[j])) {\n divisible = 1\n break\n }\n\n if (!divisible)\n if (!millerRabinInt(s_n, 2))\n //if it passes small primes check, then try a single Miller-Rabin base 2\n //this line represents 75% of the total runtime for randTruePrime_\n divisible = 1\n\n if (!divisible) {\n //if it passes that test, continue checking s_n\n addInt_(s_n, -3)\n for (j = s_n.length - 1; s_n[j] == 0 && j > 0; j--); //strip leading zeros\n for (zz = 0, w = s_n[j]; w; w >>= 1, zz++);\n zz += bpe * j //zz=number of bits in s_n, ignoring leading zeros\n for (;;) {\n //generate z-bit numbers until one falls in the range [0,s_n-1]\n randBigInt_(s_a, zz, 0)\n if (greater(s_n, s_a)) break\n } //now s_a is in the range [0,s_n-1]\n addInt_(s_n, 3) //now s_a is in the range [0,s_n-4]\n addInt_(s_a, 2) //now s_a is in the range [2,s_n-2]\n copy_(s_b, s_a)\n copy_(s_n1, s_n)\n addInt_(s_n1, -1)\n powMod_(s_b, s_n1, s_n) //s_b=s_a^(s_n-1) modulo s_n\n addInt_(s_b, -1)\n if (isZero(s_b)) {\n copy_(s_b, s_a)\n powMod_(s_b, s_r2, s_n)\n addInt_(s_b, -1)\n copy_(s_aa, s_n)\n copy_(s_d, s_b)\n GCD_(s_d, s_n) //if s_b and s_n are relatively prime, then s_n is a prime\n if (equalsInt(s_d, 1)) {\n copy_(ans, s_aa)\n return //if we've made it this far, then s_n is absolutely guaranteed to be prime\n }\n }\n }\n }\n} */\n\n/**\n * Return an n-bit random BigInt (n>=1). If s=1, then the most significant of those n bits is set to 1.\n *\n * @export\n * @param {number} n\n * @param {number} s\n * @returns {number[]}\n */\n/* export function randBigInt(n: number, s: number): number[] {\n var a, b\n a = Math.floor((n - 1) / bpe) + 2 //# array elements to hold the BigInt with a leading 0 element\n b = int2bigInt(0, 0, a)\n randBigInt_(b, n, s)\n return b\n} */\n\n/**\n * Set b to an n-bit random BigInt. If s=1, then the most significant of those n bits is set to 1.\n *\n * Array b must be big enough to hold the result. Must have n>=1\n *\n * @export\n * @param {number[]} b\n * @param {number} n\n * @param {number} s\n * @return {void}\n */\n/* export function randBigInt_(b: number[], n: number, s: number): void {\n var i, a\n for (i = 0; i < b.length; i++) b[i] = 0\n a = Math.floor((n - 1) / bpe) + 1 //# array elements to hold the BigInt\n for (i = 0; i < a; i++) {\n b[i] = Math.floor(Math.random() * (1 << (bpe - 1)))\n }\n b[a - 1] &= (2 << ((n - 1) % bpe)) - 1\n if (s == 1) b[a - 1] |= 1 << ((n - 1) % bpe)\n} */\n\n/**\n * Return the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {number[]}\n */\nexport function GCD(x: number[], y: number[]): number[] {\n var xc, yc\n xc = dup(x)\n yc = dup(y)\n GCD_(xc, yc)\n return xc\n}\n\n/**\n * set x to the greatest common divisor of bigInts x and y (each with same number of elements).\n *\n * y is destroyed.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n */\nexport function GCD_(x: number[], y: number[]): void {\n var i: number, xp: number, yp: number, A: number, B, C: number, D: number, q, sing\n var qp\n if (T.length !== x.length) T = dup(x)\n\n sing = 1\n while (sing) {\n //while y has nonzero elements other than y[0]\n sing = 0\n for (\n i = 1;\n i < y.length;\n i++ //check if y has nonzero elements other than 0\n )\n if (y[i]) {\n sing = 1\n break\n }\n if (!sing) break //quit when y all zero elements except possibly y[0]\n\n for (i = x.length; !x[i] && i >= 0; i--); //find most significant element of x\n xp = x[i]\n yp = y[i]\n A = 1\n B = 0\n C = 0\n D = 1\n while (yp + C && yp + D) {\n q = Math.floor((xp + A) / (yp + C))\n qp = Math.floor((xp + B) / (yp + D))\n if (q != qp) break\n t = A - q * C\n A = C\n C = t // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)\n t = B - q * D\n B = D\n D = t\n t = xp - q * yp\n xp = yp\n yp = t\n }\n if (B) {\n copy_(T, x)\n linComb_(x, y, A, B) //x=A*x+B*y\n linComb_(y, T, D, C) //y=D*y+C*T\n } else {\n mod_(x, y)\n copy_(T, x)\n copy_(x, y)\n copy_(y, T)\n }\n }\n if (y[0] === 0) return\n t = modInt(x, y[0])\n copyInt_(x, y[0])\n y[0] = t\n while (y[0]) {\n x[0] %= y[0]\n t = x[0]\n x[0] = y[0]\n y[0] = t\n }\n}\n\n/**\n * do x=x**(-1) mod n, for bigInts x and n.\n *\n * If no inverse exists, it sets x to zero and returns 0, else it returns 1.\n * The x array must be at least as large as the n array.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} n\n * @returns {(0 | 1)}\n */\n/* export function inverseMod_(x: number[], n: number[]): Bool {\n var k = 1 + 2 * Math.max(x.length, n.length)\n\n if (!(x[0] & 1) && !(n[0] & 1)) {\n //if both inputs are even, then inverse doesn't exist\n copyInt_(x, 0)\n return 0\n }\n\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_v = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n\n copy_(eg_u, x)\n copy_(eg_v, n)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while eg_u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if eg_A==eg_B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, n)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(eg_v[0] & 1)) {\n //while eg_v is even\n halve_(eg_v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if eg_C==eg_D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, n)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(eg_v, eg_u)) {\n //eg_v <= eg_u\n sub_(eg_u, eg_v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //eg_v > eg_u\n sub_(eg_v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n\n if (equalsInt(eg_u, 0)) {\n while (\n negative(eg_C) //make sure answer is nonnegative\n )\n add_(eg_C, n)\n copy_(x, eg_C)\n\n if (!equalsInt(eg_v, 1)) {\n //if GCD_(x,n)!=1, then there is no inverse\n copyInt_(x, 0)\n return 0\n }\n return 1\n }\n }\n} */\n\n/**\n * return x**(-1) mod n, for integers x and n.\n *\n * Return 0 if there is no inverse\n *\n * @param {number} x\n * @param {number} n\n * @returns {number}\n */\nexport function inverseModInt(x: number, n: number): number {\n var a = 1,\n b = 0,\n t\n for (;;) {\n if (x === 1) return a\n if (x === 0) return 0\n b -= a * Math.floor(n / x)\n //$off\n n %= x\n\n if (n === 1) return b //to avoid negatives, change this b to n-b, and each -= to +=\n if (n === 0) return 0\n a -= b * Math.floor(x / n)\n //$off\n x %= n\n }\n /*::\n declare var never: empty\n return never\n */\n}\n\n//this deprecated function is for backward compatibility only.\n/* function inverseModInt_(x: number, n: number) {\n return inverseModInt(x, n)\n} */\n\n/**\n * Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:\n *\n * v = GCD_(x,y) = a*x-b*y\n *\n * The bigInts v, a, b, must have exactly as many elements as the larger of x and y.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} v\n * @param {number[]} a\n * @param {number[]} b\n * @return {void}\n */\nexport function eGCD_(\n x: number[],\n y: number[],\n v: number[],\n a: number[],\n b: number[],\n): void {\n var g = 0\n var k = Math.max(x.length, y.length)\n if (eg_u.length != k) {\n eg_u = new Array(k)\n eg_A = new Array(k)\n eg_B = new Array(k)\n eg_C = new Array(k)\n eg_D = new Array(k)\n }\n while (!(x[0] & 1) && !(y[0] & 1)) {\n //while x and y both even\n halve_(x)\n halve_(y)\n g++\n }\n copy_(eg_u, x)\n copy_(v, y)\n copyInt_(eg_A, 1)\n copyInt_(eg_B, 0)\n copyInt_(eg_C, 0)\n copyInt_(eg_D, 1)\n for (;;) {\n while (!(eg_u[0] & 1)) {\n //while u is even\n halve_(eg_u)\n if (!(eg_A[0] & 1) && !(eg_B[0] & 1)) {\n //if A==B==0 mod 2\n halve_(eg_A)\n halve_(eg_B)\n } else {\n add_(eg_A, y)\n halve_(eg_A)\n sub_(eg_B, x)\n halve_(eg_B)\n }\n }\n\n while (!(v[0] & 1)) {\n //while v is even\n halve_(v)\n if (!(eg_C[0] & 1) && !(eg_D[0] & 1)) {\n //if C==D==0 mod 2\n halve_(eg_C)\n halve_(eg_D)\n } else {\n add_(eg_C, y)\n halve_(eg_C)\n sub_(eg_D, x)\n halve_(eg_D)\n }\n }\n\n if (!greater(v, eg_u)) {\n //v<=u\n sub_(eg_u, v)\n sub_(eg_A, eg_C)\n sub_(eg_B, eg_D)\n } else {\n //v>u\n sub_(v, eg_u)\n sub_(eg_C, eg_A)\n sub_(eg_D, eg_B)\n }\n if (equalsInt(eg_u, 0)) {\n while (negative(eg_C)) {\n //make sure a (C) is nonnegative\n add_(eg_C, y)\n sub_(eg_D, x)\n }\n multInt_(eg_D, -1) ///make sure b (D) is nonnegative\n copy_(a, eg_C)\n copy_(b, eg_D)\n leftShift_(v, g)\n return\n }\n }\n}\n\n/**\n * is bigInt x negative?\n *\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function negative(x: number[]) {\n //TODO Flow Bool type inference\n return (x[x.length - 1] >> (bpe - 1)) & 1\n}\n\n/**\n * is (x << (shift*bpe)) > y?\n *\n * x and y are nonnegative bigInts\n * shift is a nonnegative integer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} shift\n * @returns {(1 | 0)}\n */\nexport function greaterShift(x: number[], y: number[], shift: number): Bool {\n var i,\n kx = x.length,\n ky = y.length\n k = kx + shift < ky ? kx + shift : ky\n for (i = ky - 1 - shift; i < kx && i >= 0; i++) if (x[i] > 0) return 1 //if there are nonzeros in x to the left of the first column of y, then x is bigger\n for (i = kx - 1 + shift; i < ky; i++) if (y[i] > 0) return 0 //if there are nonzeros in y to the left of the first column of x, then x is not bigger\n for (i = k - 1; i >= shift; i--)\n if (x[i - shift] > y[i]) return 1\n else if (x[i - shift] < y[i]) return 0\n return 0\n}\n\n/**\n * is x > y?\n *\n * x and y both nonnegative\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {(1 | 0)}\n */\nexport function greater(x: number[], y: number[]): Bool {\n var i\n var k = x.length < y.length ? x.length : y.length\n\n for (i = x.length; i < y.length; i++) if (y[i]) return 0 //y has more digits\n\n for (i = y.length; i < x.length; i++) if (x[i]) return 1 //x has more digits\n\n for (i = k - 1; i >= 0; i--)\n if (x[i] > y[i]) return 1\n else if (x[i] < y[i]) return 0\n return 0\n}\n\n/**\n * divide x by y giving quotient q and remainder r.\n *\n * q = floor(x/y)\n * r = x mod y\n *\n * All 4 are bigints.\n *\n * * x must have at least one leading zero element.\n * * y must be nonzero.\n * * q and r must be arrays that are exactly the same length as x. (Or q can have more).\n * * Must have x.length >= y.length >= 2.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} q\n * @param {number[]} r\n * @return {void}\n */\nexport function divide_(\n x: number[],\n y: number[],\n q: number[],\n r: number[],\n): void {\n var kx, ky\n var i, j, y1, y2, c, a, b\n copy_(r, x)\n for (ky = y.length; y[ky - 1] === 0; ky--); //ky is number of elements in y, not including leading zeros\n\n //normalize: ensure the most significant element of y has its highest bit set\n b = y[ky - 1]\n for (a = 0; b; a++) b >>= 1\n a = bpe - a //a is how many bits to shift so that the high order bit of y is leftmost in its array element\n leftShift_(y, a) //multiply both by 1< ky; kx--); //kx is number of elements in normalized x, not including leading zeros\n\n copyInt_(q, 0) // q=0\n while (!greaterShift(y, r, kx - ky)) {\n // while (leftShift_(y,kx-ky) <= r) {\n subShift_(r, y, kx - ky) // r=r-leftShift_(y,kx-ky)\n q[kx - ky]++ // q[kx-ky]++;\n } // }\n\n for (i = kx - 1; i >= ky; i--) {\n if (r[i] == y[ky - 1]) q[i - ky] = mask\n else q[i - ky] = Math.floor((r[i] * radix + r[i - 1]) / y[ky - 1])\n\n //The following for(;;) loop is equivalent to the commented while loop,\n //except that the uncommented version avoids overflow.\n //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0\n // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])\n // q[i-ky]--;\n for (;;) {\n y2 = (ky > 1 ? y[ky - 2] : 0) * q[i - ky]\n c = y2 >> bpe\n y2 = y2 & mask\n y1 = c + q[i - ky] * y[ky - 1]\n c = y1 >> bpe\n y1 = y1 & mask\n\n if (\n c == r[i]\n ? y1 == r[i - 1] ? y2 > (i > 1 ? r[i - 2] : 0) : y1 > r[i - 1]\n : c > r[i]\n )\n q[i - ky]--\n else break\n }\n\n linCombShift_(r, y, -q[i - ky], i - ky) //r=r-q[i-ky]*leftShift_(y,i-ky)\n if (negative(r)) {\n addShift_(r, y, i - ky) //r=r+leftShift_(y,i-ky)\n q[i - ky]--\n }\n }\n\n rightShift_(y, a) //undo the normalization step\n rightShift_(r, a) //undo the normalization step\n}\n\n/**\n * do carries and borrows so each element of the bigInt x fits in bpe bits.\n *\n * @param {number[]} x\n */\nexport function carry_(x: number[]): void {\n var i, k, c, b\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * return x mod n for bigInt x and integer n.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {number}\n */\nexport function modInt(x: number[], n: number): number {\n var i,\n c = 0\n for (i = x.length - 1; i >= 0; i--) c = (c * radix + x[i]) % n\n return c\n}\n\n/**\n * convert the integer t into a bigInt with at least the given number of bits.\n * the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)\n * Pad the array with leading zeros so that it has at least minSize elements.\n *\n * There will always be at least one leading 0 element.\n *\n * @export\n * @param {number} t\n * @param {number} bits\n * @param {number} minSize\n * @returns {number[]}\n */\nexport function int2bigInt(t: number, bits: number, minSize: number): number[] {\n var i, k\n k = Math.ceil(bits / bpe) + 1\n k = minSize > k ? minSize : k\n var buff = new Array(k)\n copyInt_(buff, t)\n return buff\n}\n\n/**\n * return the bigInt given a string representation in a given base.\n * Pad the array with leading zeros so that it has at least minSize elements.\n * If base=-1, then it reads in a space-separated list of array elements in decimal.\n *\n * The array will always have at least one leading zero, unless base=-1.\n *\n * @export\n * @param {string} s\n * @param {number} base\n * @param {number} [minSize]\n * @returns {number[]}\n */\nexport function str2bigInt(\n s: string,\n base: number,\n minSize?: number,\n): number[] {\n var d, i, x, y, kk\n var k = s.length\n if (base === -1) {\n //comma-separated list of array elements in decimal\n x = new Array(0)\n for (;;) {\n y = new Array(x.length + 1)\n for (i = 0; i < x.length; i++) y[i + 1] = x[i]\n y[0] = parseInt(s, 10) //TODO PERF Should we replace that with ~~ (not not)? https://jsperf.com/number-vs-parseint-vs-plus/7\n x = y\n d = s.indexOf(',', 0)\n if (d < 1) break\n //$off\n s = s.substring(d + 1)\n if (s.length == 0) break\n }\n //$off\n if (x.length < minSize) {\n //$off\n y = new Array(minSize)\n copy_(y, x)\n return y\n }\n return x\n }\n\n x = int2bigInt(0, base * k, 0)\n for (i = 0; i < k; i++) {\n d = digitsStr.indexOf(s.substring(i, i + 1), 0)\n if (base <= 36 && d >= 36)\n //convert lowercase to uppercase if base<=36\n d -= 26\n if (d >= base || d < 0) {\n //stop at first illegal character\n break\n }\n multInt_(x, base)\n addInt_(x, d)\n }\n\n for (k = x.length; k > 0 && !x[k - 1]; k--); //strip off leading zeros\n //$off\n k = minSize > k + 1 ? minSize : k + 1\n //$off\n y = new Array(k)\n //$off\n kk = k < x.length ? k : x.length\n //$off\n for (i = 0; i < kk; i++) y[i] = x[i]\n //$off\n for (; i < k; i++) y[i] = 0\n return y\n}\n\n//return the bigInt given a string representation in a given base.\n//Pad the array with leading zeros so that it has at least minSize elements.\n//If base=-1, then it reads in a space-separated list of array elements in decimal.\n//The array will always have at least one leading zero, unless base=-1.\n// function str2bigInt(s,b,minSize) {\n// var d, i, j, base, str, x, y, kk;\n// if (typeof b === 'string') {\n// base = b.length;\n// str = b;\n// } else {\n// base = b;\n// str = digitsStr;\n// }\n// var k=s.length;\n// if (base==-1) { //comma-separated list of array elements in decimal\n// x=new Array(0);\n// for (;;) {\n// y=new Array(x.length+1);\n// for (i=0;i=36) { //convert lowercase to uppercase if base<=36\n// d-=26;\n// }\n// if (d>=base || d<0) { //ignore illegal characters\n// continue;\n// }\n// multInt_(x,base);\n// addInt_(x,d);\n// }\n\n// for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros\n// k=minSize>k+1 ? minSize : k+1;\n// y=new Array(k);\n// kk=k y.length) {\n for (; i < x.length; i++) if (x[i]) return 0\n } else {\n for (; i < y.length; i++) if (y[i]) return 0\n }\n return 1\n}\n\n/**\n * is the bigInt x equal to zero?\n *\n * @export\n * @param {number[]} x\n * @returns {(1 | 0)}\n */\nexport function isZero(x: number[]): Bool {\n var i\n for (i = 0; i < x.length; i++) if (x[i]) return 0\n return 1\n}\n\n/**\n * Convert a bigInt into a string in a given base, from base 2 up to base 95.\n *\n * Base -1 prints the contents of the array representing the number.\n *\n * @export\n * @param {number[]} x\n * @param {number} base\n * @returns {string}\n */\nexport function bigInt2str(x: number[], base: number): string {\n var i,\n t,\n s = ''\n\n if (s6.length !== x.length) s6 = dup(x)\n else copy_(s6, x)\n\n if (base === -1) {\n //return the list of array contents\n for (i = x.length - 1; i > 0; i--) s += x[i] + ','\n s += x[0]\n } else {\n //return it in the given base\n while (!isZero(s6)) {\n t = divInt_(s6, base) //t=s6 % base; s6=floor(s6/base);\n s = digitsStr.substring(t, t + 1) + s\n }\n }\n if (s.length === 0) s = '0'\n return s\n}\n\n/**\n * Convert a bigInt into bytes\n * @param x bigInt\n * @param littleEndian byte order by default\n */\nexport function bigInt2bytes(x: number[], littleEndian = true) {\n if(s6.length !== x.length) s6 = dup(x);\n else copy_(s6, x);\n\n const out: number[] = [];\n\n //console.log('bigInt2bytes');\n while(!isZero(s6)) {\n t = divInt_(s6, 256); //t=s6 % base; s6=floor(s6/base);\n out.push(t);\n //console.log('bigInt2bytes', t);\n }\n\n if(littleEndian) {\n out.reverse();\n }\n\n //console.log('bigInt2bytes', out);\n\n return out;\n}\n\n/**\n * Compare two bigInts and return -1 if x is less, 0 if equals, 1 if greater\n * @param x bigInt\n * @param y bigInt\n */\nexport function cmp(x: number[], y: number[]) {\n return greater(x, y) ? 1 : (equals(x, y) ? 0 : -1);\n}\n\n/* Object.assign(self, {\n cmp,\n str2bigInt,\n int2bigInt,\n bigInt2str,\n one,\n divide_,\n divInt_,\n dup,\n negative\n}); */\n\n/**\n * Returns a duplicate of bigInt x\n *\n * @export\n * @param {number[]} x\n * @returns {number[]}\n */\nexport function dup(x: number[]): number[] {\n var i\n buff = Array(x.length)\n copy_(buff, x)\n return buff\n}\n\n/**\n * do x=y on bigInts x and y.\n *\n * x must be an array at least as big as y (not counting the leading zeros in y).\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @returns {void}\n */\nexport function copy_(x: number[], y: number[]): void {\n var i\n var k = x.length < y.length ? x.length : y.length\n for (i = 0; i < k; i++) x[i] = y[i]\n for (i = k; i < x.length; i++) x[i] = 0\n}\n\n/**\n * do x=y on bigInt x and integer y.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function copyInt_(x: number[], n: number): void {\n var i, c\n var len = x.length //TODO .length in for loop have perfomance costs. Bench this\n for (c = n, i = 0; i < len; i++) {\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function addInt_(x: number[], n: number): void {\n var i, k, c, b\n x[0] += n\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i]\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n if (!c) return //stop carrying as soon as the carry is zero\n }\n}\n\n/**\n * right shift bigInt x by n bits.\n *\n * 0 <= n < bpe.\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n */\nexport function rightShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = 0;\n i < x.length - k;\n i++ //right shift x by k elements\n )\n x[i] = x[i + k]\n for (; i < x.length; i++) x[i] = 0\n //$off\n n %= bpe\n }\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - n)) | (x[i] >> n))\n }\n x[i] >>= n\n}\n\n/**\n * do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement\n *\n * @param {number[]} x\n * @returns {void}\n */\nexport function halve_(x: number[]): void {\n var i\n for (i = 0; i < x.length - 1; i++) {\n x[i] = mask & ((x[i + 1] << (bpe - 1)) | (x[i] >> 1))\n }\n x[i] = (x[i] >> 1) | (x[i] & (radix >> 1)) //most significant bit stays the same\n}\n\n/**\n * left shift bigInt x by n bits\n *\n * @export\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function leftShift_(x: number[], n: number): void {\n var i\n var k = Math.floor(n / bpe)\n if (k) {\n for (\n i = x.length;\n i >= k;\n i-- //left shift x by k elements\n )\n x[i] = x[i - k]\n for (; i >= 0; i--) x[i] = 0\n //$off\n n %= bpe\n }\n if (!n) return\n for (i = x.length - 1; i > 0; i--) {\n x[i] = mask & ((x[i] << n) | (x[i - 1] >> (bpe - n)))\n }\n x[i] = mask & (x[i] << n)\n}\n\n/**\n * do x=x*n where x is a bigInt and n is an integer.\n *\n * x must be large enough to hold the result.\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {void}\n */\nexport function multInt_(x: number[], n: number): void {\n var i, k, c, b\n if (!n) return\n k = x.length\n c = 0\n for (i = 0; i < k; i++) {\n c += x[i] * n\n b = 0\n if (c < 0) {\n b = -(c >> bpe)\n c += b * radix\n }\n x[i] = c & mask\n c = (c >> bpe) - b\n }\n}\n\n/**\n * do x=floor(x/n) for bigInt x and integer n, and return the remainder\n *\n * @param {number[]} x\n * @param {number} n\n * @returns {number} remainder\n */\nexport function divInt_(x: number[], n: number): number {\n var i,\n r = 0,\n s\n for (i = x.length - 1; i >= 0; i--) {\n s = r * radix + x[i]\n x[i] = Math.floor(s / n)\n r = s % n\n }\n return r\n}\n\n/**\n * do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} a\n * @param {number} b\n * @returns {void}\n */\nexport function linComb_(x: number[], y: number[], a: number, b: number): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n kk = x.length\n for (c = 0, i = 0; i < k; i++) {\n c += a * x[i] + b * y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; i < kk; i++) {\n c += a * x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.\n *\n * x must be large enough to hold the answer.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} b\n * @param {number} ys\n * @returns {void}\n */\nexport function linCombShift_(\n x: number[],\n y: number[],\n b: number,\n ys: number,\n): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + b * y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+(y<<(ys*bpe)) for bigInts x and y, and integer ys.\n *\n * x must be large enough to hold the answer.\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function addShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] + y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-(y<<(ys*bpe)) for bigInts x and y, and integer ys\n *\n * x must be large enough to hold the answer\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number} ys\n * @return {void}\n */\nexport function subShift_(x: number[], y: number[], ys: number): void {\n var i, c, k, kk\n k = x.length < ys + y.length ? x.length : ys + y.length\n kk = x.length\n for (c = 0, i = ys; i < k; i++) {\n c += x[i] - y[i - ys]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < kk; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x-y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * negative answers will be 2s complement\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function sub_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] - y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x+y for bigInts x and y\n *\n * x must be large enough to hold the answer\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @return {void}\n */\nexport function add_(x: number[], y: number[]): void {\n var i, c, k, kk\n k = x.length < y.length ? x.length : y.length\n for (c = 0, i = 0; i < k; i++) {\n c += x[i] + y[i]\n x[i] = c & mask\n c >>= bpe\n }\n for (i = k; c && i < x.length; i++) {\n c += x[i]\n x[i] = c & mask\n c >>= bpe\n }\n}\n\n/**\n * do x=x*y for bigInts x and y.\n *\n * This is faster when y 0 && !x[kx - 1]; kx--); //ignore leading zeros in x\n k = kx > n.length ? 2 * kx : 2 * n.length //k=# elements in the product, which is twice the elements in the larger of x and n\n if (s0.length != k) s0 = new Array(k)\n copyInt_(s0, 0)\n for (i = 0; i < kx; i++) {\n c = s0[2 * i] + x[i] * x[i]\n s0[2 * i] = c & mask\n c >>= bpe\n for (j = i + 1; j < kx; j++) {\n c = s0[i + j] + 2 * x[i] * x[j] + c\n s0[i + j] = c & mask\n c >>= bpe\n }\n s0[i + kx] = c\n }\n mod_(s0, n)\n copy_(x, s0)\n}\n\n/**\n * return x with exactly k leading zero elements\n *\n * @export\n * @param {number[]} x\n * @param {number} k\n * @returns {number[]}\n */\nexport function trim(x: number[], k: number): number[] {\n var i, y\n for (i = x.length; i > 0 && !x[i - 1]; i--);\n y = new Array(i + k)\n copy_(y, x)\n return y\n}\n\n/**\n * do `x=x**y mod n`, where x,y,n are bigInts and `**` is exponentiation. `0**0=1`.\n *\n * this is faster when n is odd.\n *\n * x usually needs to have as many elements as n.\n *\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @return {void}\n */\nexport function powMod_(x: number[], y: number[], n: number[]): void {\n var k1, k2, kn, np\n if (s7.length != n.length) s7 = dup(n)\n\n //for even modulus, use a simple square-and-multiply algorithm,\n //rather than using the more complex Montgomery algorithm.\n if ((n[0] & 1) == 0) {\n copy_(s7, x)\n copyInt_(x, 1)\n while (!equalsInt(y, 0)) {\n if (y[0] & 1) multMod_(x, s7, n)\n divInt_(y, 2)\n squareMod_(s7, n)\n }\n return\n }\n\n //calculate np from n for the Montgomery multiplications\n copyInt_(s7, 0)\n for (kn = n.length; kn > 0 && !n[kn - 1]; kn--);\n np = radix - inverseModInt(modInt(n, radix), radix)\n s7[kn] = 1\n multMod_(x, s7, n) // x = x * 2**(kn*bp) mod n\n\n if (s3.length != x.length) s3 = dup(x)\n else copy_(s3, x)\n //$off\n // @ts-ignore\n for (k1 = y.length - 1; (k1 > 0) & !y[k1]; k1--); //k1=first nonzero element of y\n if (y[k1] == 0) {\n //anything to the 0th power is 1\n copyInt_(x, 1)\n return\n }\n for (k2 = 1 << (bpe - 1); k2 && !(y[k1] & k2); k2 >>= 1); //k2=position of first 1 bit in y[k1]\n for (;;) {\n if (!(k2 >>= 1)) {\n //look at next bit of y\n k1--\n if (k1 < 0) {\n mont_(x, one, n, np)\n return\n }\n k2 = 1 << (bpe - 1)\n }\n mont_(x, x, n, np)\n\n if (k2 & y[k1])\n //if next bit is a 1\n mont_(x, s3, n, np)\n }\n}\n\n/**\n * do x=x*y*Ri mod n for bigInts x,y,n,\n * where Ri = 2**(-kn*bpe) mod n, and kn is the\n * number of elements in the n array, not\n * counting leading zeros.\n *\n * x array must have at least as many elemnts as the n array\n * It's OK if x and y are the same variable.\n *\n * must have:\n * * x,y < n\n * * n is odd\n * * np = -(n^(-1)) mod radix\n *\n * @export\n * @param {number[]} x\n * @param {number[]} y\n * @param {number[]} n\n * @param {number} np\n * @return {void}\n */\nexport function mont_(x: number[], y: number[], n: number[], np: number): void {\n var i, j, c, ui, t, ks\n var kn = n.length\n var ky = y.length\n\n if (sa.length != kn) sa = new Array(kn)\n\n copyInt_(sa, 0)\n\n for (; kn > 0 && n[kn - 1] == 0; kn--); //ignore leading zeros of n\n for (; ky > 0 && y[ky - 1] == 0; ky--); //ignore leading zeros of y\n ks = sa.length - 1 //sa will never have more than this many nonzero elements.\n\n //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large numbers\n for (i = 0; i < kn; i++) {\n t = sa[0] + x[i] * y[0]\n ui = ((t & mask) * np) & mask //the inner \"& mask\" was needed on Safari (but not MSIE) at one time\n c = (t + ui * n[0]) >> bpe\n t = x[i]\n\n //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe. Loop is unrolled 5-fold for speed\n j = 1\n for (; j < ky - 4; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ky; ) {\n c += sa[j] + ui * n[j] + t * y[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn - 4; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < kn; ) {\n c += sa[j] + ui * n[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n for (; j < ks; ) {\n c += sa[j]\n sa[j - 1] = c & mask\n c >>= bpe\n j++\n }\n sa[j - 1] = c & mask\n }\n\n if (!greater(n, sa)) sub_(sa, n)\n copy_(x, sa)\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bufferConcats } from '../../helpers/bytes';\nimport { add_, bigInt2str, cmp, leftShift_, str2bigInt } from '../../vendor/leemon';\n\n \n \n \n\n \n \n \n \n \n \n \n \n \n\nexport function isObject(object: any) {\n return typeof(object) === 'object' && object !== null;\n}\n\n/* export function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n} */\n\n/* export function bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10);\n} */\n\n/* export function base64ToBlob(base64str: string, mimeType: string) {\n var sliceSize = 1024;\n var byteCharacters = atob(base64str);\n var bytesLength = byteCharacters.length;\n var slicesCount = Math.ceil(bytesLength / sliceSize);\n var byteArrays = new Array(slicesCount);\n\n for(var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {\n var begin = sliceIndex * sliceSize;\n var end = Math.min(begin + sliceSize, bytesLength);\n\n var bytes = new Array(end - begin);\n for(var offset = begin, i = 0; offset < end; ++i, ++offset) {\n bytes[i] = byteCharacters[offset].charCodeAt(0);\n }\n byteArrays[sliceIndex] = new Uint8Array(bytes);\n }\n\n return blobConstruct(byteArrays, mimeType);\n}\n\nexport function dataUrlToBlob(url: string) {\n // var name = 'b64blob ' + url.length\n // console.time(name)\n var urlParts = url.split(',');\n var base64str = urlParts[1];\n var mimeType = urlParts[0].split(':')[1].split(';')[0];\n var blob = base64ToBlob(base64str, mimeType);\n // console.timeEnd(name)\n return blob;\n} */\n\nexport function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n\n/* export function bytesFromBigInt(bigInt: BigInteger, len?: number) {\n var bytes = bigInt.toByteArray();\n\n if(len && bytes.length < len) {\n var padding = [];\n for(var i = 0, needPadding = len - bytes.length; i < needPadding; i++) {\n padding[i] = 0;\n }\n if(bytes instanceof ArrayBuffer) {\n bytes = bufferConcat(padding, bytes);\n } else {\n bytes = padding.concat(bytes);\n }\n } else {\n while (!bytes[0] && (!len || bytes.length > len)) {\n bytes = bytes.slice(1);\n }\n }\n\n return bytes;\n} */\n\nexport function longFromInts(high: number, low: number): string {\n //let perf = performance.now();\n //let str = bigint(high).shiftLeft(32).add(bigint(low)).toString(10);\n //console.log('longFromInts jsbn', performance.now() - perf);\n high = intToUint(high);\n low = intToUint(low);\n \n //perf = performance.now();\n const bigInt = str2bigInt(high.toString(16), 16, 32);//int2bigInt(high, 64, 64);\n //console.log('longFromInts construct high', bigint(high).toString(10), bigInt2str(bigInt, 10));\n leftShift_(bigInt, 32);\n //console.log('longFromInts shiftLeft', bigint(high).shiftLeft(32).toString(10), bigInt2str(bigInt, 10));\n add_(bigInt, str2bigInt(low.toString(16), 16, 32));\n const _str = bigInt2str(bigInt, 10);\n\n //console.log('longFromInts leemon', performance.now() - perf);\n\n //console.log('longFromInts', high, low, str, _str, str === _str);\n\n return _str;\n}\n\nexport function sortLongsArray(arr: string[]) {\n return arr.map(long => {\n return str2bigInt(long, 10);\n }).sort((a, b) => {\n return cmp(a, b);\n }).map(bigInt => {\n return bigInt2str(bigInt, 10);\n });\n}\n\nexport function addPadding(\n bytes: T, \n blockSize: number = 16, \n zeroes?: boolean, \n blockSizeAsTotalLength = false, \n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n ////console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n padding.randomize();\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport type MTProtoConstructor = {\r\n id: number,\r\n predicate: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport type MTProtoMethod = {\r\n id: number,\r\n method: string,\r\n params: Array<{\r\n name: string,\r\n type: string\r\n }>,\r\n type: string\r\n};\r\n\r\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":-646342540,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1073147056,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"kicked\",\"type\":\"flags.1?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-2107528095,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":-779165146,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-516145888,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?Vector\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-2074799289,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":1080663248,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1441072131,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":739712882,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"}],\"type\":\"Dialog\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-1673717362,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1353671392,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?string\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-818518751,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1682413576,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1007549728,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-232290676,\"predicate\":\"updateUserPhoto\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"photo\",\"type\":\"UserProfilePhoto\"},{\"name\":\"previous\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1135492588,\"predicate\":\"updateStickerSets\",\"params\":[],\"type\":\"Update\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-299124375,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1153291573,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":357013699,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":856375399,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":1248893260,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":512177195,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":408623183,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-673242758,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":-1240849242,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":460632885,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-2067782896,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":215516896,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"}],\"type\":\"Invoice\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":378828315,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?PaymentSavedCredentials\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1655957568,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1661470870,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":1648543603,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":-534283678,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-532532493,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"int\"},{\"name\":\"file_size_max\",\"type\":\"int\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":1705297877,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-2091463255,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1873957073,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":142306870,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactons\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":-1826077446,\"predicate\":\"messageUserReaction\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"MessageUserReaction\"},{\"id\":-1553558980,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1126886015,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":1099779595,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"reason\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1880182943,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":-323339813,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-262453244,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?int\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":-1919060949,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":228423076,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-497026848,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-869258997,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":164303470,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":864953444,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":2057376407,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1137057461,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1180140658,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":251759059,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-134016113,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1932455680,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-265962357,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":627641572,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-521245833,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?string\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":335875750,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":-647969580,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":1926525996,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1319462148,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":536919235,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1302676017,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-956147407,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":1029681423,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1355375294,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1976353651,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-619695760,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":818134173,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"}]},\"layer\":137} as {\r\n MTProto: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n API: {\r\n constructors: MTProtoConstructor[],\r\n methods: MTProtoMethod[],\r\n constructorsIndex?: {[id: number]: number}\r\n },\r\n layer: number,\r\n};","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1),\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n//import sha1 from '@cryptography/sha1';\n//import sha256 from '@cryptography/sha256';\nimport {IGE} from '@cryptography/aes';\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n\nimport {str2bigInt, bpe, equalsInt, greater, \n copy_, eGCD_, add_, rightShift_, sub_, copyInt_, isZero,\n divide_, one, bigInt2str, powMod, bigInt2bytes, int2bigInt, mod} from '../../vendor/leemon';//from 'leemon';\n\nimport { addPadding } from '../mtproto/bin_utils';\nimport { bytesToWordss, bytesFromWordss, bytesToHex, bytesFromHex, convertToUint8Array } from '../../helpers/bytes';\nimport { nextRandomUint } from '../../helpers/random';\nimport type { RSAPublicKeyHex } from '../mtproto/rsaKeysManager';\n\nconst subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport function longToBytes(sLong: string) {\n /* let perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n }\n console.log('longToBytes JSBN', sLong, performance.now() - perf);\n \n //const bytes = bytesFromWords({words: longToInts(sLong), sigBytes: 8}).reverse();\n \n perf = performance.now();\n for(let i = 0; i < 1000000; ++i) {\n bigInt2bytes(str2bigInt(sLong, 10));\n }\n console.log('longToBytes LEEMON', sLong, performance.now() - perf); */\n\n const bigIntBytes = new Uint8Array(bigInt2bytes(str2bigInt(sLong, 10), false));\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n //console.log('longToBytes', bytes, b);\n \n return bytes;\n}\n\nexport function sha1HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then(b => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null, \n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n\nexport function sha256HashSync(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then(b => {\n //console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n \n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES encrypt start', bytes, keyBytes, ivBytes);\n // console.log('aes before padding bytes:', bytesToHex(bytes));\n bytes = addPadding(bytes);\n // console.log('aes after padding bytes:', bytesToHex(bytes));\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const encryptedBytes = cipher.encrypt(bytesToWordss(bytes));\n //console.log(dT(), 'AES encrypt finish');\n\n return bytesFromWordss(encryptedBytes);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n //console.log(dT(), 'AES decrypt start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const decryptedBytes = cipher.decrypt(bytesToWordss(bytes));\n\n //console.log(dT(), 'AES decrypt finish');\n\n return bytesFromWordss(decryptedBytes);\n}\n\nexport function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n //console.log(dT(), 'RSA encrypt start', publicKey, bytes);\n\n const N = str2bigInt(publicKey.modulus, 16);\n const E = str2bigInt(publicKey.exponent, 16);\n const X = str2bigInt(bytesToHex(bytes), 16);\n\n const encryptedBigInt = powMod(X, E, N);\n const encryptedBytes = bytesFromHex(bigInt2str(encryptedBigInt, 16));\n\n //console.log(dT(), 'RSA encrypt finish');\n\n return encryptedBytes;\n}\n\nexport async function hash_pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n \n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n let bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'},\n },\n importKey,\n 512\n );\n\n return bits.then(buffer => new Uint8Array(buffer));\n}\n\nexport function pqPrimeFactorization(pqBytes: Uint8Array | number[]) {\n let result: ReturnType;\n\n //console.log('PQ start', pqBytes, bytesToHex(pqBytes));\n\n try {\n //console.time('PQ leemon');\n result = pqPrimeLeemon(str2bigInt(bytesToHex(pqBytes), 16, Math.ceil(64 / bpe) + 1));\n //console.timeEnd('PQ leemon');\n } catch(e) {\n console.error('Pq leemon Exception', e);\n }\n\n //console.log('PQ finish', result);\n\n return result;\n}\n\nexport function pqPrimeLeemon(what: number[]): [Uint8Array, Uint8Array, number] {\n var minBits = 64;\n var minLen = Math.ceil(minBits / bpe) + 1;\n var it = 0;\n var i, q;\n var j, lim;\n var P;\n var Q;\n var a = new Array(minLen);\n var b = new Array(minLen);\n var c = new Array(minLen);\n var g = new Array(minLen);\n var z = new Array(minLen);\n var x = new Array(minLen);\n var y = new Array(minLen);\n\n for(i = 0; i < 3; ++i) {\n q = (nextRandomUint(8) & 15) + 17;\n copy_(x, mod(int2bigInt(nextRandomUint(32), 32, 0), what));\n copy_(y, x);\n lim = 1 << (i + 18);\n\n for (j = 1; j < lim; ++j) {\n ++it;\n copy_(a, x);\n copy_(b, x);\n copyInt_(c, q);\n\n while(!isZero(b)) {\n if(b[0] & 1) {\n add_(c, a);\n if(greater(c, what)) {\n sub_(c, what);\n }\n }\n add_(a, a);\n if(greater(a, what)) {\n sub_(a, what);\n }\n rightShift_(b, 1);\n }\n\n copy_(x, c);\n if(greater(x, y)) {\n copy_(z, x);\n sub_(z, y);\n } else {\n copy_(z, y);\n sub_(z, x);\n }\n eGCD_(z, what, g, a, b);\n if(!equalsInt(g, 1)) {\n break;\n }\n if((j & (j - 1)) === 0) {\n copy_(y, x);\n }\n }\n if(greater(g, one)) {\n break;\n }\n }\n\n divide_(what, g, x, y);\n\n if(greater(g, x)) {\n P = x;\n Q = g;\n } else {\n P = g;\n Q = x;\n }\n\n // console.log(dT(), 'done', bigInt2str(what, 10), bigInt2str(P, 10), bigInt2str(Q, 10))\n\n return [new Uint8Array(bigInt2bytes(P)), new Uint8Array(bigInt2bytes(Q)), it];\n}\n\nexport function bytesModPow(x: number[] | Uint8Array, y: number[] | Uint8Array, m: number[] | Uint8Array) {\n try {\n const xBigInt = str2bigInt(bytesToHex(x), 16);\n const yBigInt = str2bigInt(bytesToHex(y), 16);\n const mBigInt = str2bigInt(bytesToHex(m), 16);\n const resBigInt = powMod(xBigInt, yBigInt, mBigInt);\n\n return bytesFromHex(bigInt2str(resBigInt, 16));\n } catch(e) {\n console.error('mod pow error', e);\n }\n\n //return bytesFromBigInt(new BigInteger(x).modPow(new BigInteger(y), new BigInteger(m)), 256);\n}\n\n//export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n//export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n //console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n //console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\nimport { addPadding, isObject, longFromInts } from './bin_utils';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { str2bigInt, bigInt2str, int2bigInt, sub_ } from '../../vendor/leemon';\nimport Schema, { MTProtoConstructor } from './schema';\nimport { JSONValue } from '../../layer';\n\n \n// @ts-ignore\nimport { gzipUncompress } from '../crypto/crypto_utils';\n \n\n// @ts-ignore\n/* import {BigInteger} from 'jsbn';\n\nexport function bigint(num: number) {\n return new BigInteger(num.toString(16), 16);\n}\n\nfunction bigStringInt(strNum: string) {\n return new BigInteger(strNum, 10)\n} */\n\nconst boolFalse = +Schema.API.constructors.find(c => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find(c => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find(c => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find(c => c.predicate === 'gzip_packed').id;\n\n//console.log('boolFalse', boolFalse === 0xbc799737);\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;//Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n //let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n //console.log('perf uint8', performance.now() - perf);\n\n //perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n //console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n \n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n \n resultArray.set(this.byteView.subarray(0, this.offset));\n \n return resultArray;\n }\n \n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; i++) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n \n //console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n //const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n \n this.createBuffer();\n \n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32), \n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n \n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n \n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n \n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n \n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n \n if(typeof sLong !== 'string') {\n sLong = sLong ? sLong.toString() : '0';\n }\n\n /* let perf = performance.now();\n const jsbnBytes: Uint8Array = new Uint8Array(8);\n const jsbnBigInt = bigStringInt(sLong);\n for(let i = 0; i < 8; i++) {\n jsbnBytes[i] = +jsbnBigInt.shiftRight(8 * i).and(bigint(255)).toString(10);\n }\n console.log('perf1', performance.now() - perf); */\n\n // perf = performance.now();\n let bigInt: number[];\n if(sLong[0] === '-') { // leemon library can't parse signed numbers\n bigInt = int2bigInt(0, 64, 8);\n sub_(bigInt, str2bigInt(sLong.slice(1), 10, 64));\n } else {\n bigInt = str2bigInt(sLong, 10, 64);\n }\n\n const hex = bigInt2str(bigInt, 16).slice(-16);\n const bytes = addPadding(bytesFromHex(hex).reverse(), 8, true, true, false);\n\n // console.log('perf2', performance.now() - perf);\n\n this.storeRawBytes(bytes);\n\n // if(jsbnBytes.hex !== bytes.hex) {\n // console.error(bigInt, sLong, bigInt2str(bigInt, 10), negative(bigInt), jsbnBytes.hex, bigInt2str(bigInt, 16), bytes.hex);\n // }\n }\n \n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n doubleView[0] = f;\n \n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n \n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n \n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n \n this.checkLength(sUTF8.length + 8);\n \n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; i++) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n \n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n \n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n \n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n \n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n \n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n \n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n \n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n \n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find(m => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n \n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n //console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n \n //console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n \n //console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n \n public storeObject(obj: any, type: string, field?: string) {\n //console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n \n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if (type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; i++) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if (type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n \n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find(c => c.predicate === predicate);\n \n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n \n if(predicate === type) {\n isBare = true;\n }\n \n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n //console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n //console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n //console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n //console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n //console.log('storeObject', param, type);\n \n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(let paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n \n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug = \n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n //buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n //console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n private readInt(field: string) {\n //if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n \n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n \n this.debug/* || field.includes('[dialog][read_outbox_max_id]') */ \n && console.log('<<<', i.toString(16), i, field, \n this.byteView.slice(this.offset - 16, this.offset + 16), \n this.byteView.slice(this.offset - 16, this.offset + 16).hex);\n \n this.offset += 4;\n \n return i;\n }\n \n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n \n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n \n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n \n return doubleView[0];\n }\n \n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n \n //const longDec = bigint(iHigh).shiftLeft(32).add(bigint(iLow)).toString();\n const longDec = longFromInts(iHigh, iLow);\n\n if(!this.mtproto) {\n const num = +longDec;\n if(Number.isSafeInteger(num)) {\n // @ts-ignore\n return num;\n }\n }\n \n // @ts-ignore\n return longDec;\n }\n \n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n \n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n let sUTF8 = '';\n for(let i = 0; i < len; i++) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch (e) {\n s = sUTF8;\n }\n \n this.debug && console.log('<<<', s, (field || '') + ':string');\n \n return s;\n }\n \n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n \n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n \n const bytes = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n \n // Padding\n while(this.offset % 4) {\n this.offset++;\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n \n return bytes;\n }\n \n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n \n const len = bits / 8;\n if(typed) {\n const result = this.byteView.subarray(this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n \n return bytes;\n }\n \n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n \n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView.subarray(this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n \n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; i++) {\n bytes[i] = this.byteView[this.offset++];\n }\n \n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n \n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n \n return result;\n }\n \n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n \n field = field || type || 'Object';\n \n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n \n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n \n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find(c => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find(c => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n \n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n \n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n \n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; i++) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n \n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; i++) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n \n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n \n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n \n const predicate = constructorData.predicate;\n \n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; i++) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = (type.indexOf('?') !== -1);\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n //console.log('fetchObject bad', constructorData, result[fieldBit[0]], fieldBit);\n continue;\n }\n\n //console.log('fetchObject good', constructorData, result[fieldBit[0]], fieldBit);\n\n type = condType[1];\n }\n \n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n \n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n /* if(param.name === 'read_outbox_max_id') {\n console.log(result, param.name, value, field + '[' + predicate + '][' + param.name + ']');\n } */\n \n result[param.name] = value;\n }\n }\n }\n \n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n \n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n \n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n \n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport { TLDeserialization, TLSerialization };\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport ctx from './ctx';\r\n\r\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\r\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\r\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\r\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\r\n\r\n// https://stackoverflow.com/a/58065241\r\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\r\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\r\n !(ctx as any).MSStream;\r\n\r\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\r\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\r\n\r\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\r\n\r\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from \"../config/debug\";\nimport { IS_FIREFOX, IS_SAFARI } from \"../environment/userAgent\";\nimport { IS_SERVICE_WORKER, IS_WEB_WORKER } from \"../helpers/context\";\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst _logTimer = Date.now();\nfunction dT() {\n return '[' + ((Date.now() - _logTimer) / 1000).toFixed(3) + ']';\n}\n\nlet getCallerFunctionNameFromLine: (line: string) => string;\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\nif(IS_WEBKIT) {\n getCallerFunctionNameFromLine = (line) => {\n const splitted = line.split('@');\n return splitted[0];\n };\n} else {\n getCallerFunctionNameFromLine = (line: string) => {\n const splitted = line.trim().split(' ');\n if(splitted.length === 3) {\n return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n }\n };\n}\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\nconst LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\nfunction getCallerFunctionName() {\n const stack = new Error().stack;\n const lines = stack.split('\\n');\n const line = lines[LINE_INDEX] || lines[lines.length - 1];\n // const match = line.match(/\\.([^\\.]+?)\\s/);\n // line = match ? match[1] : line.trim();\n const caller = getCallerFunctionNameFromLine(line) || '';\n return '[' + caller + ']';\n}\n\nexport const LOGGER_STYLES = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n underscore: \"\\x1b[4m\",\n blink: \"\\x1b[5m\",\n reverse: \"\\x1b[7m\",\n hidden: \"\\x1b[8m\",\n // Foreground (text) colors\n fg: {\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\"\n },\n // Background colors\n bg: {\n black: \"\\x1b[40m\",\n red: \"\\x1b[41m\",\n green: \"\\x1b[42m\",\n yellow: \"\\x1b[43m\",\n blue: \"\\x1b[44m\",\n magenta: \"\\x1b[45m\",\n cyan: \"\\x1b[46m\",\n white: \"\\x1b[47m\"\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */, LogTypes][] = [\n [\"debug\", LogTypes.Debug], \n [\"info\", LogTypes.Log], \n [\"warn\", LogTypes.Warn], \n [\"error\", LogTypes.Error], \n [\"assert\", LogTypes.Error],\n [\"trace\", LogTypes.Log],\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n let originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n //level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, getCallerFunctionName(), ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, getCallerFunctionName(), ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport {str2bigInt, isZero,\r\n bigInt2str, powMod, int2bigInt, mult, mod, sub, bitSize, negative, add, greater} from '../../vendor/leemon';\r\n\r\nimport {logger, LogTypes} from '../logger';\r\nimport { AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo } from \"../../layer\";\r\nimport { bufferConcats, bytesToHex, bytesFromHex, bytesXor, convertToUint8Array } from \"../../helpers/bytes\";\r\nimport { addPadding } from \"../mtproto/bin_utils\";\r\n//import { MOUNT_CLASS_TO } from \"../../config/debug\";\r\n\r\nconst log = logger('SRP', LogTypes.Error);\r\n\r\n//MOUNT_CLASS_TO && Object.assign(MOUNT_CLASS_TO, {str2bigInt, bigInt2str, int2bigInt});\r\n\r\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\r\n // ! look into crypto_methods.test.ts\r\n let buffer = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\r\n //log('encoded 1', bytesToHex(new Uint8Array(buffer)));\r\n\r\n buffer = bufferConcats(server_salt, buffer, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', buffer);\r\n //log('encoded 2', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n let hash = await CryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\r\n //log('encoded 3', hash, bytesToHex(new Uint8Array(hash)));\r\n\r\n hash = bufferConcats(server_salt, hash, server_salt);\r\n\r\n buffer = await CryptoWorker.invokeCrypto('sha256-hash', hash);\r\n //log('got password hash:', buffer, bytesToHex(new Uint8Array(buffer)));\r\n\r\n return buffer;\r\n}\r\n\r\nexport async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\r\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\r\n //console.log('computeSRP:', password, state, isNew, algo);\r\n\r\n const p = str2bigInt(bytesToHex(algo.p), 16);\r\n const g = int2bigInt(algo.g, 32, 256);\r\n \r\n //log('p', bigInt2str(p, 16));\r\n \r\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\r\n console.error('srp_B < 0')\r\n }\r\n \r\n if(B.compareTo(p) <= 0) {\r\n console.error('srp_B <= p');\r\n } */\r\n \r\n /* let check_prime_and_good = (bytes: any, g: number) => {\r\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\r\n \r\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\r\n return true;\r\n }\r\n \r\n // TO-DO check_prime_and_good_check\r\n }; */\r\n \r\n //check_prime_and_good(algo.p, g);\r\n \r\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\r\n const x = str2bigInt(bytesToHex(pw_hash), 16);\r\n \r\n //log('computed pw_hash:', pw_hash, x, bytesToHex(new Uint8Array(pw_hash)));\r\n \r\n const padArray = function(arr: number[] | Uint8Array, len: number) {\r\n if(!(arr instanceof Uint8Array)) {\r\n arr = convertToUint8Array(arr);\r\n }\r\n \r\n return addPadding(arr, len, true, true, true);\r\n };\r\n \r\n const v = powMod(g, x, p);\r\n \r\n const flipper = (arr: Uint8Array | number[]) => {\r\n const out = new Uint8Array(arr.length);\r\n for(let i = 0; i < arr.length; i += 4) {\r\n out[i] = arr[i + 3];\r\n out[i + 1] = arr[i + 2];\r\n out[i + 2] = arr[i + 1];\r\n out[i + 3] = arr[i];\r\n }\r\n \r\n return out;\r\n };\r\n \r\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\r\n if(isNew) {\r\n const bytes = bytesFromHex(bigInt2str(v, 16));\r\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\r\n }\r\n \r\n const B = str2bigInt(bytesToHex(state.srp_B), 16);\r\n //log('B', bigInt2str(B, 16));\r\n \r\n const pForHash = padArray(bytesFromHex(bigInt2str(p, 16)), 256);\r\n const gForHash = padArray(bytesFromHex(bigInt2str(g, 16)), 256); // like uint8array\r\n const b_for_hash = padArray(bytesFromHex(bigInt2str(B, 16)), 256);\r\n /* log(bytesToHex(pForHash));\r\n log(bytesToHex(gForHash));\r\n log(bytesToHex(b_for_hash)); */\r\n\r\n //log('g_x', bigInt2str(g_x, 16));\r\n\r\n const kHash = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(pForHash, gForHash));\r\n const k = str2bigInt(bytesToHex(kHash), 16);\r\n\r\n //log('k', bigInt2str(k, 16));\r\n\r\n // kg_x = (k * g_x) % p\r\n const k_v = mod(mult(k, v), p);\r\n\r\n // good\r\n\r\n //log('kg_x', bigInt2str(kg_x, 16));\r\n\r\n const is_good_mod_exp_first = (modexp: any, prime: any) => {\r\n const diff = sub(prime, modexp);\r\n const min_diff_bits_count = 2048 - 64;\r\n const max_mod_exp_size = 256;\r\n if(negative(diff) ||\r\n bitSize(diff) < min_diff_bits_count || \r\n bitSize(modexp) < min_diff_bits_count || \r\n Math.floor((bitSize(modexp) + 7) / 8) > max_mod_exp_size)\r\n return false;\r\n return true;\r\n };\r\n\r\n const generate_and_check_random = async() => {\r\n while(true) {\r\n const a = str2bigInt(bytesToHex(flipper(state.secure_random)), 16);\r\n //const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\r\n\r\n //console.log('ITERATION');\r\n\r\n //log('g a p', bigInt2str(g, 16), bigInt2str(a, 16), bigInt2str(p, 16));\r\n\r\n const A = powMod(g, a, p);\r\n //log('A MODPOW', bigInt2str(A, 16));\r\n if(is_good_mod_exp_first(A, p)) {\r\n const a_for_hash = bytesFromHex(bigInt2str(A, 16));\r\n\r\n const s = await CryptoWorker.invokeCrypto('sha256-hash', bufferConcats(a_for_hash, b_for_hash));\r\n const u = str2bigInt(s.hex, 16);\r\n if(!isZero(u) && !negative(u))\r\n return {a, a_for_hash, u};\r\n } \r\n }\r\n }\r\n \r\n\r\n const {a, a_for_hash, u} = await generate_and_check_random();\r\n\r\n /* log('a', bigInt2str(a, 16));\r\n log('a_for_hash', bytesToHex(a_for_hash));\r\n log('u', bigInt2str(u, 16)); */\r\n\r\n // g_b = (B - kg_x) % p\r\n /* log('B - kg_x', bigInt2str(sub(B, kg_x), 16));\r\n log('subtract', bigInt2str(B, 16), bigInt2str(kg_x, 16));\r\n log('B - kg_x', bigInt2str(sub(B, kg_x), 16)); */\r\n\r\n let g_b: number[];\r\n if(!greater(B, k_v)) {\r\n //log('negative');\r\n g_b = add(B, p);\r\n } else g_b = B;\r\n g_b = mod(sub(g_b, k_v), p);\r\n /* let g_b = sub(B, kg_x);\r\n if(negative(g_b)) g_b = add(g_b, p); */\r\n \r\n //log('g_b', bigInt2str(g_b, 16));\r\n\r\n /* if(!is_good_mod_exp_first(g_b, p))\r\n throw new Error('bad g_b'); */\r\n\r\n const ux = mult(u, x);\r\n //log('u and x multiply', bigInt2str(u, 16), bigInt2str(x, 16), bigInt2str(ux, 16));\r\n const a_ux = add(a, ux);\r\n const S = powMod(g_b, a_ux, p);\r\n\r\n const K = await CryptoWorker.invokeCrypto('sha256-hash', padArray(bytesFromHex(bigInt2str(S, 16)), 256));\r\n\r\n //log('K', bytesToHex(K), new Uint32Array(new Uint8Array(K).buffer));\r\n\r\n let h1 = await CryptoWorker.invokeCrypto('sha256-hash', pForHash);\r\n const h2 = await CryptoWorker.invokeCrypto('sha256-hash', gForHash);\r\n h1 = bytesXor(h1, h2);\r\n\r\n const buff = bufferConcats(h1, \r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt1),\r\n await CryptoWorker.invokeCrypto('sha256-hash', algo.salt2),\r\n a_for_hash,\r\n b_for_hash,\r\n K\r\n );\r\n\r\n const M1 = await CryptoWorker.invokeCrypto('sha256-hash', buff);\r\n\r\n const out = {\r\n _: 'inputCheckPasswordSRP', \r\n srp_id: state.srp_id, \r\n A: new Uint8Array(a_for_hash), \r\n M1\r\n } as InputCheckPasswordSRP.inputCheckPasswordSRP;\r\n\r\n\r\n //log('out', bytesToHex(out.A), bytesToHex(out.M1));\r\n return out;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n// import { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport CryptoWorkerMethods, { CryptoMethods } from './crypto_methods';\r\n\r\n \r\nimport { aesDecryptSync, aesEncryptSync, bytesModPow, gzipUncompress, hash_pbkdf2, pqPrimeFactorization, rsaEncrypt, sha1HashSync, sha256HashSync } from './crypto_utils';\r\nimport { computeSRP } from './srp';\r\n \r\n\r\ntype Task = {\r\n taskId: number,\r\n task: string,\r\n args: any[]\r\n};\r\n\r\nclass CryptoWorker extends CryptoWorkerMethods {\r\n private webWorker: Worker | boolean = false;\r\n private taskId = 0;\r\n private awaiting: {\r\n [id: number]: {\r\n resolve: any,\r\n reject: any,\r\n taskName: string\r\n }\r\n } = {} as any;\r\n private pending: Array = [];\r\n private debug = false;\r\n\r\n private utils: CryptoMethods;\r\n\r\n constructor() {\r\n super();\r\n console.log('CW constructor');\r\n\r\n \r\n this.utils = {\r\n 'sha1-hash': sha1HashSync,\r\n 'sha256-hash': sha256HashSync,\r\n 'pbkdf2': hash_pbkdf2,\r\n 'aes-encrypt': aesEncryptSync,\r\n 'aes-decrypt': aesDecryptSync,\r\n 'rsa-encrypt': rsaEncrypt,\r\n 'factorize': pqPrimeFactorization,\r\n 'mod-pow': bytesModPow,\r\n 'gzipUncompress': gzipUncompress,\r\n 'computeSRP': computeSRP\r\n };\r\n\r\n // Promise.all([\r\n // import('./crypto_utils').then(utils => {\r\n // Object.assign(this.utils, {\r\n // 'sha1-hash': utils.sha1HashSync,\r\n // 'sha256-hash': utils.sha256HashSync,\r\n // 'pbkdf2': utils.hash_pbkdf2,\r\n // 'aes-encrypt': utils.aesEncryptSync,\r\n // 'aes-decrypt': utils.aesDecryptSync,\r\n // 'rsa-encrypt': utils.rsaEncrypt,\r\n // 'factorize': utils.pqPrimeFactorization,\r\n // 'mod-pow': utils.bytesModPow,\r\n // 'gzipUncompress': utils.gzipUncompress,\r\n // });\r\n // }),\r\n\r\n // import('./srp').then(srp => {\r\n // this.utils.computeSRP = srp.computeSRP;\r\n // })/* ,\r\n\r\n // import('../bin_utils').then(utils => {\r\n // this.utils.unzip = utils.gzipUncompress;\r\n // }) */\r\n // ]);\r\n\r\n return;\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n public performTaskWorker(task: string, ...args: any[]) {\r\n this.debug && console.log('CW start', task, args);\r\n\r\n \r\n // @ts-ignore\r\n return Promise.resolve(this.utils[task](...args));\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n}\r\n\r\nconst cryptoWorker = new CryptoWorker();\r\n// MOUNT_CLASS_TO.CryptoWorker = cryptoWorker;\r\nexport default cryptoWorker;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { Awaited } from \"../../types\";\r\nimport type { aesEncryptSync, aesDecryptSync, sha256HashSync, sha1HashSync, bytesModPow, hash_pbkdf2, rsaEncrypt, pqPrimeFactorization, gzipUncompress } from \"./crypto_utils\";\r\nimport type { computeSRP } from \"./srp\";\r\n\r\nexport type CryptoMethods = {\r\n 'sha1-hash': typeof sha1HashSync,\r\n 'sha256-hash': typeof sha256HashSync,\r\n 'pbkdf2': typeof hash_pbkdf2,\r\n 'aes-encrypt': typeof aesEncryptSync,\r\n 'aes-decrypt': typeof aesDecryptSync,\r\n 'rsa-encrypt': typeof rsaEncrypt,\r\n 'factorize': typeof pqPrimeFactorization,\r\n 'mod-pow': typeof bytesModPow,\r\n 'gzipUncompress': typeof gzipUncompress,\r\n 'computeSRP': typeof computeSRP\r\n};\r\n\r\nexport default abstract class CryptoWorkerMethods {\r\n abstract performTaskWorker(task: string, ...args: any[]): Promise;\r\n\r\n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\r\n return this.performTaskWorker>>(method, ...args as any[]);\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport { longFromInts } from './bin_utils';\nimport { nextRandomUint } from '../../helpers/random';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport { WorkerTaskVoidTemplate } from '../../types';\nimport { notifySomeone } from '../../helpers/context';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager {\n private lastMessageId: [number, number] = [0, 0];\n private timeOffset: number = 0;\n\n constructor() {\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = longFromInts(messageId[0], messageId[1]);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.lastMessageId = [0, 0];\n this.timeOffset = newTimeOffset;\n \n //console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n \n const task: ApplyServerTimeOffsetTask = {\n type: 'applyServerTimeOffset',\n payload: newTimeOffset\n };\n notifySomeone(task);\n \n\n return changed;\n }\n}\n\nconst timeManager = new TimeManager();\nMOUNT_CLASS_TO.timeManager = timeManager;\nexport default timeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type { DcId } from \"../types\";\n\nexport const MAIN_DOMAIN = 'web.telegram.org';\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.3.9',\n langPack: 'macos',\n langPackCode: 'en',\n domains: [MAIN_DOMAIN] as string[],\n baseDcId: 2 as DcId,\n isMainDomain: location.hostname === MAIN_DOMAIN,\n suffix: 'K'\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","export default function noop() {}\r\n","export const pause = (ms: number) => new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n});\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport noop from \"./noop\";\r\n\r\nexport interface CancellablePromise extends Promise {\r\n resolve?: (value: T) => void,\r\n reject?: (...args: any[]) => void,\r\n cancel?: () => void,\r\n\r\n notify?: (...args: any[]) => void,\r\n notifyAll?: (...args: any[]) => void,\r\n lastNotify?: any,\r\n listeners?: Array<(...args: any[]) => void>,\r\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\r\n\r\n isFulfilled?: boolean,\r\n isRejected?: boolean\r\n}\r\n\r\nexport function deferredPromise() {\r\n let deferredHelper: any = {\r\n isFulfilled: false, \r\n isRejected: false,\r\n\r\n notify: () => {}, \r\n notifyAll: (...args: any[]) => {\r\n deferredHelper.lastNotify = args;\r\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\r\n }, \r\n\r\n listeners: [],\r\n addNotifyListener: (callback: (...args: any[]) => void) => {\r\n if(deferredHelper.lastNotify) {\r\n callback(...deferredHelper.lastNotify);\r\n }\r\n\r\n deferredHelper.listeners.push(callback);\r\n }\r\n };\r\n\r\n let deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n deferredHelper.resolve = (value: T) => {\r\n if(deferred.isFulfilled || deferred.isRejected) return;\r\n\r\n deferred.isFulfilled = true;\r\n resolve(value);\r\n };\r\n \r\n deferredHelper.reject = (...args: any[]) => {\r\n if(deferred.isRejected || deferred.isFulfilled) return;\r\n \r\n deferred.isRejected = true;\r\n reject(...args);\r\n };\r\n });\r\n\r\n // @ts-ignore\r\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\r\n const n = deferredPromise>();\r\n \r\n }; */\r\n\r\n deferred.catch(noop).finally(() => {\r\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\r\n deferred.listeners.length = 0;\r\n\r\n if(deferred.cancel) {\r\n deferred.cancel = () => {};\r\n }\r\n });\r\n\r\n Object.assign(deferred, deferredHelper);\r\n\r\n return deferred;\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport type { ArgumentTypes, SuperReturnType } from \"../types\";\r\n\r\n// class EventSystem {\r\n// wm: WeakMap>> = new WeakMap();\r\n\r\n// add(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (listeners === undefined) {\r\n// listeners = {};\r\n// }\r\n// let listenersForEvent = listeners[event];\r\n// if (listenersForEvent === undefined) {\r\n// listenersForEvent = new Set();\r\n// }\r\n// listenersForEvent.add(listener);\r\n// listeners[event] = listenersForEvent;\r\n// //target.addEventListener(event, listener);\r\n// this.wm.set(target, listeners);\r\n// };\r\n\r\n// remove(target: any, event: any, listener: any) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// listenersForEvent.delete(listener);\r\n// };\r\n \r\n// /* fire(target, event) {\r\n// let listeners = this.wm.get(target);\r\n// if (!listeners) return;\r\n// let listenersForEvent = listeners[event];\r\n// if (!listenersForEvent) return;\r\n// for (let handler of handlers) {\r\n// setTimeout(handler, 0, event, target); // we use a setTimeout here because we want event triggering to be asynchronous. \r\n// }\r\n// }; */\r\n// }\r\n\r\n// console.log = () => {};\r\n\r\n// const e = new EventSystem();\r\n// MOUNT_CLASS_TO.e = e;\r\n\r\nexport type EventListenerListeners = Record;\r\n\r\n/**\r\n * Better not to remove listeners during setting\r\n * Should add listener callback only once\r\n */\r\n\r\n// type EventLitenerCallback = (data: T) => \r\n// export default class EventListenerBase {\r\nexport default class EventListenerBase {\r\n protected listeners: Partial<{\r\n [k in keyof Listeners]: Array<{callback: Listeners[k], options: boolean | AddEventListenerOptions}>\r\n }>;\r\n protected listenerResults: Partial<{\r\n [k in keyof Listeners]: ArgumentTypes\r\n }>;\r\n\r\n private reuseResults: boolean;\r\n\r\n constructor(reuseResults?: boolean) {\r\n this._constructor(reuseResults);\r\n }\r\n\r\n public _constructor(reuseResults = false): any {\r\n this.reuseResults = reuseResults;\r\n this.listeners = {};\r\n this.listenerResults = {};\r\n }\r\n\r\n public addEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n (this.listeners[name] ?? (this.listeners[name] = [])).push({callback, options}); // ! add before because if you don't, you won't be able to delete it from callback\r\n\r\n if(this.listenerResults.hasOwnProperty(name)) {\r\n callback(...this.listenerResults[name]);\r\n \r\n if((options as AddEventListenerOptions)?.once) {\r\n this.listeners[name].pop();\r\n return;\r\n }\r\n }\r\n \r\n //e.add(this, name, {callback, once});\r\n }\r\n\r\n public addMultipleEventsListeners(obj: {\r\n [name in keyof Listeners]?: Listeners[name]\r\n }) {\r\n for(const i in obj) {\r\n this.addEventListener(i, obj[i]);\r\n }\r\n }\r\n\r\n public removeEventListener(name: T, callback: Listeners[T], options?: boolean | AddEventListenerOptions) {\r\n if(this.listeners[name]) {\r\n this.listeners[name].findAndSplice(l => l.callback === callback);\r\n }\r\n //e.remove(this, name, callback);\r\n }\r\n\r\n // * must be protected, but who cares\r\n private _dispatchEvent(name: T, collectResults: boolean, ...args: ArgumentTypes) {\r\n if(this.reuseResults) {\r\n this.listenerResults[name] = args;\r\n }\r\n\r\n const arr: Array> = collectResults && [];\r\n\r\n const listeners = this.listeners[name];\r\n if(listeners) {\r\n // ! this one will guarantee execution even if delete another listener during setting\r\n const left = listeners.slice();\r\n left.forEach((listener) => {\r\n const index = listeners.findIndex((l) => l.callback === listener.callback);\r\n if(index === -1) {\r\n return;\r\n }\r\n\r\n let result: any;\r\n try {\r\n result = listener.callback(...args);\r\n } catch(err) {\r\n console.error(err);\r\n }\r\n\r\n if(arr) {\r\n arr.push(result);\r\n }\r\n\r\n if((listener.options as AddEventListenerOptions)?.once) {\r\n this.removeEventListener(name, listener.callback);\r\n }\r\n });\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n public dispatchResultableEvent(name: T, ...args: ArgumentTypes) {\r\n return this._dispatchEvent(name, true, ...args);\r\n }\r\n\r\n // * must be protected, but who cares\r\n public dispatchEvent(name: T, ...args: ArgumentTypes) {\r\n this._dispatchEvent(name, false, ...args);\r\n }\r\n\r\n public cleanup() {\r\n this.listeners = {}; \r\n this.listenerResults = {};\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n/* import { copy } from \"./object\";\r\n\r\nexport function listMergeSorted(list1: any[] = [], list2: any[] = []) {\r\n const result = copy(list1);\r\n\r\n const minId = list1.length ? list1[list1.length - 1] : 0xFFFFFFFF;\r\n for(let i = 0; i < list2.length; i++) {\r\n if(list2[i] < minId) {\r\n result.push(list2[i]);\r\n }\r\n }\r\n\r\n return result;\r\n} */\r\n\r\nexport const accumulate = (arr: number[], initialValue: number) => arr.reduce((acc, value) => acc + value, initialValue);\r\n\r\nexport function indexOfAndSplice(array: Array, item: T) {\r\n const idx = array.indexOf(item);\r\n const spliced = idx !== -1 && array.splice(idx, 1);\r\n return spliced && spliced[0];\r\n}\r\n\r\nexport function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\r\n const out: typeof array = [];\r\n let idx = -1;\r\n while((idx = array.findIndex(verify)) !== -1) {\r\n out.push(array.splice(idx, 1)[0]);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nexport function forEachReverse(array: Array, callback: (value: T, index?: number, array?: Array) => void) {\r\n for(let length = array.length, i = length - 1; i >= 0; --i) {\r\n callback(array[i], i, array);\r\n }\r\n};\r\n\r\nexport function insertInDescendSortedArray(array: Array, element: T, property: K, pos?: number) {\r\n const sortProperty: number = element[property];\r\n\r\n if(pos === undefined) {\r\n pos = array.indexOf(element);\r\n if(pos !== -1) {\r\n const prev = array[pos - 1];\r\n const next = array[pos + 1];\r\n if((!prev || prev[property] >= sortProperty) && (!next || next[property] <= sortProperty)) {\r\n // console.warn('same pos', pos, sortProperty, prev, next);\r\n return pos;\r\n }\r\n \r\n array.splice(pos, 1);\r\n }\r\n }\r\n\r\n const len = array.length;\r\n if(!len || sortProperty <= array[len - 1][property]) {\r\n return array.push(element) - 1;\r\n } else if(sortProperty >= array[0][property]) {\r\n array.unshift(element);\r\n return 0;\r\n } else {\r\n for(let i = 0; i < len; i++) {\r\n if(sortProperty > array[i][property]) {\r\n array.splice(i, 0, element);\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n console.error('wtf', array, element);\r\n return array.indexOf(element);\r\n}\r\n\r\nexport function filterUnique>(arr: T): T {\r\n return [...new Set(arr)] as T;\r\n}\r\n\r\nexport function flatten(arr: T[][]): T[] {\r\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { logger, LogTypes } from '../../logger';\r\nimport Modes from '../../../config/modes';\r\nimport EventListenerBase from '../../../helpers/eventListenerBase';\r\nimport { MTConnection } from './transport';\r\n\r\n// let closeSocketBefore = Date.now() + 30e3;\r\n// let closeSocketAfter = Date.now() + 10e3;\r\n\r\nexport default class Socket extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private ws: WebSocket;\r\n private log: ReturnType;\r\n private debug = Modes.debug && false;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n this.connect();\r\n\r\n return this;\r\n }\r\n\r\n private removeListeners() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.ws.removeEventListener('open', this.handleOpen);\r\n this.ws.removeEventListener('close', this.handleClose);\r\n this.ws.removeEventListener('error', this.handleError);\r\n this.ws.removeEventListener('message', this.handleMessage);\r\n this.ws = undefined;\r\n }\r\n \r\n private connect() {\r\n this.ws = new WebSocket(this.url, 'binary');\r\n this.ws.binaryType = 'arraybuffer';\r\n this.ws.addEventListener('open', this.handleOpen);\r\n this.ws.addEventListener('close', this.handleClose);\r\n this.ws.addEventListener('error', this.handleError);\r\n this.ws.addEventListener('message', this.handleMessage);\r\n\r\n // if(Date.now() < closeSocketBefore) {\r\n // if(Date.now() >= closeSocketAfter) {\r\n // this.ws.close();\r\n // }\r\n }\r\n\r\n public close() {\r\n if(!this.ws) {\r\n return;\r\n }\r\n\r\n this.log('close execution');\r\n\r\n try {\r\n this.ws.close();\r\n } catch(err) {\r\n\r\n }\r\n this.handleClose();\r\n }\r\n \r\n private handleOpen = () => {\r\n this.log('opened');\r\n\r\n this.debug && this.log.debug('sending init packet');\r\n this.dispatchEvent('open');\r\n };\r\n\r\n private handleError = (e: Event) => {\r\n this.log.error('handleError', e);\r\n this.close();\r\n };\r\n\r\n private handleClose = () => {\r\n this.log('closed'/* , event, this.pending, this.ws.bufferedAmount */);\r\n\r\n this.removeListeners();\r\n this.dispatchEvent('close');\r\n };\r\n\r\n private handleMessage = (event: MessageEvent) => {\r\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\r\n\r\n this.dispatchEvent('message', event.data as ArrayBuffer);\r\n };\r\n\r\n public send = (body: Uint8Array) => {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n this.ws.send(body);\r\n };\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n//import aesjs from 'aes-js';\r\nimport AES from \"@cryptography/aes\";\r\nimport { bytesFromWordss } from \"../../../helpers/bytes\";\r\nimport { Codec } from \"./codec\";\r\n\r\nclass Counter {\r\n _counter: Uint8Array;\r\n\r\n constructor(initialValue: Uint8Array) {\r\n this._counter = initialValue;\r\n }\r\n\r\n increment() {\r\n for(let i = 15; i >= 0; i--) {\r\n if(this._counter[i] === 255) {\r\n this._counter[i] = 0;\r\n } else {\r\n this._counter[i]++;\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass CTR {\r\n _counter: Counter;\r\n _remainingCounter: Uint8Array = null;\r\n _remainingCounterIndex = 16;\r\n _aes: AES;\r\n\r\n constructor(key: Uint8Array, counter: Uint8Array) {\r\n this._counter = new Counter(counter);\r\n this._aes = new AES(key);\r\n }\r\n\r\n update(payload: Uint8Array) {\r\n const encrypted = payload.slice();\r\n\r\n for(let i = 0; i < encrypted.length; i++) {\r\n if(this._remainingCounterIndex === 16) {\r\n this._remainingCounter = new Uint8Array(bytesFromWordss(this._aes.encrypt(this._counter._counter)));\r\n this._remainingCounterIndex = 0;\r\n this._counter.increment();\r\n }\r\n\r\n encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++];\r\n }\r\n\r\n return encrypted;\r\n }\r\n}\r\n\r\n/* \r\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\r\n*/\r\nexport default class Obfuscation {\r\n /* public enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\r\n public dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\r\n\r\n public encNew: CTR;\r\n public decNew: CTR;\r\n\r\n public init(codec: Codec) {\r\n const initPayload = new Uint8Array(64);\r\n initPayload.randomize();\r\n \r\n while(true) {\r\n let val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | (initPayload[0]);\r\n let val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | (initPayload[4]);\r\n if(initPayload[0] !== 0xef &&\r\n val !== 0x44414548 &&\r\n val !== 0x54534f50 &&\r\n val !== 0x20544547 &&\r\n val !== 0x4954504f &&\r\n val !== 0xeeeeeeee &&\r\n val !== 0xdddddddd &&\r\n val2 !== 0x00000000) {\r\n //initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\r\n break;\r\n }\r\n initPayload.randomize();\r\n }\r\n\r\n ////////////////////////initPayload.subarray(60, 62).hex = dcId;\r\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\r\n console.log('initPayload', initPayload); */\r\n\r\n const reversedPayload = initPayload.slice().reverse();\r\n\r\n const encKey = initPayload.slice(8, 40);\r\n const encIv = initPayload.slice(40, 56);\r\n const decKey = reversedPayload.slice(8, 40);\r\n const decIv = reversedPayload.slice(40, 56);\r\n\r\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\r\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\r\n\r\n // console.log('encKey', encKey.hex, encIv.hex);\r\n // console.log('decKey', decKey.hex, decIv.hex);\r\n\r\n this.encNew = new CTR(encKey, encIv);\r\n this.decNew = new CTR(decKey, decIv);\r\n\r\n initPayload.set(codec.obfuscateTag, 56);\r\n const encrypted = this.encode(initPayload);\r\n\r\n //console.log('encrypted', encrypted);\r\n\r\n initPayload.set(encrypted.slice(56, 64), 56);\r\n\r\n return initPayload;\r\n }\r\n\r\n /* public encode(payload: Uint8Array) {\r\n let startTime = performance.now();\r\n let res = this.enc.encrypt(payload);\r\n let time = performance.now() - startTime;\r\n\r\n try {\r\n startTime = performance.now();\r\n let arr = this.encNew.encrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n let time2 = performance.now() - startTime;\r\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.dec.encrypt(payload);\r\n\r\n try {\r\n let arr = this.decNew.decrypt(payload);\r\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\r\n let resNew = new Uint8Array(bytesFromWordss(arr));\r\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\r\n } catch(err) {\r\n console.error('Obfuscation: error:', err);\r\n }\r\n \r\n return res;\r\n } */\r\n public encode(payload: Uint8Array) {\r\n return this.encNew.update(payload);\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n return this.decNew.update(payload);\r\n }\r\n /* public encode(payload: Uint8Array) {\r\n let res = this.encNew.encrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n }\r\n\r\n public decode(payload: Uint8Array) {\r\n let res = this.decNew.decrypt(payload);\r\n let bytes = new Uint8Array(bytesFromWordss(res));\r\n \r\n return bytes;\r\n } */\r\n}","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { Codec } from \"./codec\";\r\n\r\nexport class IntermediatePacketCodec implements Codec {\r\n public tag = 0xee;\r\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\r\n\r\n //private lol = 0;\r\n\r\n public encodePacket(data: Uint8Array) {\r\n if((data.length % 4) !== 0) {\r\n console.error('Encode error!', data.length, data);\r\n }\r\n\r\n const len = data.length;\r\n const header = new Uint8Array(new Int32Array([/* ++this.lol >= 25 ? 0x80000001 : */len]).buffer);\r\n\r\n //console.log('got nobody cause im braindead', header, len, /* data, */data.buffer.byteLength === data.length);\r\n return header.concat(data);\r\n }\r\n\r\n public readPacket(data: Uint8Array) {\r\n const length = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);\r\n\r\n return data.slice(4, 4 + length);\r\n }\r\n}\r\n\r\nexport default new IntermediatePacketCodec();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport enum ConnectionStatus {\r\n Connected,\r\n Connecting,\r\n Closed,\r\n TimedOut\r\n};\r\n\r\nexport type ConnectionStatusChange = {\r\n _: 'networkerStatus', \r\n status: ConnectionStatus,\r\n dcId: number,\r\n name: string,\r\n isFileNetworker: boolean,\r\n isFileDownload: boolean,\r\n isFileUpload: boolean,\r\n retryAt?: number\r\n};\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from \"../../../config/modes\";\nimport { logger, LogTypes } from \"../../logger\";\nimport MTPNetworker from \"../networker\";\nimport Obfuscation from \"./obfuscation\";\nimport MTTransport, { MTConnection, MTConnectionConstructable } from \"./transport\";\nimport intermediatePacketCodec from './intermediate';\nimport { ConnectionStatus } from \"../connectionStatus\";\n\n \nimport transportController from \"./controller\";\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = intermediatePacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n\n //private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(private Connection: MTConnectionConstructable, \n private dcId: number, \n private url: string, \n private logSuffix: string, \n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n \n this.connect();\n }\n\n private onOpen = () => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = this.obfuscation.init(this.codec);\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n } else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n }\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = (buffer: ArrayBuffer) => {\n let data = this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n //this.pending = this.pending.filter(p => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then(response => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n //this.releasePending();\n }).catch(err => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n //this.dd();\n return;\n }\n\n //console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', data.hex);\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n \n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n \n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = self.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n \n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n this.pending.forEach(pending => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n //this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n //this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = this.connected ? this.encodeBody(body) : undefined;\n\n //return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private releasePending(/* tt = false */) {\n if(!this.connected) {\n //this.connect();\n return;\n }\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n //this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n //for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n const {body, bodySent} = pending;\n let encoded = pending.encoded;\n if(body && !bodySent) {\n\n //this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n if(!encoded) {\n encoded = pending.encoded = this.encodeBody(body);\n }\n\n this.connection.send(encoded);\n \n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n //delete pending.body;\n }\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { notifyAll } from \"../../../helpers/context\";\r\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\r\nimport { WorkerTaskVoidTemplate } from \"../../../types\";\r\nimport { MTConnection } from \"./transport\";\r\n\r\nlet socketId = 0;\r\nexport interface SocketProxyTask extends WorkerTaskVoidTemplate {\r\n type: 'socketProxy',\r\n payload: SocketProxySetupTask | SocketProxySendTask | SocketProxyCloseTask\r\n};\r\n\r\nexport interface SocketProxySetupTask extends WorkerTaskVoidTemplate {\r\n type: 'setup',\r\n payload: {\r\n dcId: number,\r\n url: string,\r\n logSuffix: string\r\n },\r\n id: number\r\n};\r\n\r\nexport interface SocketProxySendTask extends WorkerTaskVoidTemplate {\r\n type: 'send',\r\n payload: Uint8Array,\r\n id: number\r\n};\r\n\r\nexport interface SocketProxyCloseTask extends WorkerTaskVoidTemplate {\r\n type: 'close',\r\n id: number\r\n};\r\n\r\n \r\nexport default class SocketProxied extends EventListenerBase<{\r\n open: () => void,\r\n message: (buffer: ArrayBuffer) => any,\r\n close: () => void,\r\n}> implements MTConnection {\r\n private id: number;\r\n\r\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\r\n super();\r\n this.id = ++socketId;\r\n socketsProxied.set(this.id, this);\r\n\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'setup', \r\n payload: {\r\n dcId, \r\n url,\r\n logSuffix\r\n },\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public send(payload: Uint8Array) {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy', \r\n payload: {\r\n type: 'send',\r\n payload,\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n\r\n public close() {\r\n const task: SocketProxyTask = {\r\n type: 'socketProxy',\r\n payload: {\r\n type: 'close',\r\n id: this.id\r\n }\r\n };\r\n\r\n notifyAll(task);\r\n }\r\n}\r\n \r\n\r\nexport const socketsProxied: Map = new Map();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport MTTransport, { MTConnectionConstructable } from './transports/transport';\r\nimport Modes from '../../config/modes';\r\nimport { indexOfAndSplice } from '../../helpers/array';\r\nimport App from '../../config/app';\r\n\r\n \r\nimport HTTP from './transports/http';\r\n \r\n\r\n \r\nimport Socket from './transports/websocket';\r\nimport TcpObfuscated from './transports/tcpObfuscated';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport { IS_WEB_WORKER } from '../../helpers/context';\r\nimport SocketProxied from './transports/socketProxied';\r\nimport { DcId } from '../../types';\r\n \r\n\r\nexport type TransportType = 'websocket' | 'https' | 'http';\r\nexport type ConnectionType = 'client' | 'download' | 'upload';\r\ntype Servers = {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTTransport[]\r\n }\r\n }\r\n};\r\n\r\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\r\n\r\nexport class DcConfigurator {\r\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\r\n\r\n private dcOptions = Modes.test\r\n ? [\r\n {id: 1, host: '149.154.175.10', port: 80},\r\n {id: 2, host: '149.154.167.40', port: 80},\r\n {id: 3, host: '149.154.175.117', port: 80}\r\n ]\r\n : [\r\n {id: 1, host: '149.154.175.50', port: 80},\r\n {id: 2, host: '149.154.167.50', port: 80},\r\n {id: 3, host: '149.154.175.100', port: 80},\r\n {id: 4, host: '149.154.167.91', port: 80},\r\n {id: 5, host: '149.154.171.5', port: 80}\r\n ];\r\n\r\n public chosenServers: Servers = {} as any;\r\n\r\n \r\n private transportSocket = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n const path = 'apiws' + TEST_SUFFIX;\r\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n\r\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\r\n\r\n const oooohLetMeLive: MTConnectionConstructable = (IS_SAFARI && IS_WEB_WORKER && typeof(SocketProxied) !== 'undefined') /* || true */ ? SocketProxied : Socket;\r\n\r\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\r\n };\r\n \r\n\r\n \r\n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, suffix: string) => {\r\n let chosenServer: string;\r\n if(Modes.ssl || !Modes.http) {\r\n const subdomain = this.sslSubdomains[dcId - 1] + (connectionType !== 'client' ? '-1' : '');\r\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\r\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\r\n } else {\r\n for(let dcOption of this.dcOptions) {\r\n if(dcOption.id === dcId) {\r\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\r\n return new HTTP(dcId, chosenServer, logSuffix);\r\n };\r\n \r\n\r\n public chooseServer(\r\n dcId: DcId, \r\n connectionType: ConnectionType = 'client', \r\n transportType: TransportType = Modes.transport, \r\n reuse = true\r\n ) {\r\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\r\n connectionType = 'client';\r\n } */\r\n\r\n if(!this.chosenServers.hasOwnProperty(transportType)) {\r\n this.chosenServers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const servers = this.chosenServers[transportType][connectionType];\r\n\r\n if(!(dcId in servers)) {\r\n servers[dcId] = [];\r\n }\r\n\r\n const transports = servers[dcId];\r\n\r\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\r\n let transport: MTTransport;\r\n\r\n const suffix = connectionType === 'client' ? '' : '-1';\r\n\r\n \r\n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, suffix);\r\n \r\n \r\n \r\n \r\n \r\n \r\n if(!transport) {\r\n console.error('No chosenServer!', dcId);\r\n return null;\r\n }\r\n \r\n if(reuse) {\r\n transports.push(transport);\r\n }\r\n \r\n return transport;\r\n }\r\n \r\n return transports[0];\r\n }\r\n \r\n public static removeTransport(obj: any, transport: T) {\r\n for(const transportType in obj) {\r\n // @ts-ignore\r\n for(const connectionType in obj[transportType]) {\r\n // @ts-ignore\r\n for(const dcId in obj[transportType][connectionType]) {\r\n // @ts-ignore\r\n const transports: T[] = obj[transportType][connectionType][dcId];\r\n indexOfAndSplice(transports, transport);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new DcConfigurator();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from \"../../../config/app\";\nimport { deferredPromise } from \"../../../helpers/cancellablePromise\";\nimport EventListenerBase from \"../../../helpers/eventListenerBase\";\nimport { pause } from \"../../../helpers/schedulers/pause\";\nimport dcConfigurator, { TransportType } from \"../dcConfigurator\";\nimport type HTTP from \"./http\";\nimport type TcpObfuscated from \"./tcpObfuscated\";\nimport MTTransport from \"./transport\";\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n setTimeout(() => {\n this.waitForWebSocket();\n }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => websocketPromise.resolve(false), timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n \n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { pause } from '../../../helpers/schedulers/pause';\r\nimport { DcId } from '../../../types';\r\nimport { logger, LogTypes } from '../../logger';\r\nimport type MTPNetworker from '../networker';\r\nimport MTTransport from './transport';\r\nimport Modes from '../../../config/modes';\r\n\r\n \r\nimport transportController from './controller';\r\n \r\n\r\nexport default class HTTP implements MTTransport {\r\n public networker: MTPNetworker;\r\n private log: ReturnType;\r\n\r\n private pending: Array<{\r\n resolve: (body: Uint8Array) => void, \r\n reject: any, \r\n body: Uint8Array\r\n }> = [];\r\n private releasing: boolean;\r\n\r\n public connected: boolean;\r\n private destroyed: boolean;\r\n private debug: boolean;\r\n \r\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\r\n this.debug = Modes.debug && false;\r\n\r\n let logTypes = LogTypes.Error | LogTypes.Log;\r\n if(this.debug) logTypes |= LogTypes.Debug;\r\n \r\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\r\n this.log('constructor');\r\n\r\n this.connected = false;\r\n }\r\n\r\n public _send(body: Uint8Array, mode?: RequestMode) {\r\n this.debug && this.log.debug('-> body length to send:', body.length);\r\n\r\n return fetch(this.url, {method: 'POST', body, mode}).then(response => {\r\n if(response.status !== 200 && !mode) {\r\n response.arrayBuffer().then(buffer => {\r\n this.log.error('not 200', \r\n new TextDecoder(\"utf-8\").decode(new Uint8Array(buffer)));\r\n });\r\n\r\n throw response;\r\n }\r\n\r\n this.setConnected(true);\r\n\r\n // * test resending by dropping random request\r\n // if(Math.random() > .5) {\r\n // throw 'asd';\r\n // }\r\n\r\n return response.arrayBuffer().then(buffer => {\r\n return new Uint8Array(buffer);\r\n }); \r\n }, (err) => {\r\n this.setConnected(false);\r\n throw err;\r\n });\r\n }\r\n\r\n private setConnected(connected: boolean) {\r\n if(this.connected === connected || this.destroyed) {\r\n return;\r\n }\r\n\r\n this.connected = connected;\r\n\r\n \r\n transportController.setTransportValue('https', connected);\r\n \r\n }\r\n\r\n public destroy() {\r\n this.setConnected(false);\r\n this.destroyed = true;\r\n this.pending.forEach(pending => pending.reject());\r\n this.pending.length = 0;\r\n }\r\n\r\n public send(body: Uint8Array) {\r\n if(this.networker) {\r\n return this._send(body);\r\n } else {\r\n const promise = new Promise((resolve, reject) => {\r\n this.pending.push({resolve, reject, body});\r\n });\r\n\r\n this.releasePending();\r\n\r\n return promise;\r\n }\r\n }\r\n\r\n private async releasePending() {\r\n if(this.releasing) return;\r\n\r\n this.releasing = true;\r\n // this.log('-> messages to send:', this.pending.length);\r\n for(let i = 0; i < this.pending.length; ++i) {\r\n const pending = this.pending[i];\r\n const {body, resolve} = pending;\r\n\r\n try {\r\n const result = await this._send(body);\r\n resolve(result);\r\n this.pending.splice(i, 1);\r\n } catch(err) {\r\n this.log.error('Send plain request error:', err);\r\n await pause(5000);\r\n }\r\n\r\n --i;\r\n }\r\n\r\n this.releasing = false;\r\n }\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {isObject, sortLongsArray} from './bin_utils';\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoworker';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport timeManager from './timeManager';\nimport networkerFactory from './networkerFactory';\nimport { logger, LogTypes } from '../logger';\nimport { InvokeApiOptions } from '../../types';\nimport { longToBytes } from '../crypto/crypto_utils';\nimport MTTransport from './transports/transport';\nimport { convertToUint8Array, bytesCmp, bytesToHex, bufferConcats } from '../../helpers/bytes';\nimport { nextRandomUint, randomLong } from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport { bigInt2str, rightShift_, str2bigInt } from '../../vendor/leemon';\nimport { forEachReverse } from '../../helpers/array';\nimport { ConnectionStatus } from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport dcConfigurator, { DcConfigurator } from './dcConfigurator';\n\n//console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n \n notContentRelated: true, // ACK\n noSchedule: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: {\n resolve: any,\n reject: any\n },\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst CONNECTION_TIMEOUT = 5000;\nconst DRAIN_TIMEOUT = 10000;\nlet invokeAfterMsgConstructor: number;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResends: Array = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n \n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n req_msg_id: MTLong,\n resend_msg_ids: Array\n } | null = null;\n\n private name: string;\n private log: ReturnType;\n \n public isOnline = false;\n public status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n //private disconnectDelay: number;\n //private pingPromise: CancellablePromise;\n //public onConnectionStatusChange: (online: boolean) => void;\n\n //private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n constructor(\n public dcId: number, \n private authKey: Uint8Array, \n private authKeyId: Uint8Array,\n serverSalt: Uint8Array, \n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n //this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name, LogTypes.Log | LogTypes.Debug | LogTypes.Error | LogTypes.Warn, undefined);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n\n // * handle outcoming dead socket, server will close the connection\n // if((this.transport as TcpObfuscated).networker) {\n // this.disconnectDelay = /* (this.transport as TcpObfuscated).retryTimeout */75;\n // //setInterval(this.sendPingDelayDisconnect, (this.disconnectDelay - 5) * 1000);\n // this.sendPingDelayDisconnect();\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = new Uint8Array(8).randomize();\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n \n sentMessage.msg_id = timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n \n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n \n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n \n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n \n serializer.storeMethod(method, params);\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n \n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n \n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n \n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n \n if(!this.connectionInited) { // this will call once for each new session\n ///////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find(m => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n \n const initConnection = Schema.API.methods.find(m => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n \n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(networkerFactory.userAgent || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(networkerFactory.language, 'lang_code');\n //serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n \n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find(m => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n \n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n \n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n \n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n \n const messageId = timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n \n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n \n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, this.transport);\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n if(transport.connected && (transport as TcpObfuscated).connection) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n this.resend();\n }\n\n public destroy() {\n this.changeTransport();\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).handleClose();\n // }\n\n // return;\n // }\n\n // this.log('sendPingDelayDisconnect', this.sentPingTimes);\n\n // /* if(this.tt) clearTimeout(this.tt);\n // this.tt = self.setTimeout(() => { \n // (this.transport as any).ws.close(1000);\n // this.tt = 0;\n // }, this.disconnectDelay * 1000); */\n // /* this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {\n // noResponse: true,\n // notContentRelated: true\n // }); */\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // /* if(!this.sentPingTimes || true) {\n // ++this.sentPingTimes; */\n // const startTime = Date.now();\n // this.wrapMtpCall('ping', {\n // ping_id: randomLong()\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n // //}\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // (this.transport as Socket).handleClose();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n // private sendPingDelayDisconnect = () => {\n // if(this.pingPromise || true) return;\n\n // /* if(!this.isOnline) {\n // if((this.transport as TcpObfuscated).connected) {\n // (this.transport as TcpObfuscated).connection.close();\n // }\n\n // return;\n // } */\n\n // const deferred = this.pingPromise = deferredPromise();\n\n // const timeoutTime = this.disconnectDelay * 1000;\n\n // const startTime = Date.now();\n // this.wrapMtpCall('ping_delay_disconnect', {\n // ping_id: randomLong(),\n // disconnect_delay: this.disconnectDelay\n // }, {}).then(pong => {\n // const elapsedTime = Date.now() - startTime;\n // this.log('sendPingDelayDisconnect: response', pong, elapsedTime > timeoutTime);\n\n // if(elapsedTime > timeoutTime) {\n // deferred.reject();\n // } else {\n // setTimeout(deferred.resolve, timeoutTime - elapsedTime);\n // }\n // }, deferred.reject).finally(() => {\n // clearTimeout(rejectTimeout);\n // //--this.sentPingTimes;\n // });\n\n // const rejectTimeout = self.setTimeout(deferred.reject, timeoutTime);\n\n // deferred.catch(() => {\n // this.log.error('sendPingDelayDisconnect: catch, closing connection if exists');\n // (this.transport as TcpObfuscated).connection.close();\n // });\n\n // deferred.finally(() => {\n // this.pingPromise = null;\n // this.sendPingDelayDisconnect();\n // });\n // };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n //this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n //this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n //console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n \n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n \n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n \n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n \n const pingMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n \n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n \n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n \n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n \n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n \n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n \n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n noResponseMsgs.forEach((msgId) => {\n if(this.sentMessages[msgId]) {\n const deferred = this.sentMessages[msgId].deferred;\n delete this.sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n const promise = new Promise((resolve, reject) => {\n this.sentMessages[message.msg_id] = Object.assign(message, options, options.notContentRelated \n ? undefined \n : {\n deferred: {resolve, reject}\n }\n );\n\n //this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n \n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n });\n\n if(!options.notContentRelated && !options.noResponse) {\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < CONNECTION_TIMEOUT) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then(bytes => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, CONNECTION_TIMEOUT);\n \n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n --this.activeRequests;\n this.setDrainTimeout();\n });\n \n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n\n return promise;\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(networkerFactory.onConnectionStatusChange) {\n networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n // if((this.transport as TcpObfuscated).networker) {\n // this.sendPingDelayDisconnect();\n // }\n /* this.sentPingTimes = 0;\n this.sendPingDelayDisconnect(); */\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n \n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n \n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256-hash', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n \n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2aText));\n \n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256-hash', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n \n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n \n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n \n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n // this.log('scheduled', this.dcId, this.iii)\n\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n \n if(this.pendingResends.length) {\n const resendMsgIds = this.pendingResends.slice();\n const resendOpts: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true,\n messageId: '' // will set in wrapMtpMessage->pushMessage\n };\n\n //this.log('resendReq messages', resendMsgIds);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: resendMsgIds\n }, resendOpts);\n\n this.lastResendReq = {\n req_msg_id: resendOpts.messageId,\n resend_msg_ids: resendMsgIds\n };\n }\n \n let outMessage: MTPNetworker['sentMessages'][keyof MTPNetworker['sentMessages']];\n const messages: typeof outMessage[] = [];\n \n //const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n //const value = this.pendingMessages[messageId];\n\n //if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n //}\n }\n \n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n \n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n \n \n const noResponseMsgs: Array = messages.filter(message => message.noResponse).map(message => message.msg_id);\n \n \n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n \n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n \n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n \n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message),\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n \n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n \n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */new Uint8Array(paddingLength).randomize()/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157, \n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150, \n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n //(message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n \n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private sendEncryptedRequest(message: MTMessage) {\n return this.getEncryptedOutput(message).then(requestData => {\n this.debug && this.log.debug('sendEncryptedRequest: launching message into space:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport.send(requestData) as any;\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n \n \n \n \n \n \n if(!(this.transport instanceof HTTP)) return promise;\n \n \n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n transport: this.transport\n };\n \n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n \n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n });\n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n //const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n \n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + authKeyId.hex);\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n \n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n \n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n \n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n \n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n //this.updateSession();\n //this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n \n const seqNo = deserializer.fetchInt('seq_no');\n \n const totalLength = dataWithPadding.byteLength;\n \n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n \n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n \n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n \n //let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true, \n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n \n const offset = deserializer.getOffset();\n \n //self.log('mt_message!!!!!', result, field);\n \n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n \n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n \n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n \n result.result = deserializer.fetchObject(type, field + '[result]');\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n //this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n \n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n \n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой) \n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n //this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n \n //this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n \n //const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n //this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n //this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = self.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n \n private reqResendMessage(msgId: MTLong) {\n if(this.debug) {\n this.log.debug('Req resend', msgId);\n }\n\n this.pendingResends.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n // this.log('clean start', this.dcId/*, this.sentMessages*/)\n Object.keys(this.sentMessages).forEach((msgId) => {\n const message = this.sentMessages[msgId];\n \n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete this.sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(this.sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], this.sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete this.sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n \n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n //delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}) {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n \n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n for(const id in this.sentMessages) {\n const msg = this.sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then(res => {\n this.log('status', res);\n });\n } */\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n /* if(this.debug) {\n this.log('process message', message, messageId, sessionId);\n } */\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n \n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n \n this.ackMessage(messageId);\n \n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n \n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n //const changedOffset = timeManager.applyServerTime(bigStringInt(messageId).shiftRight(32).toString(10));\n const bigInt = str2bigInt(messageId, 10);\n rightShift_(bigInt, 32);\n const changedOffset = timeManager.applyServerTime(+bigInt2str(bigInt, 10));\n if(message.error_code === 17 || changedOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n //this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n \n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n \n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n //this.updateSession();\n \n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n \n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && networkerFactory.updatesProcessor) {\n networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n \n case 'msgs_ack': {\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n \n case 'msg_detailed_info':\n if(!this.sentMessages[message.msg_id]) {\n this.ackMessage(message.answer_msg_id);\n break;\n }\n case 'msg_new_detailed_info':\n if(this.pendingAcks.indexOf(message.answer_msg_id)) {\n break;\n }\n this.reqResendMessage(message.answer_msg_id);\n break;\n \n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n if(this.lastResendReq && \n this.lastResendReq.req_msg_id === message.req_msg_id && \n this.pendingResends.length\n ) {\n for(const badMsgId of this.lastResendReq.resend_msg_ids) {\n const pos = this.pendingResends.indexOf(badMsgId);\n if(pos !== -1) {\n this.pendingResends.splice(pos, 1);\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n \n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n /* if(DEBUG) {\n this.log.debug('Rpc response', message.result, sentMessage);\n } */\n\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n ////this.log('Rpc set connectionInited to:', this.connectionInited);\n }\n }\n \n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId]; \n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n }\n\n break;\n }\n \n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n \n if(networkerFactory.updatesProcessor !== null) {\n networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ConnectionStatusChange } from \"./connectionStatus\";\r\nimport MTPNetworker from \"./networker\";\r\nimport { InvokeApiOptions } from \"../../types\";\r\nimport App from \"../../config/app\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport { indexOfAndSplice } from \"../../helpers/array\";\r\n\r\nexport class NetworkerFactory {\r\n private networkers: MTPNetworker[] = [];\r\n public language = navigator.language || App.langPackCode;\r\n public updatesProcessor: (obj: any) => void = null;\r\n public onConnectionStatusChange: (info: ConnectionStatusChange) => void = null;\r\n public akStopped = false;\r\n public userAgent = navigator.userAgent;\r\n\r\n public removeNetworker(networker: MTPNetworker) {\r\n indexOfAndSplice(this.networkers, networker);\r\n }\r\n\r\n public setUpdatesProcessor(callback: (obj: any) => void) {\r\n this.updatesProcessor = callback;\r\n }\r\n\r\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\r\n //console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\r\n const networker = new MTPNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n this.networkers.push(networker);\r\n return networker;\r\n }\r\n\r\n public startAll() {\r\n if(this.akStopped) {\r\n const stoppedNetworkers = this.networkers.filter(networker => networker.isStopped());\r\n\r\n this.akStopped = false;\r\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\r\n \r\n for(const networker of stoppedNetworkers) {\r\n networker.scheduleRequest();\r\n }\r\n }\r\n }\r\n\r\n public stopAll() {\r\n this.akStopped = true;\r\n }\r\n\r\n public setLanguage(langCode: string) {\r\n this.language = langCode;\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.connectionInited = false;\r\n }\r\n }\r\n }\r\n\r\n public forceReconnectTimeout() {\r\n for(const networker of this.networkers) {\r\n networker.forceReconnectTimeout();\r\n }\r\n }\r\n\r\n public forceReconnect() {\r\n for(const networker of this.networkers) {\r\n if(!networker.isFileNetworker) {\r\n networker.forceReconnect();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst networkerFactory = new NetworkerFactory();\r\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.networkerFactory = networkerFactory);\r\nexport default networkerFactory;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { TLSerialization } from \"./tl_utils\";\r\nimport CryptoWorker from '../crypto/cryptoworker';\r\nimport { bytesFromHex, bytesToHex } from \"../../helpers/bytes\";\r\nimport { bigInt2str, str2bigInt } from \"../../vendor/leemon\";\r\nimport Modes from \"../../config/modes\";\r\n\r\nexport type RSAPublicKeyHex = {\r\n modulus: string,\r\n exponent: string\r\n};\r\n\r\nexport class RSAKeysManager {\r\n\r\n /**\r\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\r\n * \r\n * \r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\r\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\r\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\r\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\r\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\r\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * -----BEGIN RSA PUBLIC KEY-----\r\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\r\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\r\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\r\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\r\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\r\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\r\n * -----END RSA PUBLIC KEY-----\r\n *\r\n * Bytes can be got via \r\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\r\n * $ openssl rsa -pubin -in pub.pem -text -noout\r\n */\r\n\r\n /* private publisKeysHex = [{\r\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\r\n exponent: '010001'\r\n }, {\r\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\r\n exponent: '010001'\r\n }]; */\r\n\r\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\r\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\r\n exponent: '010001'\r\n }];\r\n\r\n private publisKeysHex: RSAPublicKeyHex[] = [{\r\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\r\n exponent: '010001'\r\n }];\r\n\r\n private publicKeysParsed: {\r\n [hex: string]: RSAPublicKeyHex\r\n } = {};\r\n private prepared = false;\r\n private preparePromise: Promise = null;\r\n\r\n constructor() {\r\n if(Modes.test) {\r\n this.publisKeysHex = this.testPublicKeysHex;\r\n }\r\n }\r\n\r\n public prepare(): Promise {\r\n if(this.preparePromise) return this.preparePromise;\r\n else if(this.prepared) {\r\n return Promise.resolve();\r\n }\r\n\r\n return this.preparePromise = Promise.all(this.publisKeysHex.map(keyParsed => {\r\n const RSAPublicKey = new TLSerialization();\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\r\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\r\n\r\n const buffer = RSAPublicKey.getBuffer();\r\n\r\n return CryptoWorker.invokeCrypto('sha1-hash', buffer).then(bytes => {\r\n const fingerprintBytes = bytes.slice(-8);\r\n fingerprintBytes.reverse();\r\n \r\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\r\n modulus: keyParsed.modulus,\r\n exponent: keyParsed.exponent\r\n };\r\n });\r\n })).then(() => {\r\n this.prepared = true;\r\n\r\n //console.log('[MT] Prepared keys');\r\n this.preparePromise = null;\r\n });\r\n }\r\n\r\n public async select(fingerprints: Array) {\r\n await this.prepare();\r\n\r\n for(let i = 0; i < fingerprints.length; ++i) {\r\n //fingerprintHex = bigStringInt(fingerprints[i]).toString(16);\r\n let fingerprintHex = bigInt2str(str2bigInt(fingerprints[i], 10), 16).toLowerCase();\r\n\r\n if(fingerprintHex.length < 16) {\r\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\r\n }\r\n\r\n //console.log(fingerprintHex, this.publicKeysParsed);\r\n const foundKey = this.publicKeysParsed[fingerprintHex];\r\n if(foundKey) {\r\n return Object.assign({\r\n fingerprint: fingerprints[i]\r\n }, foundKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default new RSAKeysManager();\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n * \n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport { TLSerialization, TLDeserialization } from \"./tl_utils\";\nimport dcConfigurator, { TransportType } from \"./dcConfigurator\";\nimport rsaKeysManager from \"./rsaKeysManager\";\nimport timeManager from \"./timeManager\";\n\nimport CryptoWorker from \"../crypto/cryptoworker\";\n\nimport { logger, LogTypes } from \"../logger\";\nimport { bytesCmp, bytesToHex, bytesFromHex, bytesXor } from \"../../helpers/bytes\";\nimport DEBUG from \"../../config/debug\";\nimport { cmp, int2bigInt, one, pow, str2bigInt, sub } from \"../../vendor/leemon\";\nimport { addPadding } from \"./bin_utils\";\nimport { Awaited, DcId } from \"../../types\";\nimport { ApiError } from \"./apiManager\";\n\n \nimport transportController from \"./transports/controller\";\n \n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n \n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n \n // good\n p?: Uint8Array,\n q?: Uint8Array,\n \n newNonce?: Uint8Array,\n \n retry?: number,\n \n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n \n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n \n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer {\n private cached: {\n [dcId: DcId]: Promise\n };\n \n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n \n constructor() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n \n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n \n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n \n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n \n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n \n const promise = transport.send(resultArray) as any as Promise;\n return promise.then(result => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n \n if(!result || !result.byteLength) {\n throw baseError;\n }\n \n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n \n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n \n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n \n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n \n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n \n throw error;\n });\n }\n \n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n \n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', auth.nonce.hex);\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n \n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n \n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n \n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n \n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n \n auth.publicKey = publicKey;\n \n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n \n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n \n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n \n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n \n return this.sendReqDhParams(auth);\n }\n \n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = new Uint8Array(32).randomize();\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n \n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = new Uint8Array(32).randomize();\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256-hash', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n \n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256-hash', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = str2bigInt(bytesToHex(keyAesEncrypted), 16);\n const publicKeyModulusBigInt = str2bigInt(auth.publicKey.modulus, 16);\n\n if(cmp(keyAesEncryptedBigInt, publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n \n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n \n const requestBytes = request.getBytes(true);\n \n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n \n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n \n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n \n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n \n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n \n throw new Error('[MT] server_DH_params_fail');\n }\n \n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n \n //console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n \n return this.sendSetClientDhParams(auth);\n }\n \n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n \n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n \n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1-hash', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n \n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n \n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n \n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n \n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n \n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n \n const offset = deserializer.getOffset();\n \n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1-hash', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1-hash mismatch');\n }\n \n timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n \n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n \n const _gABigInt = str2bigInt(bytesToHex(gA), 16);\n const _dhPrimeBigInt = str2bigInt(dhPrimeHex, 16);\n\n if(cmp(_gABigInt, one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n \n const _two = int2bigInt(2, 32, 0);\n const _twoPow = pow(_two, 2048 - 64);\n\n if(cmp(_gABigInt, _twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(cmp(_gABigInt, sub(_dhPrimeBigInt, _twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n \n return true;\n }\n \n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n \n auth.b = new Uint8Array(256).randomize();\n //MTProto.secureRandom.nextBytes(auth.b);\n \n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n \n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n \n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1-hash', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n \n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n \n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n \n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n \n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n \n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n \n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n \n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n \n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n \n const authKeyHash = await CryptoWorker.invokeCrypto('sha1-hash', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n \n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n \n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n \n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n \n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n \n return auth;\n }\n \n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n \n return this.sendSetClientDhParams(auth);\n }\n \n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1-hash', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n \n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n \n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId, \n nonce: new Uint8Array(16).randomize()\n };\n \n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n\nexport default new Authorizer();\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\r\nexport function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.addEventListener('loadend', (e) => resolve(e.target.result));\r\n reader[method](blob);\r\n });\r\n}\r\n\r\nexport function readBlobAsText(blob: Blob) {\r\n return readBlobAs(blob, 'readAsText');\r\n}\r\n\r\nexport function readBlobAsDataURL(blob: Blob) {\r\n return readBlobAs(blob, 'readAsDataURL');\r\n}\r\n\r\nexport function readBlobAsArrayBuffer(blob: Blob) {\r\n return readBlobAs(blob, 'readAsArrayBuffer');\r\n}\r\n\r\nexport function readBlobAsUint8Array(blob: Blob) {\r\n return readBlobAsArrayBuffer(blob).then(buffer => new Uint8Array(buffer));\r\n}\r\n\r\nexport function blobConstruct(blobParts: any, mimeType: string = ''): Blob {\r\n let blob;\r\n const safeMimeType = blobSafeMimeType(mimeType);\r\n try {\r\n blob = new Blob(blobParts, {type: safeMimeType});\r\n } catch(e) {\r\n // @ts-ignore\r\n let bb = new BlobBuilder;\r\n blobParts.forEach((blobPart: any) => {\r\n bb.append(blobPart);\r\n });\r\n blob = bb.getBlob(safeMimeType);\r\n }\r\n return blob;\r\n}\r\n\r\n// https://www.iana.org/assignments/media-types/media-types.xhtml\r\nexport function blobSafeMimeType(mimeType: string) {\r\n if([\r\n 'image/jpeg',\r\n 'image/png',\r\n 'image/gif',\r\n 'image/webp',\r\n 'image/bmp',\r\n 'video/mp4',\r\n 'video/webm',\r\n 'video/quicktime',\r\n 'audio/ogg',\r\n 'audio/mpeg',\r\n 'audio/mp4',\r\n 'application/json',\r\n 'application/pdf'\r\n ].indexOf(mimeType) === -1) {\r\n return 'application/octet-stream';\r\n }\r\n\r\n return mimeType;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { Database } from '../config/databases';\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport { safeAssign } from '../helpers/object';\r\nimport { logger } from './logger';\r\n\r\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\r\n */\r\nexport type IDBIndex = {\r\n indexName: string,\r\n keyPath: string,\r\n objectParameters: IDBIndexParameters\r\n};\r\n\r\nexport type IDBStore = {\r\n name: string, \r\n indexes?: IDBIndex[]\r\n};\r\n\r\nexport type IDBOptions = {\r\n name?: string,\r\n storeName: string,\r\n stores?: IDBStore[],\r\n version?: number\r\n};\r\n\r\nconst DEBUG = false;\r\n\r\nexport default class IDBStorage> {\r\n private static STORAGES: IDBStorage>[] = [];\r\n private openDbPromise: Promise;\r\n private db: IDBDatabase;\r\n private storageIsAvailable = true;\r\n\r\n private log: ReturnType;\r\n \r\n private name: string;\r\n private version: number;\r\n private stores: IDBStore[];\r\n private storeName: T['stores'][0]['name'];\r\n\r\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\r\n safeAssign(this, db);\r\n\r\n if(Modes.test) {\r\n this.name += '_test';\r\n }\r\n\r\n this.storeName = storeName;\r\n\r\n this.log = logger('IDB-' + this.storeName);\r\n\r\n this.openDatabase(true);\r\n\r\n IDBStorage.STORAGES.push(this);\r\n }\r\n\r\n public static closeDatabases(preserve?: IDBStorage>) {\r\n this.STORAGES.forEach(storage => {\r\n if(preserve && preserve === storage) {\r\n return;\r\n }\r\n\r\n const db = storage.db;\r\n if(db) {\r\n db.onclose = () => {};\r\n db.close();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * ! WARNING ! function requires at least one opened connection\r\n */\r\n /* public static clearObjectStores() {\r\n const storage = this.STORAGES[0];\r\n this.closeDatabases(storage);\r\n\r\n const names = Array.from(storage.db.objectStoreNames);\r\n const promises = names.map(name => storage.clear(name));\r\n return Promise.all(promises);\r\n } */\r\n\r\n /* public static deleteDatabase() {\r\n this.closeDatabases();\r\n\r\n const storages = this.STORAGES;\r\n const dbNames = Array.from(new Set(storages.map(storage => storage.name)));\r\n const promises = dbNames.map(dbName => {\r\n return new Promise((resolve, reject) => {\r\n const deleteRequest = indexedDB.deleteDatabase(dbName);\r\n \r\n deleteRequest.onerror = () => {\r\n reject();\r\n };\r\n \r\n deleteRequest.onsuccess = () => {\r\n resolve();\r\n };\r\n });\r\n });\r\n\r\n return Promise.all(promises);\r\n } */\r\n\r\n public isAvailable() {\r\n return this.storageIsAvailable;\r\n }\r\n\r\n public openDatabase(createNew = false): Promise {\r\n if(this.openDbPromise && !createNew) {\r\n return this.openDbPromise;\r\n }\r\n\r\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\r\n const os = db.createObjectStore(store.name);\r\n\r\n if(store.indexes?.length) {\r\n for(const index of store.indexes) {\r\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\r\n }\r\n }\r\n };\r\n\r\n try {\r\n var request = indexedDB.open(this.name, this.version);\r\n\r\n if(!request) {\r\n return Promise.reject();\r\n }\r\n } catch(error) {\r\n this.log.error('error opening db', (error as Error).message);\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n let finished = false;\r\n setTimeout(() => {\r\n if(!finished) {\r\n request.onerror({type: 'IDB_CREATE_TIMEOUT'} as Event);\r\n }\r\n }, 3000);\r\n\r\n return this.openDbPromise = new Promise((resolve, reject) => {\r\n request.onsuccess = (event) => {\r\n finished = true;\r\n const db = request.result;\r\n let calledNew = false;\r\n\r\n this.log('Opened');\r\n \r\n db.onerror = (error) => {\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', error);\r\n reject(error);\r\n };\r\n\r\n db.onclose = (e) => {\r\n this.log.error('closed:', e);\r\n !calledNew && this.openDatabase();\r\n };\r\n\r\n db.onabort = (e) => {\r\n this.log.error('abort:', e);\r\n const transaction = e.target as IDBTransaction;\r\n \r\n this.openDatabase(calledNew = true);\r\n\r\n if(transaction.onerror) {\r\n transaction.onerror(e);\r\n }\r\n\r\n db.close();\r\n };\r\n\r\n db.onversionchange = (e) => {\r\n this.log.error('onversionchange, lol?');\r\n };\r\n\r\n resolve(this.db = db);\r\n };\r\n \r\n request.onerror = (event) => {\r\n finished = true;\r\n this.storageIsAvailable = false;\r\n this.log.error('Error creating/accessing IndexedDB database', event);\r\n reject(event);\r\n };\r\n \r\n request.onupgradeneeded = (event) => {\r\n finished = true;\r\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\r\n\r\n // @ts-ignore\r\n var db = event.target.result as IDBDatabase;\r\n this.stores.forEach((store) => {\r\n /* if(db.objectStoreNames.contains(store.name)) {\r\n //if(event.oldVersion === 1) {\r\n db.deleteObjectStore(store.name);\r\n //}\r\n } */\r\n \r\n if(!db.objectStoreNames.contains(store.name)) {\r\n createObjectStore(db, store);\r\n }\r\n });\r\n };\r\n });\r\n }\r\n\r\n public delete(entryName: string | string[]): Promise {\r\n //return Promise.resolve();\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\r\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public clear(storeName?: IDBStorage['storeName']) {\r\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\r\n }\r\n\r\n public save(entryName: string | string[], value: any | any[]) {\r\n // const handleError = (error: Error) => {\r\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\r\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\r\n // setTimeout(() => {\r\n // this.save(entryName, value);\r\n // }, 2e3);\r\n // } else {\r\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\r\n // }\r\n // };\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n value = [].concat(value);\r\n }\r\n \r\n return this.getObjectStore('readwrite', (objectStore) => {\r\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\r\n }, DEBUG ? 'save: ' + entryName.join(', ') : '');\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct([blob]) as Blob;\r\n }\r\n\r\n return this.save(fileName, blob);\r\n }\r\n\r\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\r\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\r\n return Promise.reject();\r\n }\r\n\r\n if(!(blob instanceof Blob)) {\r\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\r\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\r\n return this.storagePutB64String(db, fileName, address).then(() => {\r\n return blob;\r\n });\r\n }\r\n\r\n try {\r\n var reader = new FileReader();\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n let promise = new Promise((resolve, reject) => {\r\n reader.onloadend = () => {\r\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\r\n resolve(blob);\r\n }, reject);\r\n }\r\n \r\n reader.onerror = reject;\r\n });\r\n \r\n\r\n try {\r\n reader.readAsDataURL(blob);\r\n } catch (e) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject();\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\r\n try {\r\n var objectStore = db.transaction([this.storeName], 'readwrite')\r\n .objectStore(this.storeName);\r\n var request = objectStore.put(b64string, fileName);\r\n } catch(error) {\r\n this.storageIsAvailable = false;\r\n return Promise.reject(error);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n resolve();\r\n };\r\n \r\n request.onerror = reject;\r\n });\r\n }\r\n\r\n public getBlobSize(blob: any) {\r\n return blob.size || blob.byteLength || blob.length;\r\n } */\r\n\r\n public get(entryName: string[]): Promise;\r\n public get(entryName: string): Promise;\r\n public get(entryName: string | string[]): Promise | Promise {\r\n //return Promise.reject();\r\n\r\n if(!Array.isArray(entryName)) {\r\n entryName = [].concat(entryName);\r\n }\r\n\r\n return this.getObjectStore('readonly', (objectStore) => {\r\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\r\n }, DEBUG ? 'get: ' + entryName.join(', ') : '');\r\n }\r\n\r\n private getObjectStore(mode: IDBTransactionMode, objectStore: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[], log?: string, storeName = this.storeName) {\r\n let perf: number;\r\n\r\n if(log) {\r\n perf = performance.now();\r\n this.log(log + ': start');\r\n }\r\n\r\n return this.openDatabase().then((db) => {\r\n return new Promise((resolve, reject) => {\r\n /* if(mode === 'readwrite') {\r\n return;\r\n } */\r\n\r\n const transaction = db.transaction([storeName], mode);\r\n\r\n transaction.onerror = (e) => {\r\n clearTimeout(timeout);\r\n reject(transaction.error);\r\n };\r\n \r\n transaction.oncomplete = (e) => {\r\n clearTimeout(timeout);\r\n\r\n if(log) {\r\n this.log(log + ': end', performance.now() - perf);\r\n }\r\n\r\n const results = r.map(r => r.result);\r\n resolve(isArray ? results : results[0]);\r\n };\r\n \r\n const timeout = setTimeout(() => {\r\n this.log.error('transaction not finished', transaction);\r\n }, 10000);\r\n \r\n /* transaction.addEventListener('abort', (e) => {\r\n //handleError();\r\n this.log.error('IndexedDB: transaction abort!', transaction.error);\r\n }); */\r\n \r\n const requests = objectStore(transaction.objectStore(storeName));\r\n\r\n const isArray = Array.isArray(requests);\r\n const r: IDBRequest[] = isArray ? requests : [].concat(requests) as any;\r\n\r\n // const length = r.length;\r\n // /* let left = length;\r\n\r\n // const onRequestFinished = (error?: Error) => {\r\n // if(!--left) {\r\n // resolve(result);\r\n // clearTimeout(timeout);\r\n // }\r\n // }; */\r\n\r\n // for(let i = 0; i < length; ++i) {\r\n // const request = r[i];\r\n // request.onsuccess = () => {\r\n // onRequestFinished();\r\n // };\r\n\r\n // request.onerror = (e) => {\r\n // onRequestFinished(transaction.error);\r\n // };\r\n // }\r\n });\r\n });\r\n }\r\n\r\n public getAll(): Promise {\r\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '');\r\n }\r\n\r\n /* public getAllKeys(): Promise> {\r\n console.time('getAllEntries');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.getAllKeys();\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var result = event.target.result;\r\n resolve(result);\r\n console.timeEnd('getAllEntries');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public isFileExists(fileName: string): Promise {\r\n console.time('isFileExists');\r\n return this.openDatabase().then((db) => {\r\n var objectStore = db.transaction([this.storeName], 'readonly')\r\n .objectStore(this.storeName);\r\n var request = objectStore.openCursor(fileName);\r\n\r\n return new Promise((resolve, reject) => {\r\n request.onsuccess = function(event) {\r\n // @ts-ignore\r\n var cursor = event.target.result;\r\n resolve(!!cursor);\r\n console.timeEnd('isFileExists');\r\n }\r\n \r\n request.onerror = reject;\r\n });\r\n });\r\n } */\r\n\r\n /* public getFileWriter(fileName: string, mimeType: string) {\r\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n } */\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nexport function copy(obj: T): T {\r\n //in case of premitives\r\n if(obj === null || typeof(obj) !== \"object\") {\r\n return obj;\r\n }\r\n \r\n //date objects should be \r\n if(obj instanceof Date) {\r\n return new Date(obj.getTime()) as any;\r\n }\r\n \r\n //handle Array\r\n if(Array.isArray(obj)) {\r\n // @ts-ignore\r\n const clonedArr: T = obj.map(el => copy(el)) as any as T;\r\n return clonedArr;\r\n }\r\n \r\n //lastly, handle objects\r\n // @ts-ignore\r\n let clonedObj = new obj.constructor();\r\n for(var prop in obj) {\r\n if(obj.hasOwnProperty(prop)) {\r\n clonedObj[prop] = copy(obj[prop]);\r\n }\r\n }\r\n return clonedObj;\r\n}\r\n\r\nexport function deepEqual(x: any, y: any): boolean {\r\n const ok = Object.keys, tx = typeof x, ty = typeof y;\r\n return x && y && tx === 'object' && tx === ty ? (\r\n ok(x).length === ok(y).length &&\r\n ok(x).every(key => deepEqual(x[key], y[key]))\r\n ) : (x === y);\r\n}\r\n\r\nexport function defineNotNumerableProperties(obj: T, names: (keyof T)[]) {\r\n //const perf = performance.now();\r\n const props = {writable: true, configurable: true};\r\n const out: {[name in keyof T]?: typeof props} = {};\r\n names.forEach(name => {\r\n if(!obj.hasOwnProperty(name)) {\r\n out[name] = props;\r\n }\r\n });\r\n Object.defineProperties(obj, out);\r\n //console.log('defineNotNumerableProperties time:', performance.now() - perf);\r\n}\r\n\r\nexport function getObjectKeysAndSort(object: {[key: string]: any}, sort: 'asc' | 'desc' = 'asc') {\r\n if(!object) return [];\r\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map(i => +i);\r\n if(sort === 'asc') return ids.sort((a, b) => a - b);\r\n else return ids.sort((a, b) => b - a);\r\n}\r\n\r\nexport function safeReplaceObject(wasObject: any, newObject: any) {\r\n if(!wasObject) {\r\n return newObject;\r\n }\r\n\r\n for(var key in wasObject) {\r\n if(!newObject.hasOwnProperty(key)) {\r\n delete wasObject[key];\r\n }\r\n }\r\n\r\n for(var key in newObject) {\r\n //if (newObject.hasOwnProperty(key)) { // useless\r\n wasObject[key] = newObject[key];\r\n //}\r\n }\r\n \r\n return wasObject;\r\n}\r\n\r\n/**\r\n * Will be used for FILE_REFERENCE_EXPIRED\r\n * @param key \r\n * @param wasObject \r\n * @param newObject \r\n */\r\nexport function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\r\n if('byteLength' in newObject[key]) { // Uint8Array\r\n newObject[key] = [...newObject[key]];\r\n }\r\n\r\n if(wasObject && wasObject[key] !== newObject[key]) {\r\n wasObject[key].length = newObject[key].length;\r\n (newObject[key] as any[]).forEach((v, i) => {\r\n wasObject[key][i] = v;\r\n });\r\n\r\n /* wasObject[key].set(newObject[key]); */\r\n newObject[key] = wasObject[key];\r\n }\r\n}\r\n\r\nexport function isObject>(object: any): object is T {\r\n return typeof(object) === 'object' && object !== null;\r\n}\r\n\r\nexport function getDeepProperty(object: any, key: string) {\r\n const splitted = key.split('.');\r\n let o: any = object;\r\n splitted.forEach(key => {\r\n if(!key) {\r\n return;\r\n }\r\n \r\n // @ts-ignore\r\n o = o[key];\r\n });\r\n \r\n return o;\r\n}\r\n\r\nexport function setDeepProperty(object: any, key: string, value: any) {\r\n const splitted = key.split('.');\r\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\r\n}\r\n\r\nexport function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\r\n for(const key in initObject) {\r\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\r\n currentObject[key] = copy(initObject[key]);\r\n onReplace && onReplace(previousKey || key);\r\n } else if(isObject(initObject[key])) {\r\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\r\n }\r\n }\r\n}\r\n\r\nexport function safeAssign(object: T, fromObject: any) {\r\n if(fromObject) {\r\n for(let i in fromObject) {\r\n if(fromObject[i] !== undefined) {\r\n // @ts-ignore\r\n object[i] = fromObject[i];\r\n }\r\n }\r\n }\r\n\r\n return object;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { UserAuth } from './mtproto_config';\r\nimport sessionStorage from '../sessionStorage';\r\nimport MTPNetworker, { MTMessage } from './networker';\r\nimport { isObject } from './bin_utils';\r\nimport networkerFactory from './networkerFactory';\r\n//import { telegramMeWebService } from './mtproto';\r\nimport authorizer from './authorizer';\r\nimport dcConfigurator, { ConnectionType, DcConfigurator, TransportType } from './dcConfigurator';\r\nimport { logger } from '../logger';\r\nimport type { DcAuthKey, DcId, DcServerSalt, InvokeApiOptions } from '../../types';\r\nimport type { MethodDeclMap } from '../../layer';\r\nimport { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';\r\nimport { bytesFromHex, bytesToHex } from '../../helpers/bytes';\r\n//import { clamp } from '../../helpers/number';\r\nimport { IS_SAFARI } from '../../environment/userAgent';\r\nimport App from '../../config/app';\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport IDBStorage from '../idb';\r\nimport CryptoWorker from \"../crypto/cryptoworker\";\r\nimport ctx from '../../environment/ctx';\r\nimport noop from '../../helpers/noop';\r\nimport Modes from '../../config/modes';\r\n\r\n \r\n \r\n \r\n\r\n \r\nimport transportController from './transports/controller';\r\n \r\n\r\n/* var networker = apiManager.cachedNetworkers.websocket.upload[2];\r\nnetworker.wrapMtpMessage({\r\n _: 'msgs_state_req',\r\n msg_ids: [\"6888292542796810828\"]\r\n}, {\r\n notContentRelated: true\r\n}).then(res => {\r\n console.log('status', res);\r\n}); */\r\n\r\n//console.error('apiManager included!');\r\n// TODO: если запрос словил флуд, нужно сохранять его параметры и возвращать тот же промис на новый такой же запрос, например - загрузка истории\r\n\r\nexport type ApiError = Partial<{\r\n code: number,\r\n type: string,\r\n description: string,\r\n originalError: any,\r\n stack: string,\r\n handled: boolean,\r\n input: string,\r\n message: ApiError\r\n}>;\r\n\r\n/* class RotatableArray {\r\n public array: Array = [];\r\n private lastIndex = -1;\r\n\r\n public get() {\r\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\r\n return this.array[this.lastIndex];\r\n }\r\n} */\r\n\r\nexport class ApiManager {\r\n private cachedNetworkers: {\r\n [transportType in TransportType]: {\r\n [connectionType in ConnectionType]: {\r\n [dcId: DcId]: MTPNetworker[]\r\n }\r\n }\r\n };\r\n \r\n private cachedExportPromise: {[x: number]: Promise};\r\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\r\n private baseDcId: DcId;\r\n \r\n //public telegramMeNotified = false;\r\n\r\n private log: ReturnType;\r\n\r\n private afterMessageTempIds: {\r\n [tempId: string]: {\r\n messageId: string,\r\n promise: Promise\r\n }\r\n };\r\n\r\n private transportType: TransportType;\r\n \r\n constructor() {\r\n this.log = logger('API');\r\n\r\n this.cachedNetworkers = {} as any;\r\n this.cachedExportPromise = {};\r\n this.gettingNetworkers = {};\r\n this.baseDcId = 0;\r\n this.afterMessageTempIds = {};\r\n\r\n this.transportType = Modes.transport;\r\n\r\n \r\n transportController.addEventListener('transport', (transportType) => {\r\n this.changeTransportType(transportType);\r\n });\r\n \r\n }\r\n\r\n //private lol = false;\r\n \r\n // constructor() {\r\n //MtpSingleInstanceService.start();\r\n \r\n /* AppStorage.get('dc').then((dcId) => {\r\n if(dcId) {\r\n this.baseDcId = dcId;\r\n }\r\n }); */\r\n // }\r\n \r\n /* public telegramMeNotify(newValue: boolean) {\r\n if(this.telegramMeNotified !== newValue) {\r\n this.telegramMeNotified = newValue;\r\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\r\n }\r\n } */\r\n\r\n private getTransportType(connectionType: ConnectionType) {\r\n \r\n \r\n \r\n \r\n \r\n // @ts-ignore\r\n const transportType: TransportType = this.transportType;\r\n \r\n\r\n return transportType;\r\n }\r\n\r\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\r\n for(const transportType in this.cachedNetworkers) {\r\n const connections = this.cachedNetworkers[transportType as TransportType];\r\n for(const connectionType in connections) {\r\n const dcs = connections[connectionType as ConnectionType];\r\n for(const dcId in dcs) {\r\n const networkers = dcs[dcId as any as DcId];\r\n networkers.forEach((networker, idx, arr) => {\r\n callback({\r\n networker,\r\n dcId: +dcId as DcId,\r\n connectionType: connectionType as ConnectionType,\r\n transportType: transportType as TransportType,\r\n index: idx,\r\n array: arr\r\n });\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\r\n return dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client');\r\n }\r\n\r\n public changeTransportType(transportType: TransportType) {\r\n const oldTransportType = this.transportType;\r\n if(oldTransportType === transportType) {\r\n return;\r\n }\r\n\r\n this.log('changing transport from', oldTransportType, 'to', transportType);\r\n\r\n const oldObject = this.cachedNetworkers[oldTransportType];\r\n const newObject = this.cachedNetworkers[transportType];\r\n this.cachedNetworkers[transportType] = oldObject;\r\n this.cachedNetworkers[oldTransportType] = newObject;\r\n\r\n this.transportType = transportType;\r\n\r\n for(const oldGetKey in this.gettingNetworkers) {\r\n const promise = this.gettingNetworkers[oldGetKey];\r\n delete this.gettingNetworkers[oldGetKey];\r\n\r\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\r\n this.gettingNetworkers[newGetKey] = promise;\r\n\r\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\r\n }\r\n\r\n this.iterateNetworkers((info) => {\r\n const transportType = this.getTransportType(info.connectionType);\r\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\r\n info.networker.changeTransport(transport);\r\n });\r\n }\r\n\r\n public async getBaseDcId() {\r\n if(this.baseDcId) {\r\n return this.baseDcId;\r\n }\r\n\r\n const baseDcId = await sessionStorage.get('dc');\r\n if(!this.baseDcId) {\r\n if(!baseDcId) {\r\n this.setBaseDcId(App.baseDcId);\r\n } else {\r\n this.baseDcId = baseDcId;\r\n }\r\n }\r\n\r\n return this.baseDcId;\r\n }\r\n \r\n public async setUserAuth(userAuth: UserAuth) {\r\n if(!userAuth.dcID) {\r\n const baseDcId = await this.getBaseDcId();\r\n userAuth.dcID = baseDcId;\r\n }\r\n\r\n sessionStorage.set({\r\n user_auth: userAuth\r\n });\r\n \r\n //this.telegramMeNotify(true);\r\n\r\n \r\n \r\n \r\n }\r\n\r\n public setBaseDcId(dcId: DcId) {\r\n const wasDcId = this.baseDcId;\r\n if(wasDcId) { // if migrated set ondrain\r\n this.getNetworker(wasDcId).then(networker => {\r\n this.setOnDrainIfNeeded(networker);\r\n });\r\n }\r\n\r\n this.baseDcId = dcId;\r\n\r\n sessionStorage.set({\r\n dc: this.baseDcId\r\n });\r\n }\r\n \r\n public async logOut() {\r\n const storageKeys: Array = [];\r\n \r\n const prefix = 'dc';\r\n for(let dcId = 1; dcId <= 5; dcId++) {\r\n storageKeys.push(prefix + dcId + '_auth_key' as any);\r\n }\r\n \r\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\r\n const storageResult = await Promise.all(storageKeys.map(key => sessionStorage.get(key)));\r\n \r\n const logoutPromises: Promise[] = [];\r\n for(let i = 0; i < storageResult.length; i++) {\r\n if(storageResult[i]) {\r\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\r\n }\r\n }\r\n\r\n const clear = () => {\r\n //console.error('apiManager: logOut clear');\r\n \r\n this.baseDcId = undefined;\r\n //this.telegramMeNotify(false);\r\n IDBStorage.closeDatabases();\r\n self.postMessage({type: 'clear'});\r\n };\r\n\r\n setTimeout(clear, 1e3);\r\n\r\n //return;\r\n \r\n return Promise.all(logoutPromises).catch((error) => {\r\n error.handled = true;\r\n }).finally(clear)/* .then(() => {\r\n location.pathname = '/';\r\n }) */;\r\n }\r\n\r\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\r\n return [dcId, transportType, connectionType].join('-');\r\n }\r\n \r\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\r\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\r\n //const connectionType: ConnectionType = 'client';\r\n\r\n const transportType = this.getTransportType(connectionType);\r\n if(!this.cachedNetworkers[transportType]) {\r\n this.cachedNetworkers[transportType] = {\r\n client: {},\r\n download: {},\r\n upload: {}\r\n };\r\n }\r\n\r\n const cache = this.cachedNetworkers[transportType][connectionType];\r\n if(!(dcId in cache)) {\r\n cache[dcId] = [];\r\n }\r\n \r\n const networkers = cache[dcId];\r\n // @ts-ignore\r\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (connectionType === 'download' ? 3 : 3);\r\n if(networkers.length >= maxNetworkers) {\r\n let i = networkers.length - 1, found = false;\r\n for(; i >= 0; --i) {\r\n if(networkers[i].isOnline) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n \r\n const networker = found ? networkers.splice(i, 1)[0] : networkers.pop();\r\n networkers.unshift(networker);\r\n return Promise.resolve(networker);\r\n }\r\n \r\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\r\n if(this.gettingNetworkers[getKey]) {\r\n return this.gettingNetworkers[getKey];\r\n }\r\n\r\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\r\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\r\n \r\n let transport = this.chooseServer(dcId, connectionType, transportType);\r\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map(key => sessionStorage.get(key)))\r\n .then(async([authKeyHex, serverSaltHex]) => {\r\n let networker: MTPNetworker, error: any;\r\n if(authKeyHex && authKeyHex.length === 512) {\r\n if(!serverSaltHex || serverSaltHex.length !== 16) {\r\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\r\n }\r\n \r\n const authKey = bytesFromHex(authKeyHex);\r\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1-hash', authKey)).slice(-8);\r\n const serverSalt = bytesFromHex(serverSaltHex);\r\n \r\n networker = networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\r\n } else {\r\n try { // if no saved state\r\n const auth = await authorizer.auth(dcId);\r\n \r\n sessionStorage.set({\r\n [ak]: bytesToHex(auth.authKey),\r\n [ss]: bytesToHex(auth.serverSalt)\r\n });\r\n \r\n networker = networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\r\n } catch(_error) {\r\n error = _error;\r\n }\r\n }\r\n\r\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\r\n const newTransportType = this.getTransportType(connectionType);\r\n if(newTransportType !== transportType) {\r\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\r\n transport.destroy();\r\n DcConfigurator.removeTransport(dcConfigurator.chosenServers, transport);\r\n\r\n if(networker) {\r\n transport = this.chooseServer(dcId, connectionType, newTransportType);\r\n }\r\n\r\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\r\n }\r\n\r\n /* networker.onConnectionStatusChange = (online) => {\r\n console.log('status:', online);\r\n }; */\r\n \r\n delete this.gettingNetworkers[getKey];\r\n\r\n if(error) {\r\n this.log('get networker error', error, (error as Error).stack);\r\n throw error;\r\n }\r\n\r\n networker.changeTransport(transport);\r\n networkers.unshift(networker);\r\n this.setOnDrainIfNeeded(networker);\r\n return networker;\r\n });\r\n }\r\n\r\n public setOnDrainIfNeeded(networker: MTPNetworker) {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n const checkPromise: Promise = networker.isFileNetworker ? \r\n Promise.resolve(true) : \r\n this.getBaseDcId().then(baseDcId => networker.dcId !== baseDcId);\r\n checkPromise.then(canRelease => {\r\n if(networker.onDrain) {\r\n return;\r\n }\r\n \r\n if(canRelease) {\r\n networker.onDrain = () => {\r\n this.log('networker drain', networker.dcId);\r\n\r\n networker.onDrain = undefined;\r\n networker.destroy();\r\n networkerFactory.removeNetworker(networker);\r\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\r\n };\r\n\r\n networker.setDrainTimeout();\r\n }\r\n });\r\n }\r\n \r\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\r\n ///////this.log('Invoke api', method, params, options);\r\n\r\n /* if(!this.lol) {\r\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\r\n this.lol = true;\r\n } */\r\n\r\n const deferred = deferredPromise();\r\n\r\n let {afterMessageId, prepareTempMessageId} = options;\r\n if(prepareTempMessageId) {\r\n deferred.then(() => {\r\n delete this.afterMessageTempIds[prepareTempMessageId];\r\n });\r\n }\r\n\r\n if(MOUNT_CLASS_TO) {\r\n const startTime = Date.now();\r\n const interval = ctx.setInterval(() => {\r\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\r\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\r\n }\r\n //this.cachedUploadNetworkers[2].requestMessageStatus();\r\n }, 5e3);\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearInterval(interval);\r\n });\r\n }\r\n\r\n const rejectPromise = (error: ApiError) => {\r\n if(!error) {\r\n error = {type: 'ERROR_EMPTY'};\r\n } else if(!isObject(error)) {\r\n error = {message: error};\r\n }\r\n \r\n deferred.reject(error);\r\n\r\n if((error.code === 401 && error.type === 'SESSION_REVOKED') || \r\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\r\n this.logOut();\r\n }\r\n\r\n if(options.ignoreErrors) {\r\n return;\r\n }\r\n \r\n if(error.code === 406) {\r\n error.handled = true;\r\n }\r\n \r\n if(!options.noErrorBox) {\r\n error.input = method;\r\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\r\n setTimeout(() => {\r\n if(!error.handled) {\r\n if(error.code === 401) {\r\n this.logOut();\r\n } else {\r\n // ErrorService.show({error: error}); // WARNING\r\n }\r\n \r\n error.handled = true;\r\n }\r\n }, 100);\r\n }\r\n };\r\n \r\n let dcId: DcId;\r\n \r\n let cachedNetworker: MTPNetworker;\r\n let stack = (new Error()).stack || 'empty stack';\r\n const performRequest = (networker: MTPNetworker) => {\r\n if(afterMessageId) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n if(after) {\r\n options.afterMessageId = after.messageId;\r\n }\r\n }\r\n\r\n const promise = (cachedNetworker = networker).wrapApiCall(method, params, options);\r\n\r\n if(prepareTempMessageId) {\r\n this.afterMessageTempIds[prepareTempMessageId] = {\r\n messageId: (options as MTMessage).messageId,\r\n promise: deferred\r\n };\r\n }\r\n\r\n return promise.then(deferred.resolve, (error: ApiError) => {\r\n //if(!options.ignoreErrors) {\r\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\r\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\r\n }\r\n \r\n if(error.code === 401 && this.baseDcId === dcId) {\r\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\r\n sessionStorage.delete('dc')\r\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\r\n //this.telegramMeNotify(false);\r\n }\r\n \r\n rejectPromise(error);\r\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\r\n if(this.cachedExportPromise[dcId] === undefined) {\r\n const promise = new Promise((exportResolve, exportReject) => {\r\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\r\n this.invokeApi('auth.importAuthorization', {\r\n id: exportedAuth.id,\r\n bytes: exportedAuth.bytes\r\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\r\n }, exportReject);\r\n });\r\n \r\n this.cachedExportPromise[dcId] = promise;\r\n }\r\n \r\n this.cachedExportPromise[dcId].then(() => {\r\n //(cachedNetworker = networker).wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n this.invokeApi(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else if(error.code === 303) {\r\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n if(options.dcId) {\r\n options.dcId = newDcId;\r\n } else {\r\n this.setBaseDcId(newDcId);\r\n }\r\n \r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n }\r\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\r\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\r\n if(newDcId !== dcId) {\r\n this.getNetworker(newDcId, options).then((networker) => {\r\n networker.wrapApiCall(method, params, options).then(deferred.resolve, rejectPromise);\r\n }, rejectPromise);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n } else if(!options.rawError && error.code === 420) {\r\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\r\n \r\n if(waitTime > (options.floodMaxTimeout !== undefined ? options.floodMaxTimeout : 60) && !options.prepareTempMessageId) {\r\n return rejectPromise(error);\r\n }\r\n \r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, waitTime/* (waitTime + 5) */ * 1000); // 03.02.2020\r\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\r\n const after = this.afterMessageTempIds[afterMessageId];\r\n\r\n afterMessageId = undefined;\r\n delete options.afterMessageId;\r\n\r\n if(after) after.promise.then(() => performRequest(cachedNetworker));\r\n else performRequest(cachedNetworker);\r\n } else if(!options.rawError && error.code === 500) {\r\n const now = Date.now();\r\n if(options.stopTime) {\r\n if(now >= options.stopTime) {\r\n return rejectPromise(error);\r\n }\r\n }\r\n \r\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, options.waitTime * 1000);\r\n } else if(error.type === 'UNKNOWN') {\r\n setTimeout(() => {\r\n performRequest(cachedNetworker);\r\n }, 1000);\r\n } else {\r\n rejectPromise(error);\r\n }\r\n });\r\n }\r\n \r\n if(dcId = (options.dcId || this.baseDcId)) {\r\n this.getNetworker(dcId, options).then(performRequest, rejectPromise);\r\n } else {\r\n this.getBaseDcId().then(baseDcId => {\r\n this.getNetworker(dcId = baseDcId, options).then(performRequest, rejectPromise);\r\n });\r\n }\r\n\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiManager = new ApiManager();\r\nMOUNT_CLASS_TO.apiManager = apiManager;\r\nexport default apiManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { blobConstruct, readBlobAsUint8Array } from \"../helpers/blob\";\r\n\r\nexport class FileManager {\r\n public blobSupported = true;\r\n \r\n constructor() {\r\n try {\r\n blobConstruct([], '');\r\n } catch(e) {\r\n this.blobSupported = false;\r\n }\r\n }\r\n \r\n public isAvailable() {\r\n return this.blobSupported;\r\n }\r\n \r\n public write(fileWriter: ReturnType, bytes: Uint8Array | Blob | string): Promise {\r\n if(bytes instanceof Blob) { // is file bytes\r\n return readBlobAsUint8Array(bytes).then(arr => {\r\n return fileWriter.write(arr);\r\n });\r\n } else {\r\n return fileWriter.write(bytes);\r\n }\r\n }\r\n\r\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise) {\r\n const blobParts: Array = [];\r\n const fakeFileWriter = {\r\n write: async(part: Uint8Array | string) => {\r\n if(!this.blobSupported) {\r\n throw false;\r\n }\r\n \r\n blobParts.push(part);\r\n },\r\n truncate: () => {\r\n blobParts.length = 0;\r\n },\r\n finalize: (saveToStorage = true) => {\r\n const blob = blobConstruct(blobParts, mimeType);\r\n\r\n if(saveToStorage && saveFileCallback) {\r\n saveFileCallback(blob);\r\n }\r\n \r\n return blob;\r\n }\r\n };\r\n \r\n return fakeFileWriter;\r\n }\r\n}\r\n\r\nexport default new FileManager();\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Modes from '../config/modes';\r\nimport { blobConstruct } from '../helpers/blob';\r\nimport FileManager from './filemanager';\r\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\r\n//import { logger } from './polyfill';\r\n\r\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\r\n\r\nexport default class CacheStorageController {\r\n private static STORAGES: CacheStorageController[] = [];\r\n private openDbPromise: Promise;\r\n\r\n private useStorage = true;\r\n\r\n //private log: ReturnType = logger('CS');\r\n\r\n constructor(private dbName: CacheStorageDbName) {\r\n if(Modes.test) {\r\n this.dbName += '_test';\r\n }\r\n\r\n if(CacheStorageController.STORAGES.length) {\r\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\r\n }\r\n \r\n this.openDatabase();\r\n CacheStorageController.STORAGES.push(this);\r\n }\r\n\r\n private openDatabase(): Promise {\r\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\r\n }\r\n\r\n public delete(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\r\n }\r\n\r\n public deleteAll() {\r\n return caches.delete(this.dbName);\r\n }\r\n\r\n public get(entryName: string) {\r\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\r\n }\r\n\r\n public save(entryName: string, response: Response) {\r\n // return new Promise((resolve) => {}); // DEBUG\r\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\r\n }\r\n\r\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\r\n /* if(method === 'blob') {\r\n return Promise.reject();\r\n } */\r\n\r\n // const str = `get fileName: ${fileName}`;\r\n // console.time(str);\r\n return this.get(fileName).then((response) => {\r\n if(!response) {\r\n //console.warn('getFile:', response, fileName);\r\n throw 'NO_ENTRY_FOUND';\r\n }\r\n\r\n const promise = response[method]();\r\n // promise.then(() => {\r\n // console.timeEnd(str);\r\n // });\r\n return promise;\r\n });\r\n }\r\n\r\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\r\n //return Promise.resolve(blobConstruct([blob]));\r\n if(!(blob instanceof Blob)) {\r\n blob = blobConstruct(blob) as Blob;\r\n }\r\n\r\n const response = new Response(blob, {\r\n headers: {\r\n 'Content-Length': '' + blob.size\r\n }\r\n });\r\n \r\n return this.save(fileName, response).then(() => blob as Blob);\r\n }\r\n\r\n public timeoutOperation(callback: (cache: Cache) => Promise) {\r\n if(!this.useStorage) {\r\n return Promise.reject('STORAGE_OFFLINE');\r\n }\r\n\r\n return new Promise(async(resolve, reject) => {\r\n let rejected = false;\r\n const timeout = setTimeout(() => {\r\n reject();\r\n //console.warn('CACHESTORAGE TIMEOUT');\r\n rejected = true;\r\n }, 15e3);\r\n\r\n try {\r\n const cache = await this.openDatabase();\r\n if(!cache) {\r\n this.useStorage = false;\r\n this.openDbPromise = undefined;\r\n throw 'no cache?';\r\n }\r\n\r\n const res = await callback(cache);\r\n\r\n if(rejected) return;\r\n resolve(res);\r\n } catch(err) {\r\n reject(err);\r\n }\r\n\r\n clearTimeout(timeout);\r\n });\r\n }\r\n\r\n public getFileWriter(fileName: string, mimeType: string) {\r\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\r\n return this.saveFile(fileName, blob).catch(() => blob);\r\n });\r\n\r\n return Promise.resolve(fakeWriter);\r\n }\r\n\r\n public static toggleStorage(enabled: boolean) {\r\n return Promise.all(this.STORAGES.map(storage => {\r\n storage.useStorage = enabled;\r\n \r\n if(!enabled) {\r\n return storage.deleteAll();\r\n }\r\n }));\r\n }\r\n}\r\n\r\n//const cacheStorage = new CacheStorageController(); \r\n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\r\n//export default cacheStorage;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov \r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport type { ReferenceBytes } from \"./referenceDatabase\";\r\nimport { MOUNT_CLASS_TO } from \"../../config/debug\";\r\nimport Modes from \"../../config/modes\";\r\nimport { readBlobAsArrayBuffer } from \"../../helpers/blob\";\r\nimport { CancellablePromise, deferredPromise } from \"../../helpers/cancellablePromise\";\r\nimport { notifyAll, notifySomeone } from \"../../helpers/context\";\r\nimport { getFileNameByLocation } from \"../../helpers/fileName\";\r\nimport { randomLong } from \"../../helpers/random\";\r\nimport { InputFile, InputFileLocation, InputWebFileLocation, UploadFile, UploadWebFile } from \"../../layer\";\r\nimport { DcId, WorkerTaskVoidTemplate } from \"../../types\";\r\nimport CacheStorageController from \"../cacheStorage\";\r\nimport cryptoWorker from \"../crypto/cryptoworker\";\r\nimport FileManager from \"../filemanager\";\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"./apiManager\";\r\nimport { isWebpSupported } from \"./mtproto.worker\";\r\nimport { bytesToHex } from \"../../helpers/bytes\";\r\nimport assumeType from \"../../helpers/assumeType\";\r\nimport ctx from \"../../environment/ctx\";\r\nimport noop from \"../../helpers/noop\";\r\n\r\ntype Delayed = {\r\n offset: number, \r\n writeFilePromise: CancellablePromise, \r\n writeFileDeferred: CancellablePromise\r\n};\r\n\r\nexport type DownloadOptions = {\r\n dcId: DcId, \r\n location: InputFileLocation | InputWebFileLocation, \r\n size?: number,\r\n fileName?: string,\r\n mimeType?: string,\r\n limitPart?: number,\r\n queueId?: number,\r\n onlyCache?: boolean,\r\n};\r\n\r\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\r\n\r\nexport interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n};\r\n\r\nexport interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\r\n type: 'refreshReference',\r\n payload: ReferenceBytes,\r\n originalPayload: ReferenceBytes\r\n};\r\n\r\nconst MAX_FILE_SAVE_SIZE = 20e6;\r\n\r\nexport class ApiFileManager {\r\n private cacheStorage = new CacheStorageController('cachedFiles');\r\n\r\n private cachedDownloadPromises: {\r\n [fileName: string]: CancellablePromise\r\n } = {};\r\n\r\n private uploadPromises: {\r\n [fileName: string]: Set>\r\n } = {};\r\n\r\n private downloadPulls: {\r\n [dcId: string]: Array<{\r\n id: number,\r\n queueId: number,\r\n cb: () => Promise,\r\n deferred: {\r\n resolve: (...args: any[]) => void,\r\n reject: (...args: any[]) => void\r\n },\r\n activeDelta: number\r\n }>\r\n } = {};\r\n private downloadActives: {[dcId: string]: number} = {};\r\n\r\n public webpConvertPromises: {[fileName: string]: CancellablePromise} = {};\r\n public refreshReferencePromises: {\r\n [referenceHex: string]: {\r\n deferred: CancellablePromise,\r\n timeout: number\r\n }\r\n } = {};\r\n\r\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\r\n private tempId = 0;\r\n private queueId = 0;\r\n private debug = Modes.debug;\r\n\r\n constructor() {\r\n setInterval(() => { // clear old promises\r\n for(const hex in this.refreshReferencePromises) {\r\n const {deferred} = this.refreshReferencePromises[hex];\r\n if(deferred.isFulfilled || deferred.isRejected) {\r\n delete this.refreshReferencePromises[hex];\r\n }\r\n }\r\n }, 1800e3);\r\n }\r\n\r\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\r\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\r\n if(this.downloadPulls[dcId] === undefined) {\r\n this.downloadPulls[dcId] = [];\r\n this.downloadActives[dcId] = 0;\r\n }\r\n\r\n const downloadPull = this.downloadPulls[dcId];\r\n\r\n const promise = new Promise((resolve, reject) => {\r\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\r\n });\r\n\r\n setTimeout(() => {\r\n this.downloadCheck(dcId);\r\n }, 0);\r\n\r\n return promise;\r\n }\r\n\r\n private downloadCheck(dcId: string | number) {\r\n const downloadPull = this.downloadPulls[dcId];\r\n const downloadLimit = dcId === 'upload' ? 24 : 36;\r\n //const downloadLimit = Infinity;\r\n\r\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull || !downloadPull.length) {\r\n return false;\r\n }\r\n\r\n //const data = downloadPull.shift();\r\n const data = downloadPull.findAndSplice(d => d.queueId === 0) || downloadPull.findAndSplice(d => d.queueId === this.queueId) || downloadPull.shift();\r\n const activeDelta = data.activeDelta || 1;\r\n\r\n this.downloadActives[dcId] += activeDelta;\r\n \r\n data.cb()\r\n .then((result) => {\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.resolve(result);\r\n }, (error: Error) => {\r\n // @ts-ignore\r\n if(!error || !error.type || (error.type !== 'DOWNLOAD_CANCELED' && error.type !== 'UPLOAD_CANCELED')) {\r\n this.log.error('downloadCheck error:', error);\r\n }\r\n\r\n this.downloadActives[dcId] -= activeDelta;\r\n this.downloadCheck(dcId);\r\n\r\n data.deferred.reject(error);\r\n });\r\n }\r\n\r\n public setQueueId(queueId: number) {\r\n //this.log.error('setQueueId', queueId);\r\n this.queueId = queueId;\r\n }\r\n\r\n private getFileStorage() {\r\n return this.cacheStorage;\r\n }\r\n\r\n public cancelDownload(fileName: string) {\r\n const promises = (this.cachedDownloadPromises[fileName] ? [this.cachedDownloadPromises[fileName]] : undefined) || \r\n (this.uploadPromises[fileName] ? Array.from(this.uploadPromises[fileName]) : []);\r\n let canceled = false;\r\n for(let i = 0, length = promises.length; i < length; ++i) {\r\n const promise = promises[i];\r\n if(promise && !promise.isRejected && !promise.isFulfilled) {\r\n promise.cancel();\r\n canceled = true;\r\n }\r\n }\r\n\r\n return canceled;\r\n }\r\n\r\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n return apiManager.invokeApi('upload.getWebFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n });\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n public requestFilePart(dcId: DcId, location: InputFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\r\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\r\n checkCancel && checkCancel();\r\n\r\n const invoke = async(): Promise => {\r\n checkCancel && checkCancel(); // do not remove async, because checkCancel will throw an error\r\n\r\n const promise = apiManager.invokeApi('upload.getFile', {\r\n location,\r\n offset,\r\n limit\r\n }, {\r\n dcId,\r\n fileDownload: true\r\n }) as Promise;\r\n\r\n return promise.catch((err) => {\r\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n\r\n throw err;\r\n });\r\n };\r\n\r\n assumeType(location);\r\n const reference = location.file_reference;\r\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\r\n location.checkedReference = true;\r\n const hex = bytesToHex(reference);\r\n if(this.refreshReferencePromises[hex]) {\r\n return this.refreshReference(location).then(invoke);\r\n }\r\n }\r\n\r\n return invoke();\r\n }, this.getDelta(limit), queueId);\r\n }\r\n\r\n /* private convertBlobToBytes(blob: Blob) {\r\n return blob.arrayBuffer().then(buffer => new Uint8Array(buffer));\r\n } */\r\n\r\n private getDelta(bytes: number) {\r\n return bytes / 1024 / 128;\r\n }\r\n\r\n private getLimitPart(size: number): number {\r\n let bytes: number;\r\n\r\n bytes = 512;\r\n /* if(size < 1e6 || !size) bytes = 512;\r\n else if(size < 3e6) bytes = 256;\r\n else bytes = 128; */\r\n\r\n return bytes * 1024;\r\n }\r\n\r\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\r\n //this.log('uncompressTGS', bytes, bytes.slice().buffer);\r\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\r\n return cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, true) as Promise;\r\n };\r\n\r\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\r\n const convertPromise = deferredPromise();\r\n\r\n const task = {type: 'convertWebp', payload: {fileName, bytes}};\r\n notifySomeone(task);\r\n return this.webpConvertPromises[fileName] = convertPromise;\r\n };\r\n\r\n private refreshReference(inputFileLocation: InputFileLocation) {\r\n const reference = (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference;\r\n const hex = bytesToHex(reference);\r\n\r\n let r = this.refreshReferencePromises[hex];\r\n if(!r) {\r\n const deferred = deferredPromise();\r\n\r\n r = this.refreshReferencePromises[hex] = {\r\n deferred,\r\n timeout: ctx.setTimeout(() => {\r\n this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\r\n deferred.reject('REFERENCE_IS_NOT_REFRESHED');\r\n }, 60000)\r\n };\r\n\r\n deferred.catch(noop).finally(() => {\r\n clearTimeout(r.timeout);\r\n });\r\n\r\n const task = {type: 'refreshReference', payload: reference};\r\n notifySomeone(task);\r\n }\r\n\r\n // have to replace file_reference in any way, because location can be different everytime if it's stream\r\n return r.deferred.then(reference => {\r\n if(hex === bytesToHex(reference)) {\r\n throw 'REFERENCE_IS_NOT_REFRESHED';\r\n }\r\n\r\n (inputFileLocation as InputFileLocation.inputDocumentFileLocation).file_reference = reference;\r\n });\r\n }\r\n\r\n public downloadFile(options: DownloadOptions): CancellablePromise {\r\n if(!FileManager.isAvailable()) {\r\n return Promise.reject({type: 'BROWSER_BLOB_NOT_SUPPORTED'});\r\n }\r\n\r\n const size = options.size ?? 0;\r\n const {dcId, location} = options;\r\n\r\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\r\n\r\n if(options.mimeType === 'image/webp' && !isWebpSupported()) {\r\n process = this.convertWebp;\r\n options.mimeType = 'image/png';\r\n } else if(options.mimeType === 'application/x-tgsticker') {\r\n process = this.uncompressTGS;\r\n options.mimeType = 'application/json';\r\n }\r\n\r\n const fileName = getFileNameByLocation(location, {fileName: options.fileName});\r\n const cachedPromise = this.cachedDownloadPromises[fileName];\r\n const fileStorage = this.getFileStorage();\r\n\r\n this.debug && this.log('downloadFile', fileName, size, location, options.mimeType);\r\n\r\n /* if(options.queueId) {\r\n this.log.error('downloadFile queueId:', fileName, options.queueId);\r\n } */\r\n\r\n if(cachedPromise) {\r\n //this.log('downloadFile cachedPromise');\r\n\r\n if(size) {\r\n return cachedPromise.then((blob: Blob) => {\r\n if(blob.size < size) {\r\n this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\r\n\r\n return this.deleteFile(fileName).then(() => {\r\n return this.downloadFile(options);\r\n }).catch(() => {\r\n return this.downloadFile(options);\r\n });\r\n } else {\r\n return blob;\r\n }\r\n });\r\n } else {\r\n return cachedPromise;\r\n }\r\n }\r\n\r\n const deferred = deferredPromise();\r\n const mimeType = options.mimeType || 'image/jpeg';\r\n\r\n let error: Error;\r\n let resolved = false;\r\n let cacheFileWriter: ReturnType;\r\n let errorHandler = (_error: Error) => {\r\n error = _error;\r\n delete this.cachedDownloadPromises[fileName];\r\n deferred.reject(error);\r\n errorHandler = () => {};\r\n\r\n if(cacheFileWriter && (!error || error.type !== 'DOWNLOAD_CANCELED')) {\r\n cacheFileWriter.truncate();\r\n }\r\n };\r\n\r\n const id = this.tempId++;\r\n\r\n fileStorage.getFile(fileName).then(async(blob: Blob) => {\r\n //this.log('maybe cached', fileName);\r\n //throw '';\r\n\r\n if(blob.size < size) {\r\n //this.log('downloadFile need to deleteFile 2, wrong size:', blob.size, size);\r\n await this.deleteFile(fileName);\r\n throw false;\r\n }\r\n\r\n deferred.resolve(blob);\r\n }).catch(() => {\r\n //this.log('not cached', fileName);\r\n const fileWriterPromise = fileStorage.getFileWriter(fileName, mimeType);\r\n\r\n fileWriterPromise.then((fileWriter) => {\r\n cacheFileWriter = fileWriter;\r\n const limit = options.limitPart || this.getLimitPart(size);\r\n let offset: number;\r\n let startOffset = 0;\r\n let writeFilePromise: CancellablePromise = Promise.resolve(),\r\n writeFileDeferred: CancellablePromise;\r\n //const maxRequests = 13107200 / limit; // * 100 Mb speed\r\n const maxRequests = Infinity;\r\n\r\n //console.error('maxRequests', maxRequests);\r\n\r\n const processDownloaded = async(bytes: Uint8Array, offset: number) => {\r\n if(process) {\r\n //const perf = performance.now();\r\n const processed = await process(bytes, fileName);\r\n //this.log('downloadFile process downloaded time', performance.now() - perf, mimeType, process);\r\n return processed;\r\n }\r\n \r\n return bytes;\r\n };\r\n\r\n const r = location._ === 'inputWebFileLocation' ? this.requestWebFilePart.bind(this) : this.requestFilePart.bind(this);\r\n\r\n const delayed: Delayed[] = [];\r\n offset = startOffset;\r\n do {\r\n ////this.log('offset:', startOffset);\r\n writeFileDeferred = deferredPromise();\r\n delayed.push({offset, writeFilePromise, writeFileDeferred});\r\n writeFilePromise = writeFileDeferred;\r\n offset += limit;\r\n } while(offset < size);\r\n\r\n let done = 0;\r\n const superpuper = async() => {\r\n //if(!delayed.length) return;\r\n\r\n const {offset, writeFilePromise, writeFileDeferred} = delayed.shift();\r\n try {\r\n checkCancel();\r\n\r\n // @ts-ignore\r\n const result = await r(dcId, location as any, offset, limit, id, options.queueId, checkCancel);\r\n\r\n const bytes = result.bytes;\r\n\r\n if(delayed.length) {\r\n superpuper();\r\n }\r\n\r\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\r\n const isFinal = offset + limit >= size || !bytes.byteLength;\r\n if(bytes.byteLength) {\r\n //done += limit;\r\n done += bytes.byteLength;\r\n\r\n //if(!isFinal) {\r\n ////this.log('deferred notify 2:', {done: offset + limit, total: size}, deferred);\r\n deferred.notify({done, offset, total: size});\r\n //}\r\n\r\n const processedResult = await processDownloaded(bytes, offset);\r\n checkCancel();\r\n\r\n await writeFilePromise;\r\n checkCancel();\r\n\r\n await FileManager.write(fileWriter, processedResult);\r\n }\r\n\r\n writeFileDeferred.resolve();\r\n\r\n if(isFinal) {\r\n resolved = true;\r\n\r\n deferred.resolve(fileWriter.finalize(size < MAX_FILE_SAVE_SIZE));\r\n }\r\n } catch(err) {\r\n errorHandler(err as Error);\r\n }\r\n };\r\n\r\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\r\n superpuper();\r\n }\r\n }).catch((err) => {\r\n if(!['STORAGE_OFFLINE'].includes(err)) {\r\n this.log.error('saveFile error:', err);\r\n }\r\n });\r\n });\r\n\r\n const checkCancel = () => {\r\n if(error) {\r\n throw error;\r\n }\r\n };\r\n\r\n deferred.cancel = () => {\r\n if(!error && !resolved) {\r\n const error = new Error('Canceled');\r\n error.type = 'DOWNLOAD_CANCELED';\r\n errorHandler(error);\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number, offset: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n this.cachedDownloadPromises[fileName] = deferred;\r\n\r\n deferred.safeFinally(() => {\r\n delete this.cachedDownloadPromises[fileName];\r\n });\r\n\r\n return deferred;\r\n }\r\n\r\n private deleteFile(fileName: string) {\r\n //this.log('will delete file:', fileName);\r\n delete this.cachedDownloadPromises[fileName];\r\n return this.getFileStorage().delete(fileName);\r\n }\r\n\r\n public uploadFile({file, fileName}: {file: Blob | File, fileName: string}) {\r\n const fileSize = file.size, \r\n isBigFile = fileSize >= 10485760;\r\n\r\n let canceled = false,\r\n resolved = false,\r\n doneParts = 0,\r\n partSize = 262144; // 256 Kb\r\n\r\n /* if(fileSize > (524288 * 3000)) {\r\n partSize = 1024 * 1024;\r\n activeDelta = 8;\r\n } else */if(fileSize > 67108864) {\r\n partSize = 524288;\r\n } else if(fileSize < 102400) {\r\n partSize = 32768;\r\n }\r\n\r\n const activeDelta = this.getDelta(partSize);\r\n\r\n const totalParts = Math.ceil(fileSize / partSize);\r\n const fileId = randomLong();\r\n\r\n let _part = 0;\r\n\r\n const resultInputFile: InputFile = {\r\n _: isBigFile ? 'inputFileBig' : 'inputFile',\r\n id: fileId as any,\r\n parts: totalParts,\r\n name: fileName,\r\n md5_checksum: ''\r\n };\r\n\r\n const deferredHelper: {\r\n resolve?: (input: typeof resultInputFile) => void,\r\n reject?: (error: any) => void,\r\n notify?: (details: {done: number, total: number}) => void\r\n } = {\r\n notify: (details: {done: number, total: number}) => {}\r\n };\r\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\r\n if(totalParts > 4000) {\r\n return reject({type: 'FILE_TOO_BIG'});\r\n }\r\n\r\n deferredHelper.resolve = resolve;\r\n deferredHelper.reject = reject;\r\n });\r\n Object.assign(deferred, deferredHelper);\r\n\r\n if(totalParts > 4000) {\r\n return deferred;\r\n }\r\n \r\n let errorHandler = (error: any) => {\r\n if(error?.type !== 'UPLOAD_CANCELED') {\r\n this.log.error('Up Error', error);\r\n }\r\n\r\n deferred.reject(error);\r\n canceled = true;\r\n errorHandler = () => {};\r\n };\r\n\r\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\r\n\r\n const id = this.tempId++;\r\n\r\n /* setInterval(() => {\r\n console.log(file);\r\n }, 1e3); */\r\n\r\n const self = this;\r\n function* generator() {\r\n for(let offset = 0; offset < fileSize; offset += partSize) {\r\n const part = _part++; // 0, 1\r\n yield self.downloadRequest('upload', id, () => {\r\n const blob = file.slice(offset, offset + partSize);\r\n\r\n return readBlobAsArrayBuffer(blob).then(buffer => {\r\n if(canceled) {\r\n throw {type: 'UPLOAD_CANCELED'};\r\n }\r\n\r\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\r\n\r\n /* const u = new Uint8Array(buffer.byteLength);\r\n for(let i = 0; i < u.length; ++i) {\r\n //u[i] = Math.random() * 255 | 0;\r\n u[i] = 0;\r\n }\r\n buffer = u.buffer; */\r\n \r\n /* setTimeout(() => {\r\n doneParts++;\r\n uploadResolve();\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n\r\n self.log('done part', part, doneParts);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, 1250);\r\n return; */\r\n\r\n return apiManager.invokeApi(method, {\r\n file_id: fileId,\r\n file_part: part,\r\n file_total_parts: totalParts,\r\n bytes: buffer/* new Uint8Array(buffer) */\r\n } as any, {\r\n //startMaxLength: partSize + 256,\r\n fileUpload: true\r\n }).then((result) => {\r\n doneParts++;\r\n \r\n //////this.log('Progress', doneParts * partSize / fileSize);\r\n \r\n deferred.notify({done: doneParts * partSize, total: fileSize});\r\n \r\n if(doneParts >= totalParts) {\r\n deferred.resolve(resultInputFile);\r\n resolved = true;\r\n }\r\n }, errorHandler);\r\n });\r\n }, activeDelta).catch(errorHandler);\r\n }\r\n }\r\n\r\n const it = generator();\r\n const process = () => {\r\n if(canceled) return;\r\n const r = it.next();\r\n if(r.done || canceled) return;\r\n (r.value as Promise).then(process);\r\n };\r\n\r\n const maxRequests = Infinity;\r\n //const maxRequests = 10;\r\n /* for(let i = 0; i < 10; ++i) {\r\n process();\r\n } */\r\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\r\n process();\r\n }\r\n\r\n deferred.cancel = () => {\r\n //this.log('cancel upload', canceled, resolved);\r\n if(!canceled && !resolved) {\r\n canceled = true;\r\n errorHandler({type: 'UPLOAD_CANCELED'});\r\n }\r\n };\r\n\r\n deferred.notify = (progress: {done: number, total: number}) => {\r\n notifyAll({progress: {fileName, ...progress}});\r\n };\r\n\r\n deferred.finally(() => {\r\n set.delete(deferred);\r\n if(!set.size) {\r\n delete this.uploadPromises[fileName];\r\n }\r\n });\r\n\r\n const set = this.uploadPromises[fileName] ?? (this.uploadPromises[fileName] = new Set());\r\n set.add(deferred);\r\n return deferred;\r\n }\r\n}\r\n\r\nconst apiFileManager = new ApiFileManager();\r\nMOUNT_CLASS_TO.apiFileManager = apiFileManager;\r\nexport default apiFileManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport type { InputFileLocation, InputStickerSet, InputWebFileLocation } from \"../layer\";\r\nimport type { DownloadOptions } from \"../lib/mtproto/apiFileManager\";\r\n\r\nconst FILENAME_JOINER = '_';\r\n\r\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\r\n fileName: string\r\n}>) {\r\n const fileName = '';//(options?.fileName || '').split('.');\r\n const ext = fileName[fileName.length - 1] || '';\r\n\r\n let str: string;\r\n switch(location._) {\r\n case 'inputPhotoFileLocation': {\r\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputDocumentFileLocation': {\r\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputPeerPhotoFileLocation':\r\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\r\n break;\r\n \r\n case 'inputStickerSetThumb': {\r\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id || \r\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name || \r\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon || \r\n location.stickerset._;\r\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n case 'inputFileLocation': {\r\n str = location.volume_id + '_' + location.local_id;\r\n break;\r\n }\r\n\r\n case 'inputWebFileLocation': {\r\n str = ['webFile', location.url].join(FILENAME_JOINER);\r\n break;\r\n }\r\n\r\n default: {\r\n console.error('Unrecognized location:', location);\r\n str = '';\r\n break;\r\n }\r\n }\r\n\r\n return str + (ext ? '.' + ext : ext);\r\n}\r\n\r\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\r\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\r\n //console.log('getFileURL', location);\r\n //const perf = performance.now();\r\n const encoded = encodeURIComponent(JSON.stringify(options));\r\n //console.log('getFileURL encode:', performance.now() - perf, encoded);\r\n\r\n return '/' + type + '/' + encoded;\r\n}\r\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\n\nimport type { LocalStorageProxyTask } from '../localStorage';\nimport type { WebpConvertTask } from '../webp/webpWorkerController';\nimport type { ToggleStorageTask } from './mtprotoworker';\nimport type { RefreshReferenceTaskResponse } from './apiFileManager';\nimport apiManager from \"./apiManager\";\nimport cryptoWorker from \"../crypto/cryptoworker\";\nimport networkerFactory from \"./networkerFactory\";\nimport apiFileManager from './apiFileManager';\nimport { notifyAll } from '../../helpers/context';\nimport CacheStorageController from '../cacheStorage';\nimport sessionStorage from '../sessionStorage';\nimport { socketsProxied } from './transports/socketProxied';\nimport { bytesToHex } from '../../helpers/bytes';\nimport ctx from '../../environment/ctx';\n\nlet webpSupported = false;\nexport const isWebpSupported = () => {\n return webpSupported;\n};\n\nnetworkerFactory.setUpdatesProcessor((obj) => {\n notifyAll({update: obj});\n});\n\nnetworkerFactory.onConnectionStatusChange = (status) => {\n notifyAll({type: 'connectionStatusChange', payload: status});\n};\n\nconst taskListeners = {\n convertWebp: (task: WebpConvertTask) => {\n const {fileName, bytes} = task.payload;\n const deferred = apiFileManager.webpConvertPromises[fileName];\n if(deferred) {\n deferred.resolve(bytes);\n delete apiFileManager.webpConvertPromises[fileName];\n }\n },\n\n webpSupport: (task: any) => {\n webpSupported = task.payload;\n },\n\n socketProxy: (task: any) => {\n const socketTask = task.payload;\n const id = socketTask.id;\n \n const socketProxied = socketsProxied.get(id);\n if(socketTask.type === 'message') {\n socketProxied.dispatchEvent('message', socketTask.payload);\n } else if(socketTask.type === 'open') {\n socketProxied.dispatchEvent('open');\n } else if(socketTask.type === 'close') {\n socketProxied.dispatchEvent('close');\n socketsProxied.delete(id);\n }\n },\n\n localStorageProxy: (task: LocalStorageProxyTask) => {\n sessionStorage.finishTask(task.id, task.payload);\n },\n\n userAgent: (task: any) => {\n networkerFactory.userAgent = task.payload;\n },\n\n online: () => {\n networkerFactory.forceReconnectTimeout();\n },\n\n forceReconnect: () => {\n networkerFactory.forceReconnect();\n },\n\n toggleStorage: (task: ToggleStorageTask) => {\n const enabled = task.payload;\n // AppStorage.toggleStorage(enabled);\n CacheStorageController.toggleStorage(enabled);\n },\n\n refreshReference: (task: RefreshReferenceTaskResponse) => {\n const hex = bytesToHex(task.originalPayload);\n const r = apiFileManager.refreshReferencePromises[hex];\n const deferred = r?.deferred;\n if(deferred) {\n if(task.error) {\n deferred.reject(task.error);\n } else {\n deferred.resolve(task.payload);\n }\n }\n },\n\n crypto: (task: any) => {\n cryptoWorker.invokeCrypto(task.task, ...task.args as any).then(result => {\n notifyAll({taskId: task.taskId, result});\n });\n }\n};\n\nconst onMessage = async(e: any) => {\n try {\n const task: {\n task: string,\n taskId: number,\n args: any[],\n type?: string\n } = e.data;\n const taskId = task.taskId;\n\n // @ts-ignore\n const f = taskListeners[task.type];\n if(f) {\n f(task);\n return;\n }\n\n if(!task.task) {\n return;\n }\n\n switch(task.task) {\n case 'requestFilePart':\n case 'setQueueId':\n case 'cancelDownload':\n case 'uploadFile':\n case 'downloadFile': {\n try {\n // @ts-ignore\n let result: any = apiFileManager[task.task].apply(apiFileManager, task.args);\n \n if(result instanceof Promise) {\n /* (result as ReturnType).notify = (progress: {done: number, total: number, offset: number}) => {\n notify({progress: {fileName, ...progress}});\n }; */\n result = await result;\n }\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n\n break;\n }\n\n case 'getNetworker': {\n // @ts-ignore\n apiManager[task.task].apply(apiManager, task.args).finally(() => {\n notifyAll({taskId, result: null});\n });\n \n break;\n }\n\n case 'setLanguage':\n case 'startAll':\n case 'stopAll': {\n // @ts-ignore\n networkerFactory[task.task].apply(networkerFactory, task.args);\n break;\n }\n \n default: {\n try {\n // @ts-ignore\n let result = apiManager[task.task].apply(apiManager, task.args);\n \n if(result instanceof Promise) {\n result = await result;\n }\n\n //console.log(notifyAll);\n \n notifyAll({taskId, result});\n } catch(error) {\n notifyAll({taskId, error});\n }\n \n //throw new Error('Unknown task: ' + task.task);\n break;\n }\n }\n } catch(err) {\n console.error('worker task error:', err);\n }\n};\n\n//console.log('[WORKER] Will send ready', Date.now() / 1000);\nctx.addEventListener('message', onMessage);\nnotifyAll('ready');\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/sw.js b/public/sw.js index 59e2a6bfb..3bdba9903 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,4 +1,4 @@ -var serviceWorkerOption = {"assets":["/0.374e7aee7f00ae75e442.chunk.js","/1.492b807a01f9ca3e3cf5.chunk.js","/12.88ffeed61735d3f9b2f9.chunk.js","/13.20324e79c22f5893ae52.chunk.js","/14.6aa9cb644edbb8b0e00a.chunk.js","/15.e99c07b61f679564532a.chunk.js","/16.1fd991b3cf3f32baf9f1.chunk.js","/17.5fb0ac85d824e4640fa2.chunk.js","/18.25e70e3100f53609fdd3.chunk.js","/19.5ca6388c23a93b466714.chunk.js","/2.db718300c1179401e843.chunk.js","/20.323657c2992748ecc90f.chunk.js","/21.144731bc9e86ebbe5f4c.chunk.js","/22.cb583e71915f8cb17b01.chunk.js","/23.29950b10ac60f39c30c8.chunk.js","/24.a6d4df44484e0cad8aaa.chunk.js","/25.92c7213c63e77acba97b.chunk.js","/26.29f2e686ad8e61e8d92e.chunk.js","/27.4dfec84fdb513eebf355.chunk.js","/28.eae42fed46df70aa5787.chunk.js","/29.fb2854d59faeefc88b14.chunk.js","/3.e4137dca352aff127912.chunk.js","/30.7626947e5c24cc51a196.chunk.js","/31.a8fac6fac9101367fb68.chunk.js","/4.24fcf63624b53b25e38a.chunk.js","/5.65a3414c4ad3195165a3.chunk.js","/6.e3732f1eca587373fceb.chunk.js","/7.d43d90e04a37000c4a72.chunk.js","/8.08583f871c38d9c5a426.chunk.js","/9.6c1df42c7f7435991f85.chunk.js","/main.057ba0ad34ac8f214638.bundle.js","/main.624478a518e31a4f8433.css","/mtproto.worker.3eb6c7b9e7cf9e47119f.bundle.worker.js","/npm.qr-code-styling.beae65199e734a6850d7.chunk.js","/rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.db1ce269f081e74b2c5a.bundle.worker.js"]}; +var serviceWorkerOption = {"assets":["/0.8d087bcb865339158351.chunk.js","/1.99b84ec019c74ae469a1.chunk.js","/12.28d471f14ee77650d243.chunk.js","/13.6f53ed67b434abfeb8b3.chunk.js","/14.e0b3ee5569e2564c790f.chunk.js","/15.b14001265d6da1e62429.chunk.js","/16.1587e222e41a6d3aa087.chunk.js","/17.5fb0ac85d824e4640fa2.chunk.js","/18.33a13d3129fb705afcd7.chunk.js","/19.577567d0b0e7b3f9570b.chunk.js","/2.53fa88cb7bccd9cf2f74.chunk.js","/20.323657c2992748ecc90f.chunk.js","/21.144731bc9e86ebbe5f4c.chunk.js","/22.cb583e71915f8cb17b01.chunk.js","/23.29950b10ac60f39c30c8.chunk.js","/24.a6d4df44484e0cad8aaa.chunk.js","/25.ba804e71a7bf44cd8cd0.chunk.js","/26.29f2e686ad8e61e8d92e.chunk.js","/27.4dfec84fdb513eebf355.chunk.js","/28.eae42fed46df70aa5787.chunk.js","/29.fb2854d59faeefc88b14.chunk.js","/3.e4137dca352aff127912.chunk.js","/30.7626947e5c24cc51a196.chunk.js","/31.a8fac6fac9101367fb68.chunk.js","/4.24fcf63624b53b25e38a.chunk.js","/5.4c631eb421e5df7ab421.chunk.js","/6.02b679f962719848ba99.chunk.js","/7.d43d90e04a37000c4a72.chunk.js","/8.f871e2581e2cce7ecaef.chunk.js","/9.6c1df42c7f7435991f85.chunk.js","/main.9c67b3d788e233efd43d.css","/main.e6c3f7635c825540f276.bundle.js","/mtproto.worker.6a2261da0654eaebdc63.bundle.worker.js","/npm.qr-code-styling.beae65199e734a6850d7.chunk.js","/rlottie.worker.2080f50ddad6e37cf084.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.db1ce269f081e74b2c5a.bundle.worker.js"]}; !function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t),n.d(t,"log",(function(){return ie})),n.d(t,"deferredPromises",(function(){return ae}));const o={test:location.search.indexOf("test=1")>0,debug:location.search.indexOf("debug=1")>0,http:!1,ssl:!0,multipleConnections:!0,asServiceWorker:!1,transport:"websocket"};o.http=location.search.indexOf("http=1")>0,o.http&&(o.transport="https");var r=o;const i=r.debug;"undefined"!=typeof window?window:self;var s=i;var a="undefined"!=typeof window?window:self;const c=navigator?navigator.userAgent:null,l=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&a.MSStream,!!("safari"in a)||!(!c||!(/\b(iPad|iPhone|iPod)\b/.test(c)||c.match("Safari")&&!c.match("Chrome")))),u=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=(navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),"undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope),d="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!h,f=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),g=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then(n=>{n.length&&n.slice(e?0:-1).forEach(e=>{e.postMessage(...t)})})},p=(...e)=>{self.postMessage(...e)},m=()=>{};h&&g.bind(null,!1),h&&g.bind(null,!0);var v;!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(v||(v={}));const w=[v.None,v.Error,v.Warn,v.Log,v.Debug],y=Date.now();function b(){return"["+((Date.now()-y)/1e3).toFixed(3)+"]"}let P;const S=l||u;P=S?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const O=!S,A=S?2:3;function _(){const e=(new Error).stack.split("\n"),t=e[A]||e[e.length-1];return"["+(P(t)||"")+"]"}const T={black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:""},x=[["debug",v.Debug],["info",v.Log],["warn",v.Warn],["error",v.Error],["assert",v.Error],["trace",v.Log]];function E(e,t=v.Log|v.Warn|v.Error,n=!1,o=""){let r;s||n||(t=v.Error),O?o||(h?o=T.yellow:d&&(o=T.cyan)):o="";let i=o;o=o?`%s ${o}%s`:"%s";const a=function(...n){return t&v.Log&&console.log(o,b(),e,_(),...n)};return x.forEach(([n,r])=>{a[n]=function(...i){return t&r&&console[n](o,b(),e,_(),...i)}}),a.setPrefix=function(t){r=t,e="["+t+"]"},a.setPrefix(e),a.setLevel=function(e){t=w.slice(0,e+1).reduce((e,t)=>e|t,0)},a.bindPrefix=function(e){return E(`${r}] [${e}`,t,n,i)},a}var j=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const k=self;function C(e){return e.ok&&200===e.status}function D(e){return Promise.race([e,(t=1e4,new Promise(e=>{setTimeout(e,t)})).then(()=>Promise.reject())]);var t}function F(e,t){return new Promise(n=>{const o=new FileReader;o.addEventListener("loadend",e=>n(e.target.result)),o[t](e)})}function R(e){return function(e){return F(e,"readAsArrayBuffer")}(e).then(e=>new Uint8Array(e))}function N(e,t=""){let n;const o=function(e){if(-1===["image/jpeg","image/png","image/gif","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","application/json","application/pdf"].indexOf(e))return"application/octet-stream";return e}(t);try{n=new Blob(e,{type:o})}catch(t){let r=new BlobBuilder;e.forEach(e=>{r.append(e)}),n=r.getBlob(o)}return n}function L(){}var M=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};var W=new class{constructor(){this.blobSupported=!0;try{N([],"")}catch(e){this.blobSupported=!1}}isAvailable(){return this.blobSupported}write(e,t){return t instanceof Blob?R(t).then(t=>e.write(t)):e.write(t)}getFakeFileWriter(e,t){const n=[];return{write:e=>M(this,void 0,void 0,(function*(){if(!this.blobSupported)throw!1;n.push(e)})),truncate:()=>{n.length=0},finalize:(o=!0)=>{const r=N(n,e);return o&&t&&t(r),r}}}},I=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};class q{constructor(e){this.dbName=e,this.useStorage=!0,r.test&&(this.dbName+="_test"),q.STORAGES.length&&(this.useStorage=q.STORAGES[0].useStorage),this.openDatabase(),q.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation(t=>t.delete("/"+e))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation(t=>t.match("/"+e))}save(e,t){return this.timeoutOperation(n=>n.put("/"+e,t))}getFile(e,t="blob"){return this.get(e).then(e=>{if(!e)throw"NO_ENTRY_FOUND";return e[t]()})}saveFile(e,t){t instanceof Blob||(t=N(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then(()=>t)}timeoutOperation(e){return this.useStorage?new Promise((t,n)=>I(this,void 0,void 0,(function*(){let o=!1;const r=setTimeout(()=>{n(),o=!0},15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(e,t){const n=W.getFakeFileWriter(t,t=>this.saveFile(e,t).catch(()=>t));return Promise.resolve(n)}static toggleStorage(e){return Promise.all(this.STORAGES.map(t=>{if(t.useStorage=e,!e)return t.deleteAll()}))}}q.STORAGES=[];var B=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const G=new q("cachedStreamChunks");setInterval(()=>G.timeoutOperation(e=>e.keys().then(t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then(n=>{if(+n.headers.get("Time-Cached")+86400<=o)return ie("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})});r.push(n)}return Promise.all(r)})),18e5),setInterval(()=>{f().then(e=>{for(const[t,n]of ae)if(!e.find(e=>e.id===t)){for(const e in n){n[e].reject()}ae.delete(t)}})},12e4);const U=new Map;class ${constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{U.delete(this.id)},this.id=$.getId(e),U.set(this.id,this),this.limitPart=e.size>78643200?V:z,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;return(...l)=>(i||(i=new Promise((e,t)=>(s=e,a=t))),r?(clearTimeout(r),c=!0,a(),i=new Promise((e,t)=>(s=e,a=t))):n&&(s(e(...l)),c=!1),r=setTimeout(()=>{!o||n&&!c||s(e(...l)),r=i=s=a=void 0,c=!1},t),i.catch(()=>{}),i)}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return B(this,void 0,void 0,(function*(){const o={type:"requestFilePart",payload:[this.info.dcId,this.info.location,e,t]},r=JSON.stringify(o);o.id=r;const i=yield f().then(e=>{if(e.length)return e.find(e=>ae.has(e.id))||e[0]});if(!i)throw new Error("no window");let s=ae.get(i.id);s||ae.set(i.id,s={});let a=s[r];if(a)return a.then(e=>e.bytes);i.postMessage(o),this.loadedOffsets.add(e),a=s[r]=function(){let e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach(e=>e(...t))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}});return t.catch(L).finally(()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=()=>{})}),Object.assign(t,e),t}();const c=a.then(e=>e.bytes);return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c}))}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return G.getFile(o).then(e=>n?new Uint8Array:R(e),e=>{})}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then(o=>o||this.requestFilePartFromWorker(e,t,n))}saveChunkToCache(e,t,n){return e.then(e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream","Time-Cached":""+(Date.now()/1e3|0)}});return G.save(o,r)})}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":""+e.byteLength};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})})}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=U.get(this.getId(e)))&&void 0!==t?t:new $(e)}static getId(e){return e.location.id}}const z=524288,V=1048576;function J(e,t=2048){return e-e%t}var K={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]};class Y{constructor(e,t){this.storageIsAvailable=!0,function(e,t){if(t)for(let n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),r.test&&(this.name+="_test"),this.storeName=t,this.log=E("IDB-"+this.storeName),this.openDatabase(!0),Y.STORAGES.push(this)}static closeDatabases(e){this.STORAGES.forEach(t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())})}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;try{var t=indexedDB.open(this.name,this.version);if(!t)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let n=!1;return setTimeout(()=>{n||t.onerror({type:"IDB_CREATE_TIMEOUT"})},3e3),this.openDbPromise=new Promise((e,o)=>{t.onsuccess=r=>{n=!0;const i=t.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},t.onerror=e=>{n=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),o(e)},t.onupgradeneeded=e=>{n=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);var t=e.target.result;this.stores.forEach(e=>{t.objectStoreNames.contains(e.name)||((e,t)=>{var n;const o=e.createObjectStore(t.name);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const e of t.indexes)o.createIndex(e.indexName,e.keyPath,e.objectParameters)})(t,e)})}})}delete(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",t=>e.map(e=>t.delete(e)),"")}clear(e){return this.getObjectStore("readwrite",e=>e.clear(),"",e)}save(e,t){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",n=>e.map((e,o)=>n.put(t[o],e)),"")}saveFile(e,t){return t instanceof Blob||(t=N([t])),this.save(e,t)}get(e){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readonly",t=>e.map(e=>t.get(e)),"")}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.openDatabase().then(i=>new Promise((s,a)=>{const c=i.transaction([o],e);c.onerror=e=>{clearTimeout(l),a(c.error)},c.oncomplete=e=>{clearTimeout(l),n&&this.log(n+": end",performance.now()-r);const t=d.map(e=>e.result);s(h?t:t[0])};const l=setTimeout(()=>{this.log.error("transaction not finished",c)},1e4),u=t(c.objectStore(o)),h=Array.isArray(u),d=h?u:[].concat(u)}))}getAll(){return this.getObjectStore("readonly",e=>e.getAll(),"")}}Y.STORAGES=[];var H=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const X=self,Q=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";const Z=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new Y(e,t)}get(e){return H(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){return H(this,void 0,void 0,(function*(){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}))}}(K,"session",{push_mute_until:0,push_last_alive:0,push_lang:{},push_settings:{}});X.addEventListener("push",e=>{const t=e.data.json();ie("push",t);let n=!1;const o=Promise.all([Z.get("push_mute_until"),Z.get("push_last_alive"),X.clients.matchAll({type:"window"})]).then(e=>{const[o,r,i]=e;if(ie("matched clients",i),n=i.length>0,n)throw"Supress notification because some instance is alive";const s=Date.now();if(re()&&o&&s{ie(e)});const r=o.then(()=>Promise.all([Z.get("push_settings"),Z.get("push_lang")])).then(e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||"");e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview||"You have a new message",a="unknown_peer");ie("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d||"Mute for 24H"}];return X.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then(e=>{var t;e&&e.notification&&(t=e.notification,te.has(t)||(te.add(t),t.onclose=ne))}).catch(e=>{ie.error("Show notification promise",e)})}(t,e[0],e[1])).catch(()=>(ie("Closing all notifications on push",n),re()||n?oe():X.registration.showNotification("Telegram",{tag:"unknown_peer"}).then(()=>{if(n)return oe();setTimeout(()=>oe(),n?0:100)}).catch(e=>{ie.error("Show notification error",e)})));e.waitUntil(r)}),X.addEventListener("notificationclick",e=>{const t=e.notification;ie("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&re())return ie("[SW] mute for 1d"),void Z.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=X.clients.matchAll({type:"window"}).then(e=>{o.action=n,ee={type:"push_click",payload:o};for(let t=0;tX.clients.openWindow(e.baseUrl||Q))}).catch(e=>{ie.error("Clients.matchAll error",e)});e.waitUntil(r)}),X.addEventListener("notificationclose",ne);let ee,te=new Set;function ne(e){var t;t=e.notification,te.delete(t)}function oe(){for(const e of te)try{e.close()}catch(e){}let e;return e="getNotifications"in X.registration?X.registration.getNotifications({}).then(e=>{for(let t=0,n=e.length;t{ie.error("Offline register SW error",e)}):Promise.resolve(),te.clear(),e}function re(){return u}const ie=E("SW",v.Error|v.Debug|v.Log|v.Warn),se=self,ae=new Map,ce={notifications_clear:()=>{oe()},ping:(e,t)=>{!function(e,t){const n=t.ports&&t.ports[0]||t.source,o=e.payload;o.localNotifications&&Z.set("push_last_alive",Date.now()),ee&&n&&"postMessage"in n&&(n.postMessage(ee,[]),ee=void 0),o.lang&&Z.set("push_lang",o.lang),o.settings&&Z.set("push_settings",o.settings)}(e,t)},requestFilePart:(e,t)=>{const n=t.source,o=ae.get(n.id);if(!o)return;const r=o[e.id];r&&(e.error?r.reject(e.error):r.resolve(e.payload),delete o[e.id])},toggleStorage:e=>{q.toggleStorage(e.payload)}};se.addEventListener("message",e=>{const t=e.data,n=ce[t.type];n&&n(t,e)});const le=e=>{if(0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return j(this,void 0,void 0,(function*(){try{const t=yield D(k.caches.open("cachedAssets")),n=yield D(t.match(e.request,{ignoreVary:!0}));if(n&&C(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(C(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),C(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}}))}(e));try{const[,t,n,o]=/http[:s]+\/\/.*?(\/(.*?)(?:$|\/(.*)$))/.exec(e.request.url)||[];switch(n){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=$.get(o);var i;e.respondWith(Promise.race([(i=45e3,new Promise(e=>{setTimeout(()=>{e(new Response("",{status:408,statusText:"Request timed out."}))},i)})),r.requestRange(n)]))}(e,o)}}catch(t){e.respondWith(new Response("",{status:500,statusText:"Internal Server Error"}))}},ue=()=>{se.onfetch=le};se.addEventListener("install",e=>{ie("installing"),e.waitUntil(se.skipWaiting())}),se.addEventListener("activate",e=>{ie("activating",se),e.waitUntil(se.caches.delete("cachedAssets")),e.waitUntil(se.clients.claim())}),se.onerror=e=>{ie.error("error:",e)},se.onunhandledrejection=e=>{ie.error("onunhandledrejection:",e)},se.onoffline=se.ononline=ue,ue()}]); //# sourceMappingURL=sw.js.map \ No newline at end of file diff --git a/public/version b/public/version new file mode 100644 index 000000000..c59bd9f7c --- /dev/null +++ b/public/version @@ -0,0 +1 @@ +1.0.4 (81) \ No newline at end of file